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

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

[复制链接]
STMCU-管管 发布时间:2025-2-6 09:47
1$ u- x. z2 j5 r3 R
引言  i: t9 B! h9 ]9 h/ [: e3 d' A4 f
文档基于 STM32F746G_DISCO 硬件平台,参考从 TouchGFX Designer 下载的 STM32F746 的 TBS(TouchGFX Board Setup),讲解 STM32CubeMX 相关配置,介绍了LTDC RGB 接口 LCD 的 TouchGFX 工程的移植步骤。 2 H+ I0 a6 g" q: y4 e9 N' T
12.png
▲ 图1. TouchGFX Designer 中的 STM32F746G_DISCO TBS
5 [8 ~# D( ?# Q% W( N# f  v

" _3 ?; v! n3 `0 @2 a* p( Q; o2
& u4 y+ ^5 N0 }# U7 i+ PSTM32CubeMX 配置过程
% _4 R1 J: v  h( x3 fSTM32F746G_DISCO 有两个外部存储器,SDRAM 和 QSPI Flash,SDRAM 用于帧缓冲器,QSPI Flash 用于存储图片、字体等素材,其图形实现过程如图 1 所示。本文档参考从 TouchGFX Desinger 上下载的 TBS,第一步首先完成 IOC 文件的配置,由于会使用 外部 RAM 和外部 Flash,生成代码后还需要添加相应的存储器驱动代码,以及修改链接文件。对于仅使用内部 Flash 和内部 RAM 的应用,用 STM32CubeMX 和 TouchGFX Desinger 生成代码后,就可以直接使用 TouchGFX 点亮屏幕了。
0 H- @& Q/ N9 e% q& X! n
13.png
▲ 图2. 图形实现过程

$ T( m( P) g9 C4 V0 b2.1. 新建 IOC 工程 " {- [0 ~7 R) v7 x
0 c( B, o8 u% r* ^, z. [
* s% u6 n0 ]6 V) G
双击打开 STM32CubeMX 软件,按照图中 1-5 步骤操作,MCU 型号输入 STM32F746NGH6 进行选择,其中第 5 步提示配置默认 MPU 单元来优化内核的推测性 读取访问,请点击“YES”。 & A% P* q8 q: H/ j3 I
14.png
▲ 图3. 新建 STM32CubeMX 工程
然后点击“Project Manager”,配置工程名称,如图所示。 ; a$ \5 D0 g% F( ]' _, C0 g
15.png
▲ 图4. 配置工程名称
/ w6 I2 n- `8 a

4 r3 I, Q  I* D' I% S. `; s) h+ g+ o! S2.2. CORTEX_M7
6 Q" _4 b9 A" A$ ?8 n4 r
0 c' H* ?7 o3 I0 x

7 V/ L. ?& ~: A7 [6 B3 J/ r. M这里使能 ICACHE 和 DCACHE,并配置内存保护单元 MPU,要正确配置 MPU 属性 以避免由 Cortex®-M7 推测性读取访问和缓存维护引起的图形性能问题,使用 STM32CubeMX 可以轻松配置 MPU 存储器属性。详细配置过程可以参考 AN4861 4.6 小节 Special recommendations for Cortex-M7 (STM32F7/H7),其中介绍对嵌入了 Cortex®-M7 CPU 的 STM32F7 系列的一些建议,建议大家仔细阅读下。. ]; u/ |- ^- {% [) Z, y
7 e2 k. W7 y4 [$ x

7 s  v. ?0 g; R" W2.3. CRC ) Y( L9 q* P; Q, y8 m, g

6 O8 ~% h& E5 c; R7 d

6 Q, K/ w9 A7 {/ r2 U3 ~) F) DCRC 是循环冗余校验计算单元,如果要使用 TouchGFX,必须要使能 CRC,其配置保 持默认即可。, h6 e9 S* \+ ^6 W0 }' `9 ]! ?

2 ^3 }0 q$ Q7 l" `9 u3 U7 B

7 m$ l6 g* @/ x) I; V! S
16.png
▲ 图5. 使能 CRC
8 L1 f, J3 E; `* N3 l2 i
2.4. DMA2D
4 z6 [  y2 y, d, f' x) f# [$ r: Z% s7 [- p% ~4 ]  S+ f3 [! p# c

, Y! o2 y7 m8 q6 ]DMA2D 是 AHB 总线矩阵上的主设备,它将图形数据传输到内存,也可用于图形渲 染,建议使用 DMA2D 来减轻 CPU 负载。DMA2D 使能后保持默认配置即可,当需要 DMA2D 来进行图形加速时,TouchGFX 引擎会自动调用 DMA2D。
# q+ f7 I* G0 N7 p) z2 P
/ h9 W! w2 z) b& n( U: u
17.png
▲ 图6. 使能 DMA2D

  i% G& A. }% k7 o2.5. FMC 配置 LTDC 帧缓存区和 Video 缓冲区放在了外部 SDRAM 中。配置 FMC 相关参数时,需 要对照原理图和 SDRAM 的 datasheet,了解相关参数,然后进行配置。配置结束后,需 要添加相应的驱动代码,将其配置内存映射模式。 0 E% B( w9 y2 u) ~3 z% W
18.png
▲ 图7. FMC 配置

6 s. _; b; Y( ~: Q

, l" y" J- t1 r& I0 S2.6. FREERTOS ' o, S- y+ F8 W, B
, g" x3 J! Q6 @) |: R
5 N5 n+ {$ |2 s2 p
TouchGFX 可以运行在有 RTOS 和无 RTOS 的工程中,本工程移植的是带有 RTOS, RTOS 选择 FreeRTOS,在本工程中新增了 2 个 task,TouchGFXTask 任务用于运行ToucGFX 图形引擎,VideoTask 任务用于进行 Mjpeg 视频的编解码,如果您的项目不用 video 控件,那么 videoTask 可以不用添加。) Y7 E# n5 g0 @$ c% C( v. H7 U# W
19.png
▲ 图8. FreeRTOS 新增任务
( e; w) X2 x% j

* t6 {( I, O4 E" Y+ }8 O注意新增总的堆空间大小,防止新建任务的栈大小不足。
- }) z0 I, n2 ]
- I/ M0 a" ?& x) ^. ?/ S

. k" d( O, q! g# H5 N
20.png
▲ 图9. 堆空间大小配置
& Y+ x$ i- W9 H0 b1 E
2.7. GPIO
# \, y- t' S" E; i8 V1 l* H! n2 q4 S0 _, i0 A$ ~+ B' e9 ^# l  H

7 X, ^  i3 p) E" s& b在官方下载的 TBS,配置的 GPIO 如图 9 所示。与 LCD 显示相关的引脚有 2 个, LCD_DISP 和 LCD_BL_CTRL。LCD_DISP 用来启用/禁用显示待机模式,需要将 LCD_DISP 配置为高电平来启用显示器,否则显示器将保持待机模式。LCD_BL_CTRL 信 号上的高电平可以点亮背光,而低电平则将其关闭。
$ j- x* e, D6 c3 C' {' I. [  L; C3 y) V6 r; x  Z
; f( ^, V' q- z$ }+ x1 U
另外几个 GPIO 引脚可以用来测试性能的,它们的解释说明可以查看 TouchGFXGPIO.cpp 中注释,其中 RENDER_TIME,可以用来查看实际的渲染时间。3 W6 L$ X: J0 e
  S  V: O: A. ~7 f, c% I
% p$ P+ ~# J5 S$ F6 w
21.png
▲ 图10. GPIO 配置
& r4 i- ~" |  \3 T3 Z
2.8. I2C3
* z( Z2 l2 |4 v7 ~8 |  O, N9 f+ d9 N5 q2 s2 ?4 ^% z
% P7 D. e# e( A0 `$ p. o& C
STM32F746G_DISCO 的电容 LCD 的触摸的接口是 I2C3 的 PH7 和 PH8,相关参数 的配置参数如图所示。
3 ^: C, ~- V" H- j, D0 g1 t- U/ J: N- a' l. w; ^
22.png
▲ 图11. I2C3 配置
( _/ g+ o9 k4 h4 b# ~' ]6 _  ~
0 N' d$ [6 t" k7 G
2.9. LIBJPEG
4 ?( p% j  B3 f
1 s! v0 u3 L1 o& T( m1 W* q

: E9 P) i/ W3 X% }# s7 o如果 TouchGFX 使用 Video 控件,要使能 LIBJPEG,用于视频流的软件编解码。如果 您的工程用不到 Video 控件,那么可以不用使能 LIBJPEG。
6 K+ d8 R) C. Q1 K9 D" s) s' s! i. [- }1 @7 s5 U$ B2 k
23.png
▲ 图12. GPIO 配置
, i2 o' q! q2 p2 {

: h9 C; f" a) S2.10. LTDC
% q/ X) c" n6 V* k
2 t# r" S( V. @1 J% d: k% f

" ~+ f% b5 Z5 ?LTDC 外设主要用来配置 LCD 显示接口,对于 STM32F746G_DISCO 的 LCD 可以参 考下载的 TBS 进行配置。如果是其他型号的 LCD,需要查看 LCD 的屏幕时序表进行配 置。关于 LTDC 的 layer,虽然在 STM32CubeMX 可以配置为 2 个 layers,但是 TouchGFX Designer 是采用 1 个 layer 来做 GUI 开发的,这是因为 2 个 layer 会占用更 多带宽,同时打开 LTDC 全局中断和错误中断。# k) o* S5 Y0 W% a0 P6 N3 u7 U, m- S

3 j/ s; q0 s' H  W6 o
24.png
▲ 图13. LTDC 参数配置

: g7 s  X3 }/ i) a( P, R
25.png
▲ 图14. LTDC layer 配置
26.png
▲ 图15. 打开 LTDC 全局中断和错误中断

3 K9 g1 x5 Q% ?0 g, @6 ?
4 r& ]" Q! M8 H. E; }% Y5 w
2.11. QUADSPI 5 i! b7 e. Y% N5 }
当要存储的数据量相对较少时,可以使用内部 FLASH 存储器。否则,应将图形内容放 置在外部存储器中。QUADSPI 外接了一个 128-Mbit Quad-SPI NOR Flash。
! s1 G$ V/ v0 j; X- S3 m
& f; w% j( t# ^6 ^% g4 x
27.png
▲ 图16. QUADSPI 配置
, {0 z6 D) f3 Q5 M5 [$ N
* t1 Z9 U" x+ p0 V* [. N: k; `" u
2.12.SYS
7 S: o7 \; j$ `由于 SysTick 被 RTOS 使用,这里 HAL 库的时基选择 TIM6。
( R, g" A6 Y7 }9 P; v; f, F4 ?$ m: V' Z4 e& E
28.png
▲ 图17. 系统时钟配置

' L) p8 t( y- x1 i  X( C$ _

  u/ X. d. q+ J; U3 f1 l/ o  H2.13. X-CUBE-TOUCHGFX # ]: E* u- j) y5 X9 |4 G3 h
Interface:接口选择 Parallel RGB(LTDC) ) b3 z0 Q0 _7 z
对于 RGB 接口的 LCD 来说,通常无内置 GRAM,FrameBuffer Strategy 无法使用 Partial Buffer 策略。在 RAM 足够时,可选择 Double Buffer 策略。存放位置选择 By Allocation。这个可以通过链接文件配置放置在什么位置。
( C9 H5 u3 A2 zApplication Tick Source:应用滴答时钟来源,选择 LTDC,它的实现代码可以在 TouchGFXGeneratedHAL.cpp 中 HAL_LTDC_LineEventCallback 函数找到。
6 F9 p0 \- H0 Q" ?7 k8 Q
3 F/ s5 S6 H' s% A8 i8 o5 E
29.png
▲ 图18. TouchGFX 配置

0 Y" R9 e4 v' K! T. o
0 }6 ?- n9 o) y, u/ @
2.14.Clock Configuration $ k: O+ u+ \- M, e$ ~
系统时钟配置为 216MHz,LTDC 时钟配置为 9.6MHz,这个 LTDC 时钟的配置是参 考 LCD 时序参数表确定的,它与 LCD 的刷新率相关。# T$ H0 f* ]3 a; O9 f: m/ H

" P, {* D0 l& c, z
30.png
▲ 图19. 时钟树配置
6 U! Y% H! h% F) b4 T# F
至此,外设配置基本完成,选择所使用的 IDE(这里选择的是 STM32CubeIDE),点 击 Generate Code 按钮,生成代码。然后使用 TouchGFX Designer 打开 TouchGFX 文 件夹下的 ApplicationTemplate.touchgfx.part,在 TouchGFX Designer 中生成 UI 相关 代码。
) g- \; E; `) p* Y; @
9 w" J1 d, C) ?: p; z8 Q# u
$ P% c- ~$ c% o7 Q
3
' h. i7 t/ R+ T添加驱动代码
$ b$ A# i% u% O! g9 Q( r7 m对于 LTDC 接口的 TouchGFX 工程,使用 TouchGFX Desiger 生成代码后,如果仅使 用内部 RAM 和 Flash,那么在 TouchGFX 生成代码后,整个软件架构就建好了,可以使 用 TouchGFX 来点亮屏幕了。6 ^0 ?& L  [( n4 e

! x: V; n* I6 l' a# B7 g4 r对于使用外部 SDRAM、 QSPI Flash 以及触摸功能的应用可以参考下载的 TBS 进行对 照检查,添加相应的驱动代码和修改链接文件,完善整个工程代码后实现 TouchGFX 点亮 LCD 的效果。
% Q/ E8 T- w# m5 `! {/ T7 [, _- M9 w, R: x* f* H
' t; D8 l8 |' H% u# K0 }4 ~$ Q$ y! U
3.1. 添加 SDRAM 驱动代码
2 t/ V) f+ P" ~$ \( h7 y. u查看下载的 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 W/ J' `9 _1 g1 N

0 C# Z9 k0 n; A) z+ w
2 R+ j  D. O* ?% }1 a" R1 m) Q
3.2. 添加 QSPI Flash 驱动代码
  U, n; W/ ~: r- Z" t添加驱动代码把 QSPI Flash 配置成 memory mapped 模式。* l% X( V) r$ w* K7 N9 Q* F, _% P

/ @% T) O# c* T4 O

, a6 |$ z5 e9 S% d) U7 I3.3. 添加 Touch 功能
& l4 o1 M5 w) e触摸功能在 STM32TouchController.cpp 中实现,具体代码请参考 TBS。
; A. _& o1 H" C* G9 ^- N
. A' [! f: _' b" ~. j) p) H. P/ Y

  u, D9 Z! \1 R* F- i3.4. 修改链接文件
* ]' l6 O: h' @. N3 `9 `9 [为了把帧缓冲区和视频缓冲放到外部 SDRAM,把字体、图片等素材放到外部 Flash, 需要修改链接文件。不同的 IDE,它的链接文件是不同的。对于 STM32CubeIDE,它的 链接文件是 STM32F746NGHX_FLASH.ld,对于 EWARM,它的链接文件是 stm32f746xx_flash.icf,对于 MDK-ARM,它的链接文件是 STM32F746G_DISCO.sct, 它们的语法略有不同。大家可以参考它的结构进行修改。+ r+ T* ?# J0 x; ~
6 V  q6 `: i! T& V% E
, r; T! y. p9 w: q- @6 l
4) s% n1 X0 E  i9 K$ R$ e9 @0 f7 T
小结
1 _. H+ w* s2 r# \3 }3 h& `以上就是 LTDC RGB 接口 LCD 的 TouchGFX 工程的移植步骤,本文档对关键步骤进 行了解释说明,具体细节可参考 AN4861 和官方的 TBS。6 m: K) }. L6 _  t/ Z- T
4 I0 b. O, r' D, s
7 e. Q. k0 m, \- \+ i. Y8 O
▼▼▼
点击按钮下载《LTDC RGB 接口 LCD TouchGFX 工程的移植步骤》原文档。
% }3 E2 x$ C! J" n  C0 b点击下载/ T! _' v6 X6 M( `2 s2 l* ^

! b7 K! |& N9 P4 `
收藏 评论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 手机版