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

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

[复制链接]
STMCU-管管 发布时间:2025-2-6 09:47
1
- \! |7 w6 D& O/ C* o引言
% o5 X* m% V4 M& W! c- B/ @文档基于 STM32F746G_DISCO 硬件平台,参考从 TouchGFX Designer 下载的 STM32F746 的 TBS(TouchGFX Board Setup),讲解 STM32CubeMX 相关配置,介绍了LTDC RGB 接口 LCD 的 TouchGFX 工程的移植步骤。
  U* Z# m, V# a1 y8 l! A* M% d
12.png
▲ 图1. TouchGFX Designer 中的 STM32F746G_DISCO TBS
- f$ a6 N7 _4 I' U% U9 {/ e
: [; a- e8 u' i1 c' i$ a
2
3 {, I: ]7 }/ j7 |" V; i6 QSTM32CubeMX 配置过程
7 ?6 J; [8 b& u+ w; l: O; N' MSTM32F746G_DISCO 有两个外部存储器,SDRAM 和 QSPI Flash,SDRAM 用于帧缓冲器,QSPI Flash 用于存储图片、字体等素材,其图形实现过程如图 1 所示。本文档参考从 TouchGFX Desinger 上下载的 TBS,第一步首先完成 IOC 文件的配置,由于会使用 外部 RAM 和外部 Flash,生成代码后还需要添加相应的存储器驱动代码,以及修改链接文件。对于仅使用内部 Flash 和内部 RAM 的应用,用 STM32CubeMX 和 TouchGFX Desinger 生成代码后,就可以直接使用 TouchGFX 点亮屏幕了。 & T( ?$ k9 K% \
13.png
▲ 图2. 图形实现过程

9 v1 c$ ?6 I5 E4 P- s2.1. 新建 IOC 工程
& p7 m- Z% I. P7 t- N& j0 ]: t9 q7 d( r, a) M$ c

; A" Y. k: z$ Y6 F3 h1 ?双击打开 STM32CubeMX 软件,按照图中 1-5 步骤操作,MCU 型号输入 STM32F746NGH6 进行选择,其中第 5 步提示配置默认 MPU 单元来优化内核的推测性 读取访问,请点击“YES”。
8 F& C+ n! C2 q! L' B) d1 ]& S
14.png
▲ 图3. 新建 STM32CubeMX 工程
然后点击“Project Manager”,配置工程名称,如图所示。
! N" _1 s$ }, `$ U  b: c% T" R, l
15.png
▲ 图4. 配置工程名称
  t3 \' Y7 u. Z% W" G  U

% u- p: N  w( ]. J" n2.2. CORTEX_M7
2 m- D) ~$ u+ i  J2 R7 t0 n) c& ^, s, _% }
) M% c, S& t& ?0 c) H2 j
这里使能 ICACHE 和 DCACHE,并配置内存保护单元 MPU,要正确配置 MPU 属性 以避免由 Cortex®-M7 推测性读取访问和缓存维护引起的图形性能问题,使用 STM32CubeMX 可以轻松配置 MPU 存储器属性。详细配置过程可以参考 AN4861 4.6 小节 Special recommendations for Cortex-M7 (STM32F7/H7),其中介绍对嵌入了 Cortex®-M7 CPU 的 STM32F7 系列的一些建议,建议大家仔细阅读下。
) q5 ]) T0 d5 e* {( V! s/ t, K  n, q; P  ^5 H
8 _; Y9 D  }; ?5 Z9 j0 d5 K. ?, }
2.3. CRC
! V) s9 J- w+ _" J; V" [# s, }1 B5 t$ |; F

$ o& N9 c. D( F2 h" v" ZCRC 是循环冗余校验计算单元,如果要使用 TouchGFX,必须要使能 CRC,其配置保 持默认即可。
2 m3 W0 H, [. _+ [$ v  t. A! C( t4 J3 G& w, Z0 Y
" Z$ k- s3 w" [: B  d! O
16.png
▲ 图5. 使能 CRC
# M+ {8 U3 S. c- y& M
2.4. DMA2D ) I% ?: r* b9 [0 M

" b, w6 e8 ]2 J  p: Y
7 M- v% n+ Q0 p3 g% T  {
DMA2D 是 AHB 总线矩阵上的主设备,它将图形数据传输到内存,也可用于图形渲 染,建议使用 DMA2D 来减轻 CPU 负载。DMA2D 使能后保持默认配置即可,当需要 DMA2D 来进行图形加速时,TouchGFX 引擎会自动调用 DMA2D。
1 K9 W/ o; J* q% c
. t$ v: D6 }1 t
17.png
▲ 图6. 使能 DMA2D

7 d6 K5 e4 |9 U2 W& J/ a2.5. FMC 配置 LTDC 帧缓存区和 Video 缓冲区放在了外部 SDRAM 中。配置 FMC 相关参数时,需 要对照原理图和 SDRAM 的 datasheet,了解相关参数,然后进行配置。配置结束后,需 要添加相应的驱动代码,将其配置内存映射模式。 ' v* d' c0 Q% k/ X
18.png
▲ 图7. FMC 配置
/ D* p# e+ D2 x  x
. [, |7 g' D, u
2.6. FREERTOS ( S' u  T" V, ~5 ]' H* c

, i! r% p7 c# r% {
, F; x% w1 m5 K9 z( h  w2 c9 \
TouchGFX 可以运行在有 RTOS 和无 RTOS 的工程中,本工程移植的是带有 RTOS, RTOS 选择 FreeRTOS,在本工程中新增了 2 个 task,TouchGFXTask 任务用于运行ToucGFX 图形引擎,VideoTask 任务用于进行 Mjpeg 视频的编解码,如果您的项目不用 video 控件,那么 videoTask 可以不用添加。8 b7 F% a3 [" R' O1 C2 X; V
19.png
▲ 图8. FreeRTOS 新增任务

. W! s- f* D$ @$ I+ A8 @  A
8 ], A% q1 B" g8 S- `( `5 i; g
注意新增总的堆空间大小,防止新建任务的栈大小不足。
* U0 B! R5 d. P  J, N
7 J, Q- n( D. x3 Z! L
% \: k. V! S8 U
20.png
▲ 图9. 堆空间大小配置
$ h8 H. H# B; `& T. n* @
2.7. GPIO 2 t. g. ^' N5 Z5 x  Q, f) ]5 Y

; R0 F, u+ }; v/ s. P2 |% e, z
$ i& l$ ?# s) d
在官方下载的 TBS,配置的 GPIO 如图 9 所示。与 LCD 显示相关的引脚有 2 个, LCD_DISP 和 LCD_BL_CTRL。LCD_DISP 用来启用/禁用显示待机模式,需要将 LCD_DISP 配置为高电平来启用显示器,否则显示器将保持待机模式。LCD_BL_CTRL 信 号上的高电平可以点亮背光,而低电平则将其关闭。
4 H) t$ N2 n8 c9 J' n) R
$ s4 X9 P/ V* U

& R% s  f1 Y5 Q0 M6 v, l( @$ J另外几个 GPIO 引脚可以用来测试性能的,它们的解释说明可以查看 TouchGFXGPIO.cpp 中注释,其中 RENDER_TIME,可以用来查看实际的渲染时间。
; i: A' i# U  M, v+ h/ [# A8 p0 p( h( A1 J# }: \

1 ^2 q9 ^$ ^( O, S0 K, B; O
21.png
▲ 图10. GPIO 配置

3 x: u* C/ m5 X' m* O3 O2.8. I2C3
7 ]9 y4 [; S4 ~. G& u# ^
; _( H3 ~+ @6 D  m5 v; Q2 M: I: Z

8 w) r5 c2 U, W# G: r' M4 ]6 m) J' D4 bSTM32F746G_DISCO 的电容 LCD 的触摸的接口是 I2C3 的 PH7 和 PH8,相关参数 的配置参数如图所示。
, b* V- D7 t5 V6 [6 Y5 U- e' C; W  N5 `5 U' A  r. f
22.png
▲ 图11. I2C3 配置

5 {+ m' D: g$ r. R. [0 Y2 J
' r$ g9 v5 T. C! x: u" h5 c* \
2.9. LIBJPEG 6 i- ]; C2 `; V! A/ Y& t) x$ l

. [+ W, E# u( Z. E

- B+ u+ W" \+ I1 p+ H如果 TouchGFX 使用 Video 控件,要使能 LIBJPEG,用于视频流的软件编解码。如果 您的工程用不到 Video 控件,那么可以不用使能 LIBJPEG。. a2 C" ^0 p* q, w; e

8 H  C% n9 F2 j  w, u/ a* b2 A
23.png
▲ 图12. GPIO 配置
2 H( _3 V# l% A

1 x) h0 _. {' u6 j: `2.10. LTDC 3 t8 F  k1 c1 n+ v2 r/ ~

$ K; d. ^" Z7 H- @' {2 u
; f/ g% B, b3 M% d
LTDC 外设主要用来配置 LCD 显示接口,对于 STM32F746G_DISCO 的 LCD 可以参 考下载的 TBS 进行配置。如果是其他型号的 LCD,需要查看 LCD 的屏幕时序表进行配 置。关于 LTDC 的 layer,虽然在 STM32CubeMX 可以配置为 2 个 layers,但是 TouchGFX Designer 是采用 1 个 layer 来做 GUI 开发的,这是因为 2 个 layer 会占用更 多带宽,同时打开 LTDC 全局中断和错误中断。: N- p; s$ x6 R9 `! N

9 o" u! ]' m2 ^6 [' t3 ]
24.png
▲ 图13. LTDC 参数配置
2 n0 F% b8 k! h9 V% w* J3 g0 @
25.png
▲ 图14. LTDC layer 配置
26.png
▲ 图15. 打开 LTDC 全局中断和错误中断
( w' Q2 r! M; Z7 D' Q  z

9 `$ U$ |9 J0 |7 J$ }2.11. QUADSPI * q! Q+ e$ ~: y; V3 U& K! K
当要存储的数据量相对较少时,可以使用内部 FLASH 存储器。否则,应将图形内容放 置在外部存储器中。QUADSPI 外接了一个 128-Mbit Quad-SPI NOR Flash。
! b, G- ^8 k& X4 s5 L0 Z, K4 i4 x& K; b* J
27.png
▲ 图16. QUADSPI 配置

; Y0 f2 Y6 Q8 v- ~

5 w- _' z9 {$ u( |7 S8 x2.12.SYS
. k7 _" M# j) P" w$ d由于 SysTick 被 RTOS 使用,这里 HAL 库的时基选择 TIM6。
& N5 _5 H7 o3 v$ V$ }4 N, Y
( p; ]! o' x. q1 W' b6 F- V
28.png
▲ 图17. 系统时钟配置

  n& i& v" c* i; |) k

. T7 Y' u7 {: t( X2 \: U  g2.13. X-CUBE-TOUCHGFX
! D; ~5 b8 n* @: n- k+ EInterface:接口选择 Parallel RGB(LTDC)
3 P0 I1 \1 N1 ]6 Y9 D+ j/ N对于 RGB 接口的 LCD 来说,通常无内置 GRAM,FrameBuffer Strategy 无法使用 Partial Buffer 策略。在 RAM 足够时,可选择 Double Buffer 策略。存放位置选择 By Allocation。这个可以通过链接文件配置放置在什么位置。
$ n$ }) k1 i7 r& |0 yApplication Tick Source:应用滴答时钟来源,选择 LTDC,它的实现代码可以在 TouchGFXGeneratedHAL.cpp 中 HAL_LTDC_LineEventCallback 函数找到。
+ I9 l% B% _! B1 @
. B( {1 y, Z( s' k2 P
29.png
▲ 图18. TouchGFX 配置
: w8 q1 j% N/ z- P$ P% y# B1 x! q
- l; v* Q; p8 P/ O! M2 P
2.14.Clock Configuration
/ h& |% f7 s0 D$ b1 J; z( q* `$ A/ X系统时钟配置为 216MHz,LTDC 时钟配置为 9.6MHz,这个 LTDC 时钟的配置是参 考 LCD 时序参数表确定的,它与 LCD 的刷新率相关。
/ }" u9 O2 h8 q: l7 `
; s1 {, E& B3 Q+ @) _: X
30.png
▲ 图19. 时钟树配置

  d  ~* i$ ^& |, T! r% I至此,外设配置基本完成,选择所使用的 IDE(这里选择的是 STM32CubeIDE),点 击 Generate Code 按钮,生成代码。然后使用 TouchGFX Designer 打开 TouchGFX 文 件夹下的 ApplicationTemplate.touchgfx.part,在 TouchGFX Designer 中生成 UI 相关 代码。
, s5 r* Q# B& ~  E) n! _) q) W9 F( |% f% _" h6 w6 Q  Y, g
- S( b. S& q; j
3
, B" y: j4 ~2 `  B添加驱动代码
# R0 t3 r( i& g9 r4 a+ H对于 LTDC 接口的 TouchGFX 工程,使用 TouchGFX Desiger 生成代码后,如果仅使 用内部 RAM 和 Flash,那么在 TouchGFX 生成代码后,整个软件架构就建好了,可以使 用 TouchGFX 来点亮屏幕了。( Z9 K7 B. H% C9 i) `2 B

0 ]4 d' p; R  g" U4 H对于使用外部 SDRAM、 QSPI Flash 以及触摸功能的应用可以参考下载的 TBS 进行对 照检查,添加相应的驱动代码和修改链接文件,完善整个工程代码后实现 TouchGFX 点亮 LCD 的效果。
+ r4 x) V& i2 }& R; d$ ]/ t0 W0 T. ]2 |" |: @& M6 w' d3 e3 p

: r4 u7 `4 D, {. n" [3.1. 添加 SDRAM 驱动代码
+ N) B) `4 W& S  Q, \0 |& G' b/ x2 ^查看下载的 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 位来完成,默认情况下该位在复位后使能。
$ S' Y8 H- x% M0 c( I( `. ]
! R  u; Q& V* R
8 s" W/ H4 f/ ^" Q$ V
3.2. 添加 QSPI Flash 驱动代码
' f. h0 C! H' c+ G3 F* |8 H/ t( Q添加驱动代码把 QSPI Flash 配置成 memory mapped 模式。
4 W' o3 K% j2 Z8 q4 ]
6 k9 q4 D/ p) Z# t! H, V
/ L* J4 R% E5 H0 h, D3 d2 J
3.3. 添加 Touch 功能 1 h( z3 ^% i* ~1 ?6 o! q# E& `# e
触摸功能在 STM32TouchController.cpp 中实现,具体代码请参考 TBS。
6 m# O: f0 [% q; r! Z4 X" A
) m% d, Z  E6 z1 w

1 ?6 Z2 u. I3 J; p3.4. 修改链接文件
# f5 x5 \" j4 ]. [# c( L为了把帧缓冲区和视频缓冲放到外部 SDRAM,把字体、图片等素材放到外部 Flash, 需要修改链接文件。不同的 IDE,它的链接文件是不同的。对于 STM32CubeIDE,它的 链接文件是 STM32F746NGHX_FLASH.ld,对于 EWARM,它的链接文件是 stm32f746xx_flash.icf,对于 MDK-ARM,它的链接文件是 STM32F746G_DISCO.sct, 它们的语法略有不同。大家可以参考它的结构进行修改。
& F% c+ q, w1 y6 H' O0 ?: d9 P0 {. f$ _1 Q  W$ E5 Y

' n" b+ T( e0 v( R0 d* d49 z! O  |' l% q0 c
小结 6 }; x  o6 S' M$ I  K6 r
以上就是 LTDC RGB 接口 LCD 的 TouchGFX 工程的移植步骤,本文档对关键步骤进 行了解释说明,具体细节可参考 AN4861 和官方的 TBS。
# c9 \9 ]! u- v! k7 W- B8 A/ ~: n3 S8 H4 G

$ p9 S* L- j( Z4 ]0 E
▼▼▼
点击按钮下载《LTDC RGB 接口 LCD TouchGFX 工程的移植步骤》原文档。
7 C8 r: R3 _9 S点击下载
: x& v# [" W3 O# ]2 I% j; V" {  q) l1 V" U% N# c# ^
收藏 评论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 手机版