STM32移植U8g2图形库——玩转OLED显示
本篇,介绍一下U8g2库如何移植到STM32上,进行OLED的图形显示。
本次的实验硬件为:
STM32:型号为最常见的STM32F103C8T6
OLED:0.96寸OLED,IIC接口(如果是SPI接口,文中也有对应的修改介绍)
U8g2 是一个用于嵌入式设备的单色图形库。U8g2支持单色OLED和LCD,并支持如SSD1306等多种类型的OLED驱动。
U8g2源码的开源库地址:https://github.com/olikraus/u8g2

2 移植步骤
首先下载U8g2的源码,因为STM32主要是使用C语言编程,所以只需关注源码中的C源码部分,即csrc文件夹下的文件。
2.1 精简c源码
U8g2支持多种显示驱动的屏幕,因为源码中也包含了各个驱动对应的文件,为了减小整个工程的代码体积,在移植U8g2时,可以删除一些无用的文件。
2.1.1 去掉无用的驱动文件
这些驱动文件通常是u8x8_d_xxx.c,xxx包括驱动的型号和屏幕分辨率。ssd1306驱动芯片的OLED,使用u8x8_ssd1306_128x64_noname.c这个文件,其它的屏幕驱动和分辨率的文件可以删掉。

2.1.2 精简u8g2_d_setup.c
由于我的OLED是IIC接口,只留一个本次要用到的u8g2_Setup_ssd1306_i2c_128x64_noname_f就好(如果是SPI接口,需要使用u8g2_Setup_ssd1306_128x64_noname_f这个函数),其它的可以删掉或注释掉。
注意,与这个函数看起来十分相似的函数的有:
u8g2_Setup_ssd1306_128x64_noname_1
u8g2_Setup_ssd1306_128x64_noname_2
u8g2_Setup_ssd1306_128x64_noname_f
u8g2_Setup_ssd1306_i2c_128x64_noname_1
u8g2_Setup_ssd1306_i2c_128x64_noname_2
u8g2_Setup_ssd1306_i2c_128x64_noname_f
其中,前面3个,是给SPI接口的OLED用的,函数最后的数字或字母,代表显示时的buf大小:
1:128字节
2:256字节
f:1024字节
2.1.3 精简u8g2_d_memory.c
由于用到的u8g2_Setup_ssd1306_i2c_128x64_noname_f函数中,只调用了u8g2_m_16_8_f这个函数,所以留下这个函数,其它的函数一定要删掉或注释掉,否则编译时很可能会提示内存不足!!!
2.2 编写移植函数
精简源码之后,还需要编写如下的配置函数。
2.2.1 GPIO初始化
对OLED用到的IIC接口进行GPIO的初始化配置:
如果是SPI接口,则初始化对应的SPI接口即可。
2.2.2 u8x8_gpio_and_delay
这个函数也需要自己写,主要的修改包括:
赋予U8g2相应的延时函数,比如下面的delay_ms和delay_us
为U8g2提供IIC接口的高低电平调用:
U8x8_MSG_GPIO_I2C_CLOCK:IIC的SCL
U8x8_MSG_GPIO_I2C_DATA:IIC的SDA
如果是SPI接口,可以参考如下写法:
可以看出,对于IIC与SPI接口,只有分别进行对应的配置即可。
2.2.3 u8g2Init
U8g2的初始化,需要调用下面这个u8g2_Setup_ssd1306_128x64_noname_f函数,该函数的4个参数含义:
u8g2:传入的U8g2结构体
U8G2_R0:默认使用U8G2_R0即可(用于配置屏幕是否要旋转)
u8x8_byte_sw_i2c:使用软件IIC驱动,该函数由U8g2源码提供
u8x8_gpio_and_delay:就是上面我们写的配置函数
2.2.4 显示测试函数
使用U8g2提供的测试函数,用于查看显示效果
2.3 源码加入到MDK编译
在一个STM32的基础例程上进行修改。
2.3.1添加u8g2源码到工程
左侧工程目录添加U8g2源码,然后再添加U8g2的头文件搜寻目录,如下:

2.3.2 主函数
主函数中,首先是IIC的初始化和U8g2的初始化,然后就可以测试U8g2的图形显示功能了:
3 测试效果

4 总结
本篇介绍了如何将U8g2图形库移植到STM32中,其中主要的修改包括:
精简源码中的u8g2_d_setup.c和u8g2_d_memory.c
OLED所用IIC接口的GPIO初始化
编写u8x8_gpio_and_delay和u8g2Init
其中,u8g2_d_memory.c文件一定要去掉无用的函数,否则编译时会提示内存不足;对于SPI接口的OLED,参考IIC接口进行类似的修改即可。

