stm32移植U8G2图像库指南

U8G2图形库介绍

U8g2:用于单色显示的库,版本 2

U8g2 是一个用于嵌入式设备的单色图形库。U8g2支持单色OLED和LCD,包括以下控制器:SSD1305, SSD1306, SSD1309, SSD1316, SSD1320, SSD1322, SSD1325, SSD1327, SSD1329, SSD1606, SSD1607,895, SH11607,84D1607,SH11607,84D1607,94D1607,94D1607,84D1607,4D1607,4D1607,4D1607,84D1807 ,PCF8812,HX1230,UC1601,UC1604,UC1608,UC1610,UC1611,UC1617,UC1638,UC1701,ST7511,ST7528,ST7565,ST7567,ST7571,ST7586,ST7588,ST75256,ST75320,NT7534,ST7920,IST3020,IST7920,LD7032,KS0108 、KS0713、HD44102、T7932、SED1520、SBN1661、IL3820、MAX7219(完整列表见此处)。

Arduino 库 U8g2 可以从 Arduino IDE 的库管理器安装。U8g2 还包括 U8x8 库:

U8g2:

  • 包括所有图形程序(线/框/圆绘制)。
  • 支持多种字体。(几乎)对字体高度没有限制。
  • 需要微控制器中的一些内存来呈现显示。

U8x8:

  • 仅文本输出(字符)设备。
  • 仅允许适合 8x8 像素网格的字体。
  • 直接写入显示器。微控制器中不需要缓冲器。

移植准备工作

移植U8G2图像库需要准备好,U8G2的源码
U8g2下载地址: https://github.com/olikraus/u8g2
准备一份KEIL工程,我这里使用了一份我自己写的时间片轮询程序(唯一的要求,带屏幕的初始化就行)
在这里插入图片描述

开始移植文件

U8G2源码中,这个csrc是c语言版的源码,直接把他复制到keil的工程里。
在这里插入图片描述
我将csrc文件复制到keil工程中的,HARDWARE文件夹内,改名为OLED_U8G2。(名字和位置,可以根据实际情况更改)
在这里插入图片描述

修改keil配置

添加一个分组,把U8G2的文件全部添加进去
在这里插入图片描述
但是,里面有好多u8g2_d_xxx.c格式的文件,里面有三个文件的必要的。其中一个需要根据你OLED屏幕的驱动芯片和像素(如这里选择的文件,就是ssd1306,这个驱动芯片。128*64的像素)
在这里插入图片描述
还有这两个文件也是必要的,除了这三个文件以后的u8g2_d_xxx的文件全部删除。
在这里插入图片描述
这四个文件也删除了
在这里插入图片描述
然后,添加一下环境配置中的c/c++,让keil可以找到这些文件。

修改U8G2源码

重点就是修改,u8g2_d_memory.c 与 u8g2_d_setup.c 这两个文件

u8g2_d_setup.c修改

快捷键 ctrl+A 全选以后,直接把全部文件注释了
在这里插入图片描述
然后,取消注释头文件,并且找到你屏幕驱动对应的那个函数取消注释
在这里插入图片描述
这里找到了,跟我ssd1306 128*64对应的函数,取消注释。最后一个英文字母f代表的是内存。就是一次传输多少字节的数据。f为1024个字节,2为256个字节,1为128个字节。这个主要是根据单片机的性能来选择的。比如是stmf103c8t6这种小容量的芯片,就选择后缀为1的函数。

u8g2_d_memory.c修改

同样的操作,ctrl+A把全部文件注释了以后,取消对头文件的注释。
在这里插入图片描述
然后,在u8g2_d_memory.c文件中,查找下图红框框里的函数,把对应的函数,取消注释。
在这里插入图片描述
取消注释
在这里插入图片描述

注意

  • 上面的所有操作,需要根据屏幕的驱动芯片
  • f 代表的是一次刷新屏幕的字节数(根据芯片选择 f 、 2 、1)

U8G2接口程序

u8g2_Setup_ssd1306_128x64_noname_f就是刚刚选择的屏幕驱动函数。
下面两句就是开打屏幕的显示。

	u8g2_Setup_ssd1306_128x64_noname_f(&u8g2, U8G2_R0, u8x8_byte_4wire_sw_spi, u8x8_stm32_gpio_and_delay);  
	u8g2_InitDisplay(&u8g2);
	u8g2_SetPowerSave(&u8g2,0);

重点是u8x8_stm32_gpio_and_delay这个函数,这个回调函数,需要由我们使用者来写。他主要就是给U8G2提供的延时函数和通信接口。
这里使用的是4线的spi通信

uint8_t u8x8_stm32_gpio_and_delay(U8X8_UNUSED u8x8_t *u8x8,
    U8X8_UNUSED uint8_t msg, U8X8_UNUSED uint8_t arg_int,
    U8X8_UNUSED 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 seconds
				for (uint16_t n = 0; n < 320; n++)
				{
					__NOP();
				}
				break;
    case U8X8_MSG_DELAY_MILLI:			                // delay arg_int * 1 milli second
				delay_ms(1);
        break;
    case U8X8_MSG_DELAY_I2C:				            // arg_int is the I2C speed in 100KHz, e.g. 4 = 400 KHz
				delay_us(5);
				break;							                // arg_int=1: delay by 5us, arg_int = 4: delay by 1.25us
		case U8X8_MSG_GPIO_SPI_DATA:
			  if(arg_int == 1)                                     // arg_int=1: Input dir with pullup high for I2C clock pin
        	GPIO_SetBits(GPIOA,GPIO_Pin_1);
        else if(arg_int == 0)
        	GPIO_ResetBits(GPIOA,GPIO_Pin_1);
				break;
		case U8X8_MSG_GPIO_SPI_CLOCK:
			  if(arg_int == 1)                                     // arg_int=1: Input dir with pullup high for I2C clock pin
        	GPIO_SetBits(GPIOA,GPIO_Pin_0);
        else if(arg_int == 0)
        	GPIO_ResetBits(GPIOA,GPIO_Pin_0);
				break;
		case U8X8_MSG_GPIO_CS:
			  if(arg_int == 1)                                     // arg_int=1: Input dir with pullup high for I2C clock pin
        	GPIO_SetBits(GPIOA,GPIO_Pin_4);
        else if(arg_int == 0)
        	GPIO_ResetBits(GPIOA,GPIO_Pin_4);
				break;
		case U8X8_MSG_GPIO_DC:
			  if(arg_int == 1)                                     // arg_int=1: Input dir with pullup high for I2C clock pin
        	GPIO_SetBits(GPIOA,GPIO_Pin_3);
        else if(arg_int == 0)
        	GPIO_ResetBits(GPIOA,GPIO_Pin_3);
				break;
		case U8X8_MSG_GPIO_RESET:
			  if(arg_int == 1)                                     // arg_int=1: Input dir with pullup high for I2C clock pin
        	GPIO_SetBits(GPIOA,GPIO_Pin_2);
        else if(arg_int == 0)
        	GPIO_ResetBits(GPIOA,GPIO_Pin_2);
				break;
    case 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 value
        break;
  }
  return 1;
}

最终效果

	int t = 0;
	u8g2_t u8g2; 
	delay_init(168);
	LED_Init();					//初始化LED
 	OLED_Init();				//初始化OLED
	LED0=0;
	u8g2_Setup_ssd1306_128x64_noname_f(&u8g2, U8G2_R0, u8x8_byte_4wire_sw_spi, u8x8_stm32_gpio_and_delay);  
	u8g2_InitDisplay(&u8g2);
	u8g2_SetPowerSave(&u8g2,0);
	while(1) 
	{
		LED0=~LED0;
		delay_ms(100);
		u8g2_ClearBuffer(&u8g2); 
		if(++t >= 32) t = 1;
		u8g2_DrawCircle(&u8g2,64,32,t,U8G2_DRAW_ALL);
		u8g2_DrawCircle(&u8g2,32,32,t,U8G2_DRAW_ALL);
		u8g2_DrawCircle(&u8g2,96,32,t,U8G2_DRAW_ALL);
		u8g2_SendBuffer(&u8g2);  
	}

在这里插入图片描述

  • 18
    点赞
  • 81
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
你好!对于将 U8g2 移植STM32 上,你需要按照以下步骤进行操作: 1. 首先,确保你已经安装了适当的开发环境,包括 STM32CubeMX 和 STM32Cube HAL 。如果没有,请先下载和安装它们。 2. 打开 STM32CubeMX,并创建一个新的工程。选择适合你的 STM32 芯片型号,并配置所需的引脚和外设。 3. 在 "Middleware" 部分中,找到 "Graphics" 并选择 "U8g2"。 4. 根据你的需求选择所需的显示屏控制器和接口类型。U8g2 支持多种不同的控制器和接口。 5. 在 "Configuration" 选项中,配置 U8g2 的其他参数,比如显示屏分辨率、字体等。 6. 生成代码并打开工程。 7. 在生成的代码中,找到 "main.c" 文件,并添加以下代码来初始化 U8g2 : ```c #include "u8g2.h" u8g2_t u8g2; int main(void) { // 初始化代码 u8g2_Setup_<Controller>_<Interface>_u8g2(&u8g2, <rotation>, <u8x8_byte_fn>, <u8x8_gpio_and_delay_fn>); u8g2_InitDisplay(&u8g2); // 其他初始化代码 while (1) { // 显示内容更新代码 } } ``` 注意替换 `<Controller>` 和 `<Interface>` 为你选择的控制器和接口类型。`<rotation>` 是显示屏旋转角度,`<u8x8_byte_fn>` 和 `<u8x8_gpio_and_delay_fn>` 是用于与硬件通信的函数指针。 8. 在 `while (1)` 循环中,你可以使用 U8g2 提供的函数来更新显示屏上的内容。 这只是一个简单的示例,你可能还需要根据具体需求进行其他配置和修改。请参考 U8g2 的文档和示例代码来了解更多细节。希望对你有帮助!如果你有其他问题,请随时提问。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值