1. 简介 最近搞了一块STM32H743的开发板,自带TFT-1.8寸的液晶屏,一直听说STemWin功能强大,想要体验一把。奈何从未移植过STemWin,下意识的感觉还是有点困难,尤其是在网上找了一番关于STemWin的移植教程之后,发现给小白看的教程实在太少,SPI接口的教程更少。因此将自己移植STemWin的过程分享出来,供大伙参考一下。$ ]2 M. r& N& ~4 n 2.环境 硬件4 c2 N; R) |" ]" f# Z% m MCU信息:STM32H743 TFT屏幕信息:TFT-1.8寸液晶屏(分辨率:160xRGBx128;驱动IC:ST7735S;通讯接口:SPI). P: ~0 A! D' N3 Z0 G7 \ 软件0 l9 h0 Y4 |6 E# Q2 }6 P HAL库信息:STM32Cube_FW_H7_V1.6.0(在使用STM32CubeMX生成STM32H7工程时会提示下载,目录在:C:\Users$username$\STM32Cube\Repository\STM32Cube_FW_H7_V1.6.0) STemWin信息:下载完上述的HAL库之后,STemWin也已经下载OK,具体位置如下:C:\Users$username$\STM32Cube\Repository\STM32Cube_FW_H7_V1.6.0\Middlewares\ST % j# P& {0 P8 d2 N) }" v# A 3.移植 3.1 移植前准备 开发板提供了TFT-1.8寸LCD的SPI驱动Demo,屏幕可以正常使用,我是基于该工程进行的移植。重点关注Demo中的以下几个函数,函数名可能跟我提供的有所出入,具体视自己的LCD驱动代码而定。1 a" V+ b7 `. c8 q1 I : J5 b! H5 R! d0 z LCD_Init(void) --------------------------- SPI驱动代码,以及LCD的初始化 LCD_WriteCmd(uint8_t cmd)---------LCD写命令 LCD_WriteData(uint8_t data)---------LCD写数据$ G: E7 _% g6 h' `8 E1 s( V2 ?0 B 工程目录中,如果有lcd.c,lcd.h,gui.c,gui.h,请先将文件重命名,并更改工程文件,并保证编译之后运行依然OK。 3.2 开始移植$ u& o! z; e! L: }9 I6 o 将整个STemWin目录拷贝到工程目录下: 2 e3 \/ {8 s: x& s% v( v ( Y! t3 }5 O# R9 O( |( M+ N 打开LCD Demo的工程文件,将STemWin下必要的文件添加进工程,具体文件以及路径如下: STemWin/Config/GUIConf.c STemWin/Config/GUIConf.h STemWin/Config/GUIDRV_Template.c9 W$ b/ ?5 Z8 l; z. N STemWin/Config/LCDConf_FlexColor_Template.c( |9 @- C* K) T$ V STemWin/Lib/STemWin_CM7_wc16_ARGB.a STemWin/OS/GUI_X.c/ O, g* e+ h* y1 ?8 Z" ` s 添加完成之后,工程目录结构中如下:3 n# e% J a8 j% d) j ' l( g3 M! C! Q: _( e( } 将STemWin_CM7_wc16_ARGB.a设置为库文件,具体配置方法如下: " L9 p8 \! o2 m8 D3 n) s 修改工程的头文件包含路径,增加以下几个路径:4 B" q# h2 f4 T" b 3.3 修改代码 3.3.1 修改LCDConf_FlexColor_Template.c) g0 |& m+ |* N# w/ t& E$ R 找到XSIZE_PHYS和YSIZE_PHYS,并修改为实际LCD的分辨率 9 |2 h# q3 j% D0 F 9 M: t& V7 A) [0 I 修改LCD_X_Config(void),具体修改为 , E) Y6 q" }$ w9 p! `" b& z & J6 L* F2 D0 E: p 修改LCD_X_DisplayDriver(void),加入我们自己的LCD屏的初始化函数。 修改一下几个函数,该方法根据具体使用的LCD确定,本例程使用的是SPI通讯的LCD屏幕,指令和数据均为 8 bit1 Q: d1 M* G6 ^8 { O ! m G4 q" r2 C& N; L; A3 l" y( C LcdWriteReg(U16 Data) —> LcdWriteReg(U8 Data) LcdWriteData(U16 Data) —> LcdWriteData(U8 Data) LcdWriteDataMultiple(U16 * pData, int NumItems) —> LcdWriteDataMultiple(U8 * pData, int NumItems)' B$ _( M o, s/ `7 v4 D & a" v9 \9 l) H: W- ]% C, w 3.3.2 修改GUIDRV_Template.c 找到 ,加入LCD的画点函数,该函数由LCD驱动 Demo提供,需要根据自己的LCD驱动代码来进行添加。 " t" s3 \: ^- \6 ?& [3 B6 P 1 ? w+ x; L) Y 3.3.3 修改GUConf.c- @; [ m( |0 H 修改GUI使用的SDRam大小. Z2 _% b; s# w3 Q) m9 z# o 1 d0 z6 V8 d) [6 ?) v1 ?: l, d 3.3.4 新建一个空文件 LCDConf.h5 j( V f/ ^" J X. o ; i, A) s6 ~1 w7 f9 m. x- o& u 3.3.5 由于采用的是RGB格式的LCD屏,因此需要修改GUI_ConfDefaults.h,否则可能会以BGR的方式显示。 3.3.6 修改stm32h7xx_it.c中的SysTick_Handler函数,加入一下代码,由于GUI_Delay会使用到OS_TimeMS,因此如果不加该段代码,GUI_Delay将无限延时. w$ I E. @( K2 [" z! _( Y" ^, [ 1 [, j2 U+ M6 G4 i 4 验证0 B7 f4 ^( l1 m( i7 c 在main方法中,包含头文件GUI.h,并加入测试代码9 L, ~; P, } }0 L7 `* ~% @ / |; N7 j( w) i$ o% F7 |8 i 实际显示效果:/ E( e0 U: J9 ]! Z% g; a+ i7 R! k3 ] 7 k1 @( b3 H6 p0 x! \7 _ ; Y3 @' x) L2 T4 f: Y7 A* ]" U 5 总结 对于一名没有用过STemWin的小白来说,移植还算顺利,比想象中的要Easy一些,中途参考了各方教程,并结合自己的理解,完成了这一次移植。本次移植采用的是GUIDRV_Template_API的方式,后来也有使用GUIDRV_FLEXCOLOR的方式移植了一下,这个后续有空再补。9 a8 w3 U7 U% v% ]; q ! @% P q" [" L( b: J ; g/ O% `6 J& E' s% |3 I |
Stm32H7XX GCC下分散加载实现
【银杏科技ARM+FPGA双核心应用】STM32H7系列10——ADC
DIY-STM32H750核心板
[nucleo-H7A3ZI-Q]1-点亮一个皮皮灯
DIY-STM32H743核心板
【银杏科技ARM+FPGA双核心应用】STM32H7系列57——MDK_FLM
1月10日有奖直播 | 基于STM32 的CODESYS智能自动化解决方案
STM32的CAN FD位定时设置注意事项
用 STM32CUBEMX 生成 STM32H735 LWIP PING 不成功
基于STM32H7 EXTI + SPI +DMA 双缓冲应用经验分享