U8G2库移植到STM32平台上
U8G2库简介
U8g2是嵌入式设备的单色图形库,一句话简单明了。主要应用于嵌入式设备,包括我们常见的单片机;
建议先看这篇博客的介绍,写的比较好u8g2库的使用
这篇博客介绍了对于u8g2的使用,但是是针对arduino平台的,但是使用方法在stm32平台上也是大同小异。
U8G2库的下载及硬件平台
U8G2库是一个开源的github项目,通过github可以直接下载 。下载地址
此次使用的mcu是stm32f407vet6,屏幕是IIC接口的oled12864屏幕,屏幕驱动芯片是ssd1306.,使用的是cubeide进行开发。
移植到stm32
首先我们需要建立一份工程,关于工程的建立,再这里就不在赘述了,记住要初始化一个IIC,不然就没有办法驱动屏幕了。
打卡我们下载的u8g2源码,可以看到里面有许多文件夹。其他的文件夹里面都是一些说明文档,可以不用关注,注意我用红框标注的,csrc文件夹,这里面存放的都是我们所需要的源码。
打开csrc文件夹,可以看到里面有许多.c文件。注意到有许多U8x8_d_*****类型的c文件,这是针对不同的驱动芯片所写的驱动程序,我们只需要选择我们需要的就行了,其他的在移植到自己的工程的时候,可以把删除。我们此次使用的是ssd1306,因此在移植的时候,只保留ssd1306相关的驱动程序就可以了(图中画红线的部分)。
**注意:移植的时候,把不同的驱动芯片的c文件删除即可,不要删除其他的
然后将csrc文件夹下面的文件都复制到cubeide的工程中,建立好的工程如下图。
到这一步就距离成功仅有一步之遥了,接下来编写我们需要的底层函数。
编写一个oled.c和oled.h的文件
oled .c
#include "oled.h"
#include "i2c.h"uint8_t u8x8_byte_hw_i2c(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr)
{/* u8g2/u8x8 will never send more than 32 bytes between START_TRANSFER and END_TRANSFER */static uint8_t buffer[128];static uint8_t buf_idx;uint8_t *data;switch (msg){case U8X8_MSG_BYTE_INIT:{/* add your custom code to init i2c subsystem */MX_I2C1_Init(); //I2C初始化}break;case U8X8_MSG_BYTE_START_TRANSFER:{buf_idx = 0;}break;case U8X8_MSG_BYTE_SEND:{data = (uint8_t *)arg_ptr;while (arg_int > 0){buffer[buf_idx++] = *data;data++;arg_int--;}}break;case U8X8_MSG_BYTE_END_TRANSFER:{if (HAL_I2C_Master_Transmit(&hi2c1, (OLED_ADDRESS), buffer, buf_idx, 1000) != HAL_OK)return 0;}break;case U8X8_MSG_BYTE_SET_DC:break;default:return 0;}return 1;
}void delay_us(uint32_t time)
{uint32_t i = 8 * time;while (i--);
}uint8_t u8x8_gpio_and_delay(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr)
{switch (msg){case U8X8_MSG_DELAY_100NANO: // delay arg_int * 100 nano seconds__NOP();break;case U8X8_MSG_DELAY_10MICRO: // delay arg_int * 10 micro secondsfor (uint16_t n = 0; n < 320; n++){__NOP();}break;case U8X8_MSG_DELAY_MILLI: // delay arg_int * 1 milli secondHAL_Delay(1);break;case U8X8_MSG_DELAY_I2C: // arg_int is the I2C speed in 100KHz, e.g. 4 = 400 KHzdelay_us(5);break; // arg_int=1: delay by 5us, arg_int = 4: delay by 1.25uscase U8X8_MSG_GPIO_I2C_CLOCK: // arg_int=0: Output low at I2C clock pinbreak; // arg_int=1: Input dir with pullup high for I2C clock pincase U8X8_MSG_GPIO_I2C_DATA: // arg_int=0: Output low at I2C data pinbreak; // arg_int=1: Input dir with pullup high for I2C data pincase U8X8_MSG_GPIO_MENU_SELECT:u8x8_SetGPIOResult(u8x8, /* get menu select pin state */ 0);break;case U8X8_MSG_GPIO_MENU_NEXT:u8x8_SetGPIOResult(u8x8, /* get menu next pin state */ 0);break;case U8X8_MSG_GPIO_MENU_PREV:u8x8_SetGPIOResult(u8x8, /* get menu prev pin state */ 0);break;case U8X8_MSG_GPIO_MENU_HOME:u8x8_SetGPIOResult(u8x8, /* get menu home pin state */ 0);break;default:u8x8_SetGPIOResult(u8x8, 1); // default return valuebreak;}return 1;
}
void u8g2Init(u8g2_t *u8g2)
{u8g2_Setup_ssd1306_i2c_128x64_noname_f(u8g2, U8G2_R0, u8x8_byte_hw_i2c, u8x8_gpio_and_delay); // 初始化 u8g2 结构体u8g2_InitDisplay(u8g2); // 根据所选的芯片进行初始化工作,初始化完成后,显示器处于关闭状态u8g2_SetPowerSave(u8g2, 0); // 打开显示器u8g2_ClearBuffer(u8g2);
}
oled.h文件
#ifndef __oled_H
#define __oled_H
#ifdef __cplusplusextern "C" {#endif/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "u8g2.h"
/* USER CODE BEGIN Includes *//* USER CODE END Includes *//* USER CODE BEGIN Private defines *//* USER CODE END Private defines */
#define u8 unsigned char // ?unsigned char ????
#define MAX_LEN 128 //
#define OLED_ADDRESS 0x78 // oled模块从机地址
#define OLED_CMD 0x00 // 写命令
#define OLED_DATA 0x40 // 写数据/* USER CODE BEGIN Prototypes */uint8_t u8x8_byte_hw_i2c(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr);uint8_t u8x8_gpio_and_delay(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr);void u8g2Init(u8g2_t *u8g2);#ifdef __cplusplus
}
#endif
#endif /*__ i2c_H */
/* USER CODE END Prototypes */
主函数
/* USER CODE BEGIN Header */
/********************************************************************************* @file : main.c* @brief : Main program body******************************************************************************* @attention** <h2><center>© Copyright (c) 2021 STMicroelectronics.* All rights reserved.</center></h2>** This software component is licensed by ST under BSD 3-Clause license,* the "License"; You may not use this file except in compliance with the* License. You may obtain a copy of the License at:* opensource.org/licenses/BSD-3-Clause********************************************************************************/
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "i2c.h"
#include "usart.h"
#include "gpio.h"/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "oled.h"
#include "u8g2.h"
/* USER CODE END Includes *//* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD *//* USER CODE END PTD *//* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* USER CODE END PD *//* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM *//* USER CODE END PM *//* Private variables ---------------------------------------------------------*//* USER CODE BEGIN PV *//* USER CODE END PV *//* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP *//* USER CODE END PFP *//* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 *//* USER CODE END 0 *//*** @brief The application entry point.* @retval int*/
int main(void)
{/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_I2C1_Init();MX_USART1_UART_Init();/* USER CODE BEGIN 2 */u8g2_t u8g2; // a structure which will contain all the data for one displayu8g2Init(&u8g2);/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *///u8g2_DrawCircle(&u8g2, 64, 32, 30, U8G2_DRAW_ALL);u8g2_SendBuffer(&u8g2);u8g2_DrawBox(&u8g2,0,0,20,20);u8g2_DrawBox(&u8g2,20,20,20,20);u8g2_SendBuffer(&u8g2);u8g2_DrawFrame(&u8g2,10,40,20,20);u8g2_SendBuffer(&u8g2);u8g2_SetFont(&u8g2,u8g2_font_DigitalDiscoThin_tf);u8g2_DrawStr(&u8g2,30,10,"free");u8g2_SendBuffer(&u8g2);HAL_Delay(1000);/* USER CODE BEGIN 3 */}/* USER CODE END 3 */
}/*** @brief System Clock Configuration* @retval None*/
void SystemClock_Config(void)
{RCC_OscInitTypeDef RCC_OscInitStruct = {0};RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};/** Configure the main internal regulator output voltage*/__HAL_RCC_PWR_CLK_ENABLE();__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);/** Initializes the RCC Oscillators according to the specified parameters* in the RCC_OscInitTypeDef structure.*/RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;RCC_OscInitStruct.HSEState = RCC_HSE_ON;RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;RCC_OscInitStruct.PLL.PLLM = 4;RCC_OscInitStruct.PLL.PLLN = 168;RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;RCC_OscInitStruct.PLL.PLLQ = 4;if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK){Error_Handler();}/** Initializes the CPU, AHB and APB buses clocks*/RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK){Error_Handler();}
}/* USER CODE BEGIN 4 *//* USER CODE END 4 *//*** @brief This function is executed in case of error occurrence.* @retval None*/
void Error_Handler(void)
{/* USER CODE BEGIN Error_Handler_Debug *//* User can add his own implementation to report the HAL error return state *//* USER CODE END Error_Handler_Debug */
}#ifdef USE_FULL_ASSERT
/*** @brief Reports the name of the source file and the source line number* where the assert_param error has occurred.* @param file: pointer to the source file name* @param line: assert_param error line source number* @retval None*/
void assert_failed(uint8_t *file, uint32_t line)
{/* USER CODE BEGIN 6 *//* User can add his own implementation to report the file name and line number,tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) *//* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT *//************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
按照以上进行移植,就可以使用U8G2库了。
成品效果图
到这里 u8g2就顺利的移植到 stm32平台上了,
欢迎观看,
有什么问题留言给我哦。
U8G2库移植到STM32平台上相关推荐
- python是开源的.它可以被移植_python是开源的,它可以被移植到许多平台上,是对的吗?...
python是开源的,它可以被移植到许多平台上,是对的吗? python是开源的,它可以被移植到许多平台上. Python 特点 1.易于学习:Python有相对较少的关键字,结构简单,和一个明确定义 ...
- python是开源的、它可以被移植到许多平台上_python是开源的,它可以被移植到许多平台上,是对的吗?_后端开发...
一个c语言源程序是由什么组成_后端开发 一个c语言源程序是由一个或多个源文件组成的,而每个源文件可由一个或多个函数组成,并且一个源程序不论由多少个文件组成,都有一个且只能有一个main函数,即主函数. ...
- 基于stm32平台上的IC-MU磁绝对值编码器SPI通讯和码盘数据处理
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 IC-MU磁绝对值编码器的SPI通讯和码盘数据处理 前言 一.硬件连接 二.STM32 cubmx配置模式 三.软件代码及思路 1.寄 ...
- STM32使用OLED移植U8g2库
STM32使用OLED移植U8g2库 STM32CubeMX配置 硬件 STM32F103C8T6 I2C通信OLED 128*64 软件 System Core->RCC->HSE-&g ...
- 【华为云技术分享】如何将90%的代码自动迁移到鲲鹏平台上
主讲人:华为云云享专家 张老师 大家好,今天要讲的主题是关于软件迁移,这是一个久远的话题,因为但凡牵扯到切换平台.CPU架构的变化,甚至一些语言版本的升级,都可能会面临到软件迁移的问题.今天我们就探 ...
- android平台上的sprite,tilelayer设计,android平台上的sprite,tilelayer设计
android平台上的sprite,tilelayer设计 Android 没有提供 javaMe 里面的 Sprite, TileLayer 等,但自己可以设计,为图形处理建立一个基本的框架,同时可 ...
- u8g2库stm32移植记录(硬件IIC)
这是用stm32cubemx,hal库,硬件IIC的方式移植u8g2的教程: 0.移植其实非常简单,文中代码较多只是因为我把官方的模板放上来了,实际上要写的代码只有三部分,代码量非常小的!如果不想看那 ...
- [STM32] STM32 移植 U8g2库
文章目录 前言 1. 准备 2. 移植步骤 2.1 建立有效的通信 2.2 导入U8g2库 2.3 用例测试 总结 前言 开发平台:Keil + 标准库 硬件平台:STM32F103RCT6 显示器件 ...
- 海思平台上USB WIFI的移植与局域网无线调试和视频流预览-第5/11季视频课程-朱有鹏-专题视频课程...
海思平台上USB WIFI的移植与局域网无线调试和视频流预览-第5/11季视频课程-143人已学习 课程介绍 本季课程在开发板上移植USB WIFI模块(套装附带的MT7601模块), ...
最新文章
- 三星对外发售高性能芯片,华为上升势头或受重击!
- 解决SSH连接出现 Software caused connection abort 的问题
- Xcode10新变化
- github中origin和upstream的区别(转)
- linux 块设备驱动 (三)块设备驱动开发
- Java学习笔记——面向对象
- Java统计文件行数
- php5.4连接mysql_PHP5.4+连MySQL数据库
- windows下封一些危险的端口
- linux系统安装snort,linux下SNORT安装.doc
- 【图像处理】基于matlab GUI数字图像处理平台【含Matlab源码 381期】
- windows 10和windows server 2016系统AD的administrator密码修改
- BCD码:8421码
- Oracle表添加时间字段(执行insert、update时,时间字段自动插入当前系统时间)
- 基础知识(HTML + CSS)整理
- 《Web安全之深度学习实战》笔记:第六章 垃圾邮件识别
- LPC1768 PWM单边沿触发
- 非递归实现二叉树结点的遍历
- 让人无法拒绝的内容种草营销
- Java Swing设置图标Icon
热门文章
- Educational Codeforces Round 124 (Rated for Div. 2)D. Nearest Excluded Points
- 一切都结束了,祝贺曼联夺得联赛冠军
- Win7+虚拟机OS X 10.8.5+Xcode4.6.3+越狱iPhone4+iOS5.1.1真机调试及生成ipa包
- 【第1170期】如何看待员工跳槽
- 利用支付宝Cookie监听订单实现个人支付宝收款实时回调
- 论文翻译:Conv-TasNet: Surpassing Ideal Time–Frequency Magnitude Masking for Speech Separation
- Android众多开源项目推荐
- linux od 命令16进制,Linux od命令
- 029 Rust死灵书之Vec实现Drop
- 动手改善Google PageSpeed