STM32 u8g2 移植笔记
前言
当初想写一个单色屏菜单时,曾移植过u8g2到STM32平台(这里用的是keil MDK),不过当时一直有一个问题没有搞懂:为什么u8g2用在flash为32k,ram为2k的arduino uno上都不会报空间不足,却在flash为512k,ram64k的stm32zet6上报错空间不足?这是由编译器导致的,arduino使用的是avr-gcc编译器在编译的时候会加-ffunction-sections -fdata-sections,链接的时候会加-Wl,-gc-sections选项,因而可以只链接用到的函数。stm32编译选项中有个类似的选项One ELF Section per Function,勾选该项可以极大的减少flash空间的占用,但仍不能解决空间不足的问题。
u8g2为什么需要这么大的flash空间?
- u8g2支持上百种屏幕,包含的太多的驱动函数。
- u8g2支持很多种字体,字体也占据了较多的空间
移植
这里的移植是针对于keil MDK开发STM32。
移植策略
一般而言对于移植库,不建议更改原码,但鉴于上面的问题,为达到更好的使用效果,我们需要修改原码:
- 修改u8g2_d_memory.c文件
- 工程中只添加需要用到的屏幕的驱动文件
移植过程
- 从官网下载原码
- 目前只移植c语言版本,因而只需要将用到csrc文件夹内的文件,将其复制到工程目录。
- 将原码添加到工程中,注意对于驱动文件(u8x8_d_xxx.c)我们只需要添加用到的哪一个型号就可以了,这里我用到的是u8x8_d_st7920.c。其余库文件全部添加到工程中,这里需要修改u8g2_setup.c文件,将未用到的函数全部注释掉。
- 修改u8g2_d_memory.c文件,将各个函数中的static uint8_t buf[xxx]注释掉,只在文件开始的地方定义一个全局的static uint8_t buf[1024];
- 将编译器的优化级别调整为-O2或-O3,否则还是会因为字体的原因出现链接时空间不足的问题,后面可以将字体文件存储到flash(w25q64)中。