stm32 u8g2移植笔记

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空间?

  1. u8g2支持上百种屏幕,包含的太多的驱动函数。
  2. u8g2支持很多种字体,字体也占据了较多的空间

移植

这里的移植是针对于keil MDK开发STM32。

移植策略

一般而言对于移植库,不建议更改原码,但鉴于上面的问题,为达到更好的使用效果,我们需要修改原码:

  1. 修改u8g2_d_memory.c文件
  2. 工程中只添加需要用到的屏幕的驱动文件

移植过程

  1. 从官网下载原码
  2. 目前只移植c语言版本,因而只需要将用到csrc文件夹内的文件,将其复制到工程目录。
  3. 将原码添加到工程中,注意对于驱动文件(u8x8_d_xxx.c)我们只需要添加用到的哪一个型号就可以了,这里我用到的是u8x8_d_st7920.c。其余库文件全部添加到工程中,这里需要修改u8g2_setup.c文件,将未用到的函数全部注释掉。
  4. 修改u8g2_d_memory.c文件,将各个函数中的static uint8_t buf[xxx]注释掉,只在文件开始的地方定义一个全局的static uint8_t buf[1024];
  5. 将编译器的优化级别调整为-O2或-O3,否则还是会因为字体的原因出现链接时空间不足的问题,后面可以将字体文件存储到flash(w25q64)中。
发布了48 篇原创文章 · 获赞 78 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/xiaoyuanwuhui/article/details/103551696