【目的】
使用最新出的STM32U083,使用sh1106作为OLED显示屏,运行stm32的图形库toucGFX
【原理图】
sh1106与ssd1306驱动相同,定义开发板与OLED的接线顺序如下:
DO-----------SPI2_SCK->PB13
DI------------SPI2_MOSI->PB15
RES----------PB11
DC-----------PB1
CS-----------PB2
【开发步聚】
本次的移植分两步,一是驱动OLED屏,二是使用touxGFXdesiger设计helloworld为展示成果。
1、使用stm32cubeIDE创建基于stm32u083的基础工程。
2、打开rcc的外部时钟,配置主时钟为48MHz
3、开启spi2,定义IO为PB13\PB14\PB15为spi2的输出IO。同时将三个IO修改为输出速度为VeryHigh
配置spi如下,同时打开DMA传输、DMA中断。
4、把PB11、PB1、PB2的IO配置为输出模式,并定义标签为OLED_RST、OLED_DC、OLED_CS。
5、打开CRC,因为使用touchGFX必须开启它。
6、开启TIM7,配置如下:
TIM7主要是为touchGFX提供心跳包。
7、开启x-cube-touchGFX。配置为黑白模式,并指定分辨率为128*64像素:
最后生成MDK工程,并打开。
同时在工程目录touchGFX下面打开TouchGFX,在屏上添加hello world的texArea:
点击生成工程代码。再回到mdk工程中。
【用户代码编写】
1、拷贝在其他stm32的工程中的sh1106的代码,到工程目录Core/Src中
同时把头文件,以及字库头文件添加到inc文件夹中。
2、添加oled到工程组中
3、修改TouchGFXHAL.cpp文件。
1)添加ssd1306.h到工程中
2)在函数flushFrameBuffer中添加向ssd1306写入图像的代码:
const unsigned char* bitmap = (const unsigned char*) getClientFrameBuffer(); SSD1306_Fill(0x00); SSD1306_DrawBitmap(0, 0, bitmap, 128, 64, 0x01); SSD1306_UpdateScreen();
3)在最后添加:图像同步函数,以方便C调用:
extern "C" void touchgfxSignalVSync(void) { /* VSync has occurred, increment TouchGFX engine vsync counter */ touchgfx::HAL::getInstance()->vSync(); /* VSync has occurred, signal TouchGFX engine */ touchgfx::OSWrappers::signalVSync(); }
4、在main.c中添加TIM7的回调函数:
extern void touchgfxSignalVSync(void); void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if (htim->Instance == TIM7) { touchgfxSignalVSync(); } }
5、在main.c中添加ssd1306.h的文件引用,并添加oled的初始init函数。
到此所有移植就完成了,下载到开发板效果如果: