oled除了SPI接口外还需要三只管脚,和MCU GPIO对应关系如下:
片选 CS -> PG7
命令 DC -> PG8
复位 RST -> PG6
其中 PG6和网络中断复用管脚,项目里使用了ETH的话,需要改成其它管脚。
Wireless使用SPI2接口,和板载SPI-FLASH共用,使用RTOS的话需要注意使用互斥信号量进行保护。
2、配置
SPI的初始化使用CUBE生成即可。
本测试程序采用刷画布的方式操作OLED。原理是将屏幕点阵映射至MCU内存,对OLED的所有操作均转换为对内存操作,然后将内存中的数据刷入OLED。这种方法比较消耗内存,但好处是速度快,并且方便进行不对齐页面的操作,文字可以显示在屏幕的任意位置。
画布可以配置大一点,本程序配置为横向320点,纵向192点,使用内存7680字节,对于
STM32来说,这点内存毫无压力。刷屏的时候仅将画布的一部分刷入OLED即可。
//硬件配置
- #define LCD_BLOCKS 5u //画布X方向块数,每块64dots
- #define LCD_PAGES 24u //画布页数
- unsigned char LcdRam[LCD_BLOCKS*64 * LCD_PAGES + 4]; //画布缓冲
复制代码
3、演示程序
演示程序切换3个页面,key1按键进行页面切换,并且强制定位显示主屏区域。
key_up键启动、停止文字移动演示,结果如视频所示。
由于OLED和SPI-FLASH使用同一SPI接口,刷屏是需要申请接口互斥量,代码如下:
// 刷屏
- osMutexAcquire(os_obj.mid_nor_spi, INT16_MAX);
- lcd_yl_poll_ext(gui_st.move_site_x, gui_st.move_site_y, 8, lcd_data_write_ext);
- while (lcd_yl_update_cnt_get())
- {
- lcd_yl_poll_ext(gui_st.move_site_x, gui_st.move_site_y, 8, lcd_data_write_ext);
- osDelay(1);
- }
- osMutexRelease(os_obj.mid_nor_spi);
复制代码
代码托管GITEE:
https://gitee.com/aple_sun/opendev-f1-v4.git