你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

实验经验 | LTDC RGB 接口 LCD TouchGFX 工程的移植步骤

[复制链接]
STMCU-管管 发布时间:2025-2-6 09:47
1
$ C8 w6 s& ?2 I. m! U引言" ^+ S7 F1 M2 u$ Z  a+ P
文档基于 STM32F746G_DISCO 硬件平台,参考从 TouchGFX Designer 下载的 STM32F746 的 TBS(TouchGFX Board Setup),讲解 STM32CubeMX 相关配置,介绍了LTDC RGB 接口 LCD 的 TouchGFX 工程的移植步骤。
. |3 O! X) b2 Y0 {! n# v
12.png
▲ 图1. TouchGFX Designer 中的 STM32F746G_DISCO TBS

( L8 s" j- _  m  J3 z0 a2 p3 `/ O

' ]1 d% j% Q! x7 L7 y; n9 S/ a8 I2 + Y/ x- ?$ z  v( H
STM32CubeMX 配置过程
0 p0 o% P' M( bSTM32F746G_DISCO 有两个外部存储器,SDRAM 和 QSPI Flash,SDRAM 用于帧缓冲器,QSPI Flash 用于存储图片、字体等素材,其图形实现过程如图 1 所示。本文档参考从 TouchGFX Desinger 上下载的 TBS,第一步首先完成 IOC 文件的配置,由于会使用 外部 RAM 和外部 Flash,生成代码后还需要添加相应的存储器驱动代码,以及修改链接文件。对于仅使用内部 Flash 和内部 RAM 的应用,用 STM32CubeMX 和 TouchGFX Desinger 生成代码后,就可以直接使用 TouchGFX 点亮屏幕了。
1 Y( m; Z, l- j! I" f8 p" J
13.png
▲ 图2. 图形实现过程
5 n: v/ O  V* [5 M$ A
2.1. 新建 IOC 工程 # X$ s' C- P; O
+ Z" O/ b, \$ K, T. l

- _. L: K% y$ J/ R双击打开 STM32CubeMX 软件,按照图中 1-5 步骤操作,MCU 型号输入 STM32F746NGH6 进行选择,其中第 5 步提示配置默认 MPU 单元来优化内核的推测性 读取访问,请点击“YES”。
% g' E! e9 W% i# `- a& H
14.png
▲ 图3. 新建 STM32CubeMX 工程
然后点击“Project Manager”,配置工程名称,如图所示。 ) I# ]% `) e8 J5 t
15.png
▲ 图4. 配置工程名称

* Q1 ]) i: X5 B. O0 p4 p

5 n! |+ n( G, v' M5 J2.2. CORTEX_M7 $ V. ?6 Y/ a- J/ B% R8 k" ^
! x  D3 \: l7 i

. |3 q  _7 M  K) ^' o这里使能 ICACHE 和 DCACHE,并配置内存保护单元 MPU,要正确配置 MPU 属性 以避免由 Cortex®-M7 推测性读取访问和缓存维护引起的图形性能问题,使用 STM32CubeMX 可以轻松配置 MPU 存储器属性。详细配置过程可以参考 AN4861 4.6 小节 Special recommendations for Cortex-M7 (STM32F7/H7),其中介绍对嵌入了 Cortex®-M7 CPU 的 STM32F7 系列的一些建议,建议大家仔细阅读下。; G, C! Y+ @* e% F/ K
3 ^2 h4 a- L+ @! L3 ]& f+ Y2 W, [

- h- h; D1 ^; Z+ S% Y5 P$ }6 K2.3. CRC
5 b& r6 M8 V& F" @
# w$ y/ b0 u( e3 M$ x, l
% A2 m% ?* }4 P, d; A/ L# t
CRC 是循环冗余校验计算单元,如果要使用 TouchGFX,必须要使能 CRC,其配置保 持默认即可。
# j7 }' n3 b7 Y9 D
) ]! k' a$ M: ]& l  Y1 ~2 {: }8 `
4 D/ x2 [. r9 q5 C9 n
16.png
▲ 图5. 使能 CRC
" V1 L! S& V/ f4 A& i9 l
2.4. DMA2D
6 t) }2 M- \+ H2 F( @: Z0 p) w0 w  E

) D& q2 _& n' c  E( gDMA2D 是 AHB 总线矩阵上的主设备,它将图形数据传输到内存,也可用于图形渲 染,建议使用 DMA2D 来减轻 CPU 负载。DMA2D 使能后保持默认配置即可,当需要 DMA2D 来进行图形加速时,TouchGFX 引擎会自动调用 DMA2D。 ' d% t, o- I5 d1 d* H
3 M% V$ Q, A+ H" f6 F, k- d4 q7 E- e
17.png
▲ 图6. 使能 DMA2D

5 D  F6 ~; a, [; h. x6 y# j2.5. FMC 配置 LTDC 帧缓存区和 Video 缓冲区放在了外部 SDRAM 中。配置 FMC 相关参数时,需 要对照原理图和 SDRAM 的 datasheet,了解相关参数,然后进行配置。配置结束后,需 要添加相应的驱动代码,将其配置内存映射模式。 9 H: W. Z; |2 m: |" y
18.png
▲ 图7. FMC 配置

6 m/ ?8 b. Y4 h, s

- v* k" E3 J8 _  B1 E' w  W2.6. FREERTOS
& q2 b/ X6 e1 a8 j( K
. N6 U/ e( I4 a+ K- Y% t- `) a
! P+ w2 d: O* z- t4 k1 J
TouchGFX 可以运行在有 RTOS 和无 RTOS 的工程中,本工程移植的是带有 RTOS, RTOS 选择 FreeRTOS,在本工程中新增了 2 个 task,TouchGFXTask 任务用于运行ToucGFX 图形引擎,VideoTask 任务用于进行 Mjpeg 视频的编解码,如果您的项目不用 video 控件,那么 videoTask 可以不用添加。
5 u$ `6 B% ]- Z1 J
19.png
▲ 图8. FreeRTOS 新增任务

2 r/ V- F+ @! R; n! r& o1 G

* B7 b: a7 N. |- Z注意新增总的堆空间大小,防止新建任务的栈大小不足。
3 u8 `+ N9 |0 \' _+ Q
/ b/ [' E/ H. W. @3 Q

1 p: e3 t4 U0 a, J, n
20.png
▲ 图9. 堆空间大小配置

" v7 d; H6 b" h* d% y2.7. GPIO
* H0 t3 o2 b- g( W# [$ g9 R  p7 w6 Z! Y' y
/ K5 ^: P8 b& ]+ y& w! z& `
在官方下载的 TBS,配置的 GPIO 如图 9 所示。与 LCD 显示相关的引脚有 2 个, LCD_DISP 和 LCD_BL_CTRL。LCD_DISP 用来启用/禁用显示待机模式,需要将 LCD_DISP 配置为高电平来启用显示器,否则显示器将保持待机模式。LCD_BL_CTRL 信 号上的高电平可以点亮背光,而低电平则将其关闭。
2 J0 v+ c: q4 Y0 X" o
6 l6 A" S8 E( v; C7 W, M, `" M) }
2 P" V2 n( a4 G3 O, L$ K; _: c( y
另外几个 GPIO 引脚可以用来测试性能的,它们的解释说明可以查看 TouchGFXGPIO.cpp 中注释,其中 RENDER_TIME,可以用来查看实际的渲染时间。9 v$ u* Z: j5 W9 g. W  C, @0 f( F

! h" V  j$ f) L7 |# Q6 k- c

$ _' U: J# @9 \. j) C+ r
21.png
▲ 图10. GPIO 配置
  V( J- J, [3 a# S
2.8. I2C3
. i3 F& T; w  x  w3 z% `& e$ D. f. ?4 q& d4 @$ ~

; `8 z) r4 H4 i( b. E0 H6 B. wSTM32F746G_DISCO 的电容 LCD 的触摸的接口是 I2C3 的 PH7 和 PH8,相关参数 的配置参数如图所示。
9 I* e. M! @$ m+ X/ |( o5 c0 o8 ?. M% {9 {5 O
22.png
▲ 图11. I2C3 配置

+ ^# C$ t' ]( q0 `/ M

. X/ T( c9 Q! E& f1 \9 p8 ^8 F: M2.9. LIBJPEG
1 h) g8 |7 `. y9 A
9 N! u0 m, ^8 f8 Z: [$ ~: [0 O9 j
8 U. r! t% |0 s; E1 q5 g/ I
如果 TouchGFX 使用 Video 控件,要使能 LIBJPEG,用于视频流的软件编解码。如果 您的工程用不到 Video 控件,那么可以不用使能 LIBJPEG。1 w) ?2 a; l. _$ R
) @0 s3 T; x  W- ?. ^: X
23.png
▲ 图12. GPIO 配置
/ N) f5 S& b  x0 v9 Y( a1 }

4 A7 B% R; N, {9 `+ g9 r2.10. LTDC
3 S- v) A1 R( [/ u
, {5 L8 f7 d# D0 T9 [* E

5 ~* G5 F& N' }1 e) L# ^9 SLTDC 外设主要用来配置 LCD 显示接口,对于 STM32F746G_DISCO 的 LCD 可以参 考下载的 TBS 进行配置。如果是其他型号的 LCD,需要查看 LCD 的屏幕时序表进行配 置。关于 LTDC 的 layer,虽然在 STM32CubeMX 可以配置为 2 个 layers,但是 TouchGFX Designer 是采用 1 个 layer 来做 GUI 开发的,这是因为 2 个 layer 会占用更 多带宽,同时打开 LTDC 全局中断和错误中断。3 i0 z( _9 m, H9 g

- ^2 m& S0 R; e) c# I4 H6 v
24.png
▲ 图13. LTDC 参数配置

) X/ A7 O( G$ h6 W' ]9 Y
25.png
▲ 图14. LTDC layer 配置
26.png
▲ 图15. 打开 LTDC 全局中断和错误中断

! T" D5 s# O9 E! N9 c' ^. a

4 E- G8 R' o  i+ N2 F+ b5 k2.11. QUADSPI
. T0 A' t) Y* n当要存储的数据量相对较少时,可以使用内部 FLASH 存储器。否则,应将图形内容放 置在外部存储器中。QUADSPI 外接了一个 128-Mbit Quad-SPI NOR Flash。7 \6 a; T  P3 e4 X% y% m0 W

4 s% ?5 F% C$ H( N! l- _
27.png
▲ 图16. QUADSPI 配置
: y. c$ n0 F8 W% l

8 f" `0 [" r6 b5 P7 K; ?2.12.SYS
% _* D) d+ h4 C5 z8 N由于 SysTick 被 RTOS 使用,这里 HAL 库的时基选择 TIM6。
3 j. Y6 Q" ^6 {5 k. U! S- M1 c
2 Z6 a$ S8 K0 Z. F% m& g& Z
28.png
▲ 图17. 系统时钟配置
3 T. L  \$ l9 z+ d  F
- l, \* y2 t& [/ [
2.13. X-CUBE-TOUCHGFX ! x* d, q  X. s' s5 v
Interface:接口选择 Parallel RGB(LTDC) & T0 A3 a" `! Q+ T! O
对于 RGB 接口的 LCD 来说,通常无内置 GRAM,FrameBuffer Strategy 无法使用 Partial Buffer 策略。在 RAM 足够时,可选择 Double Buffer 策略。存放位置选择 By Allocation。这个可以通过链接文件配置放置在什么位置。6 y  ]' Y2 @$ z3 h9 \
Application Tick Source:应用滴答时钟来源,选择 LTDC,它的实现代码可以在 TouchGFXGeneratedHAL.cpp 中 HAL_LTDC_LineEventCallback 函数找到。
" f7 ~# G* r  W, o3 p; k5 [) S
, l8 X" E& G3 ?+ a
29.png
▲ 图18. TouchGFX 配置

# [8 P: ^) \3 b, O- C2 C

: V9 o: b8 \; i2.14.Clock Configuration , N0 \/ R8 N: [# o: Q7 T
系统时钟配置为 216MHz,LTDC 时钟配置为 9.6MHz,这个 LTDC 时钟的配置是参 考 LCD 时序参数表确定的,它与 LCD 的刷新率相关。+ `" S, w( ?* W$ l) C! Z1 X9 k
) C- y& u7 p" o: e
30.png
▲ 图19. 时钟树配置
' h( ^; u! I4 L2 U* `! I
至此,外设配置基本完成,选择所使用的 IDE(这里选择的是 STM32CubeIDE),点 击 Generate Code 按钮,生成代码。然后使用 TouchGFX Designer 打开 TouchGFX 文 件夹下的 ApplicationTemplate.touchgfx.part,在 TouchGFX Designer 中生成 UI 相关 代码。
: \" z$ V# C8 I$ X: |9 |) X% l* [0 S  c! v$ L. R4 l
: L! r/ s6 O) [% J9 m) t( ^1 b
3
: Z3 J" v( h1 m0 u6 ^& \  |添加驱动代码 9 L( w) n: K! J
对于 LTDC 接口的 TouchGFX 工程,使用 TouchGFX Desiger 生成代码后,如果仅使 用内部 RAM 和 Flash,那么在 TouchGFX 生成代码后,整个软件架构就建好了,可以使 用 TouchGFX 来点亮屏幕了。
6 \0 ]$ o, F# ]! t* F3 ~2 g2 I' [" W$ z+ }  B: w* D
对于使用外部 SDRAM、 QSPI Flash 以及触摸功能的应用可以参考下载的 TBS 进行对 照检查,添加相应的驱动代码和修改链接文件,完善整个工程代码后实现 TouchGFX 点亮 LCD 的效果。- @2 C9 W+ ]: p! e
: r9 j0 D2 A: Q0 E) u3 g
8 B3 k1 M& f) w5 T) }
3.1. 添加 SDRAM 驱动代码
! X  i3 x: e) [6 `; H/ l$ e查看下载的 TBS,可以在 main.c 中的 MX_FMC_Init()函数的用户代码区域看到添 加的驱动代码。这里有一点要说明的是最后的 FMC_Bank1->BTCR[0] = 0x000030D2 代 码是禁用 FMC bank1,这点在 AN4861 的 4.6.1 Disable FMC bank1 if not used 有详 细介绍。为了防止 FMC bank1 上的 CPU 推测性读取访问,建议在不使用时将其禁用。这可以通过复位 FMC_BCR1 寄存器中的 MBKEN 位来完成,默认情况下该位在复位后使能。5 n0 j% G* ?5 Y7 U* S4 I/ R- \

- A3 D1 x+ r8 L1 f, l% s" N
8 S' @5 q. O. Q. Z$ K4 G' f
3.2. 添加 QSPI Flash 驱动代码
/ K# g/ l7 W: Q0 K添加驱动代码把 QSPI Flash 配置成 memory mapped 模式。
) z. b' E$ g# G. n3 P; x( B1 w) L* `8 k, G4 h
0 }' h- H* b1 p8 e. K8 @  F1 i
3.3. 添加 Touch 功能 3 ~( b5 {) s: r$ u, o' h
触摸功能在 STM32TouchController.cpp 中实现,具体代码请参考 TBS。
9 a4 r4 j4 z( C# v7 l; X3 s; _/ s# G1 P7 j

+ ?7 t+ ^' q! _- n- v3 X. G' ~3.4. 修改链接文件& y2 h7 @- E" {  g
为了把帧缓冲区和视频缓冲放到外部 SDRAM,把字体、图片等素材放到外部 Flash, 需要修改链接文件。不同的 IDE,它的链接文件是不同的。对于 STM32CubeIDE,它的 链接文件是 STM32F746NGHX_FLASH.ld,对于 EWARM,它的链接文件是 stm32f746xx_flash.icf,对于 MDK-ARM,它的链接文件是 STM32F746G_DISCO.sct, 它们的语法略有不同。大家可以参考它的结构进行修改。
6 f) Y+ r$ e3 E4 J7 R  U/ a; S' ^7 t1 N- @; H
2 J2 D+ g9 j3 o# b3 i
4; {6 G3 X! B& Z; h2 t) M; M
小结 ' E* s& N1 @3 @: n( D
以上就是 LTDC RGB 接口 LCD 的 TouchGFX 工程的移植步骤,本文档对关键步骤进 行了解释说明,具体细节可参考 AN4861 和官方的 TBS。  N$ @( C! B: N! n2 Z
7 o! A" `2 x$ w  v
, ?1 O6 y1 }8 K2 R# B  Y  c
▼▼▼
点击按钮下载《LTDC RGB 接口 LCD TouchGFX 工程的移植步骤》原文档。0 F* Q5 w9 U. q) e7 F; f+ x
点击下载
- {! y1 p" t& F  k: a# A" ^
+ o5 K; R/ s7 x5 x1 O/ M% ]0 W
收藏 评论2 发布时间:2025-2-6 09:47

举报

2个回答
电子烂人 回答时间:2025-2-8 10:51:28

挺有趣的,抽空试一下移植到H743上

STMCU-管管 回答时间:2025-2-12 13:51:17

电子烂人 发表于 2025-2-8 10:51
挺有趣的,抽空试一下移植到H743上

可以试试

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版