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

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

[复制链接]
STMCU-管管 发布时间:2025-2-6 09:47
1
' H5 F" S8 W) B6 o. @1 ^' {' a引言
9 w/ ^3 P& _' x$ q文档基于 STM32F746G_DISCO 硬件平台,参考从 TouchGFX Designer 下载的 STM32F746 的 TBS(TouchGFX Board Setup),讲解 STM32CubeMX 相关配置,介绍了LTDC RGB 接口 LCD 的 TouchGFX 工程的移植步骤。 $ j0 V9 N4 |0 G: i9 S. c% \  a: @8 M
12.png
▲ 图1. TouchGFX Designer 中的 STM32F746G_DISCO TBS

6 L0 c7 s' X, r" k
' o9 q; a$ Z* S: Z* O* x2 ]
2 ( x& g) k( M7 J' W
STM32CubeMX 配置过程 , F! _5 s* k" V! |% t3 {: K
STM32F746G_DISCO 有两个外部存储器,SDRAM 和 QSPI Flash,SDRAM 用于帧缓冲器,QSPI Flash 用于存储图片、字体等素材,其图形实现过程如图 1 所示。本文档参考从 TouchGFX Desinger 上下载的 TBS,第一步首先完成 IOC 文件的配置,由于会使用 外部 RAM 和外部 Flash,生成代码后还需要添加相应的存储器驱动代码,以及修改链接文件。对于仅使用内部 Flash 和内部 RAM 的应用,用 STM32CubeMX 和 TouchGFX Desinger 生成代码后,就可以直接使用 TouchGFX 点亮屏幕了。
* g7 B* _7 h1 u& K
13.png
▲ 图2. 图形实现过程
/ q/ [! t0 D) e1 g- i
2.1. 新建 IOC 工程
! t8 v1 {- ^% I! H  Z  `! o$ L/ N/ w. }* X  Q$ K' q

2 P5 k" O; n- l  i双击打开 STM32CubeMX 软件,按照图中 1-5 步骤操作,MCU 型号输入 STM32F746NGH6 进行选择,其中第 5 步提示配置默认 MPU 单元来优化内核的推测性 读取访问,请点击“YES”。 0 a9 r8 b2 j1 I7 Q5 \/ s
14.png
▲ 图3. 新建 STM32CubeMX 工程
然后点击“Project Manager”,配置工程名称,如图所示。 5 \8 S4 P  I, m: u/ Z
15.png
▲ 图4. 配置工程名称

# R1 @+ ^' z4 D# m* J1 k/ W  _- t
; r$ Z1 a, |9 T& `! |
2.2. CORTEX_M7 ) l6 `8 k. O% h

* P( I8 U% @. n1 [) V

! F0 H+ {; f1 D% F3 J+ e& u这里使能 ICACHE 和 DCACHE,并配置内存保护单元 MPU,要正确配置 MPU 属性 以避免由 Cortex®-M7 推测性读取访问和缓存维护引起的图形性能问题,使用 STM32CubeMX 可以轻松配置 MPU 存储器属性。详细配置过程可以参考 AN4861 4.6 小节 Special recommendations for Cortex-M7 (STM32F7/H7),其中介绍对嵌入了 Cortex®-M7 CPU 的 STM32F7 系列的一些建议,建议大家仔细阅读下。% A4 W. f" I2 R" Y. q

7 O% G+ t! s& D0 ~: L  O
; b; ^3 `* Z8 A9 I) `
2.3. CRC
  ^& w& h6 D. R8 D& b- m
* O3 D( s5 V. O4 @8 t

% V% Q. o8 A3 R6 T! LCRC 是循环冗余校验计算单元,如果要使用 TouchGFX,必须要使能 CRC,其配置保 持默认即可。: [  @: Q2 R8 U2 @) S
9 M/ x' X" y3 f4 h

0 {' m' @$ \# t/ V* y. |- j
16.png
▲ 图5. 使能 CRC

' g+ Q9 M8 P! Z2.4. DMA2D ; x' A4 ~! w; j8 i/ c6 Z
2 o& w8 R( i. Q* V! }1 n/ d/ S

. y4 a9 m# q" @9 F' ~# g6 y# C- ]DMA2D 是 AHB 总线矩阵上的主设备,它将图形数据传输到内存,也可用于图形渲 染,建议使用 DMA2D 来减轻 CPU 负载。DMA2D 使能后保持默认配置即可,当需要 DMA2D 来进行图形加速时,TouchGFX 引擎会自动调用 DMA2D。 ! k3 R' t  M% w+ _) H; _

: r$ l" I8 K* q7 I
17.png
▲ 图6. 使能 DMA2D
2 Y6 o" E1 d  s" T
2.5. FMC 配置 LTDC 帧缓存区和 Video 缓冲区放在了外部 SDRAM 中。配置 FMC 相关参数时,需 要对照原理图和 SDRAM 的 datasheet,了解相关参数,然后进行配置。配置结束后,需 要添加相应的驱动代码,将其配置内存映射模式。 ) ^* K" {# Z: Z0 f. h# [& j
18.png
▲ 图7. FMC 配置
# k6 ?! ^( |' i5 B
9 D( Z( [0 s' c: O6 C1 _/ q" N: s1 e
2.6. FREERTOS / r! |% Z0 X6 D6 P+ ?4 J

! {8 H' j; Z& S; q% f

& Y6 t" q: R- I( C2 ?$ i  X0 O$ CTouchGFX 可以运行在有 RTOS 和无 RTOS 的工程中,本工程移植的是带有 RTOS, RTOS 选择 FreeRTOS,在本工程中新增了 2 个 task,TouchGFXTask 任务用于运行ToucGFX 图形引擎,VideoTask 任务用于进行 Mjpeg 视频的编解码,如果您的项目不用 video 控件,那么 videoTask 可以不用添加。
- A, X& e% {2 m8 j3 u
19.png
▲ 图8. FreeRTOS 新增任务
1 E% J( m; U) B/ g
2 Q4 U- ]2 _: [' ^7 w( _
注意新增总的堆空间大小,防止新建任务的栈大小不足。
+ b( Q1 r& I+ a2 ^& [( C. J! n# a" y% }0 y. ~( t

6 n  ?: Y3 X, [  Q5 v8 Z
20.png
▲ 图9. 堆空间大小配置
$ c6 X9 }9 E$ ?. V( T" I
2.7. GPIO ! K3 ?' X9 G! U2 H2 k. [

) d9 D3 a/ r" D% @. `

. S# N( w- e4 |  t在官方下载的 TBS,配置的 GPIO 如图 9 所示。与 LCD 显示相关的引脚有 2 个, LCD_DISP 和 LCD_BL_CTRL。LCD_DISP 用来启用/禁用显示待机模式,需要将 LCD_DISP 配置为高电平来启用显示器,否则显示器将保持待机模式。LCD_BL_CTRL 信 号上的高电平可以点亮背光,而低电平则将其关闭。" a8 v; x% o3 U1 z, X1 J

$ h( o: s& e9 n! x* O

; o) L% T9 _; Z, k* Y另外几个 GPIO 引脚可以用来测试性能的,它们的解释说明可以查看 TouchGFXGPIO.cpp 中注释,其中 RENDER_TIME,可以用来查看实际的渲染时间。
: J5 y1 D: e* ]9 o7 U( L% ]  e. a1 y5 U7 H  Y

5 Q# a. s! q  J0 J2 r; O$ H
21.png
▲ 图10. GPIO 配置
4 q% Y1 C' [: s8 n
2.8. I2C3
# r0 S8 i+ v+ e+ g+ V% z2 ]; ]3 ~
2 P0 f7 X9 W& U# C$ N: Q
. _. v5 V4 x( W. a& y9 x
STM32F746G_DISCO 的电容 LCD 的触摸的接口是 I2C3 的 PH7 和 PH8,相关参数 的配置参数如图所示。
8 A  m& |4 u" g: i
0 D2 S1 D- N$ q4 [9 T' j$ |
22.png
▲ 图11. I2C3 配置
7 o) a8 T( z& X' {% d, ]

$ x: Y9 a3 P2 P# A2.9. LIBJPEG 5 E0 M$ M: d5 R! y6 |6 m5 ^

: R$ V9 P4 t/ M( d! V" c

4 P0 q, F  Y3 x. U如果 TouchGFX 使用 Video 控件,要使能 LIBJPEG,用于视频流的软件编解码。如果 您的工程用不到 Video 控件,那么可以不用使能 LIBJPEG。3 S# {" |7 t7 m! j

9 {& |3 l+ d5 a) {! g& Z% t6 M
23.png
▲ 图12. GPIO 配置
, l9 @% p& ^7 p* X1 T. X3 M: y

; j5 `7 L9 ?3 x; f2.10. LTDC   j8 h; V$ _; Q$ V% h
2 L# r2 q( O) D0 B; G! t

" H9 O3 x( p3 O7 |1 B  O3 [, x3 tLTDC 外设主要用来配置 LCD 显示接口,对于 STM32F746G_DISCO 的 LCD 可以参 考下载的 TBS 进行配置。如果是其他型号的 LCD,需要查看 LCD 的屏幕时序表进行配 置。关于 LTDC 的 layer,虽然在 STM32CubeMX 可以配置为 2 个 layers,但是 TouchGFX Designer 是采用 1 个 layer 来做 GUI 开发的,这是因为 2 个 layer 会占用更 多带宽,同时打开 LTDC 全局中断和错误中断。
& E; @: ~6 d. P, z4 D) e. r% l/ V7 h  j; g. y- G  A7 C
24.png
▲ 图13. LTDC 参数配置

. L9 A, n9 `, H/ o. h
25.png
▲ 图14. LTDC layer 配置
26.png
▲ 图15. 打开 LTDC 全局中断和错误中断
$ b7 a; {. w) {- i( j4 ]

! C  m% F9 P5 a$ H# ^2 [- i2.11. QUADSPI
- O' {/ D' j" @  U; [) Q1 w& _: X. ^当要存储的数据量相对较少时,可以使用内部 FLASH 存储器。否则,应将图形内容放 置在外部存储器中。QUADSPI 外接了一个 128-Mbit Quad-SPI NOR Flash。
% Y! E8 ]# f; K. `- X/ K: H4 P# K
27.png
▲ 图16. QUADSPI 配置
( c7 V" o) T! W9 p& c; M+ ^
8 I6 ^( j# I* y( k& ]3 e+ _: s
2.12.SYS
6 ^- U/ p" H# U3 J+ M由于 SysTick 被 RTOS 使用,这里 HAL 库的时基选择 TIM6。
& w/ N9 p" F. v% g5 p$ S$ b- H2 r8 {  F9 m9 C3 c! L6 f
28.png
▲ 图17. 系统时钟配置
& V) L* u/ ~& c6 e

% ?8 r" B! F) o5 y! j6 e& C2.13. X-CUBE-TOUCHGFX 5 f6 I; n1 [5 H( P$ _' k; G. W
Interface:接口选择 Parallel RGB(LTDC) " n/ K* w$ O1 P; @4 F! V: F1 y2 V
对于 RGB 接口的 LCD 来说,通常无内置 GRAM,FrameBuffer Strategy 无法使用 Partial Buffer 策略。在 RAM 足够时,可选择 Double Buffer 策略。存放位置选择 By Allocation。这个可以通过链接文件配置放置在什么位置。
/ m. L* w" L% _0 J+ n. N: O( q0 _Application Tick Source:应用滴答时钟来源,选择 LTDC,它的实现代码可以在 TouchGFXGeneratedHAL.cpp 中 HAL_LTDC_LineEventCallback 函数找到。
& p: |( w$ I; g# x4 \; R- U9 H2 Z3 i1 N/ ]. n: r2 w5 j
29.png
▲ 图18. TouchGFX 配置

0 V* m. H/ X$ X( ?, b- M2 }0 P

& E  I) u$ o! \2.14.Clock Configuration
# X6 y( w7 ]5 A" P0 F系统时钟配置为 216MHz,LTDC 时钟配置为 9.6MHz,这个 LTDC 时钟的配置是参 考 LCD 时序参数表确定的,它与 LCD 的刷新率相关。
/ b+ E8 H! j8 \! c, A8 S* w0 G! i3 ^
30.png
▲ 图19. 时钟树配置

9 k5 V( z% I- t( |至此,外设配置基本完成,选择所使用的 IDE(这里选择的是 STM32CubeIDE),点 击 Generate Code 按钮,生成代码。然后使用 TouchGFX Designer 打开 TouchGFX 文 件夹下的 ApplicationTemplate.touchgfx.part,在 TouchGFX Designer 中生成 UI 相关 代码。; W3 R) t8 M+ s4 n+ h

& f4 r  h0 s3 P1 F& j+ Y
) \) Q1 a( w0 m( h6 M$ g6 X+ r# |
37 Y/ M3 r6 c4 v& `
添加驱动代码 - h- O6 o( W% S% P  Q: @+ @6 W, d
对于 LTDC 接口的 TouchGFX 工程,使用 TouchGFX Desiger 生成代码后,如果仅使 用内部 RAM 和 Flash,那么在 TouchGFX 生成代码后,整个软件架构就建好了,可以使 用 TouchGFX 来点亮屏幕了。
. S$ ^/ s& k; s* Q* }4 b& N2 G2 n5 J. p- ]# \9 X( \% ~
对于使用外部 SDRAM、 QSPI Flash 以及触摸功能的应用可以参考下载的 TBS 进行对 照检查,添加相应的驱动代码和修改链接文件,完善整个工程代码后实现 TouchGFX 点亮 LCD 的效果。
" F0 b+ R+ u/ t; H- E8 n7 P
, p# V( [+ s5 D/ B

1 s! _, t' `  J  \$ V( k  K3.1. 添加 SDRAM 驱动代码
/ w- m* S* o3 h0 |/ p查看下载的 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 位来完成,默认情况下该位在复位后使能。4 c8 b) a- c8 {& w
4 S3 z, ^3 i$ \! J) Y8 y' W+ f
/ m# f" o& Y/ U$ S7 O
3.2. 添加 QSPI Flash 驱动代码
& a" F5 L. l$ t1 ~! ~) Y添加驱动代码把 QSPI Flash 配置成 memory mapped 模式。0 b2 }. R6 R6 L* a- e! r  a

9 L% ^* A4 S- Z1 ?5 u

% C0 |2 V$ P7 R% H( N3.3. 添加 Touch 功能 + D0 k. l7 l# O- V, s( U
触摸功能在 STM32TouchController.cpp 中实现,具体代码请参考 TBS。% _7 J- k6 e$ d' }
, Q2 P& K" w. l1 X2 e! f
- j1 y1 g4 E" Q9 G; C. i9 h3 z" L+ E
3.4. 修改链接文件) p" T( y, k6 i& G  A! B# x
为了把帧缓冲区和视频缓冲放到外部 SDRAM,把字体、图片等素材放到外部 Flash, 需要修改链接文件。不同的 IDE,它的链接文件是不同的。对于 STM32CubeIDE,它的 链接文件是 STM32F746NGHX_FLASH.ld,对于 EWARM,它的链接文件是 stm32f746xx_flash.icf,对于 MDK-ARM,它的链接文件是 STM32F746G_DISCO.sct, 它们的语法略有不同。大家可以参考它的结构进行修改。
) W4 a/ F* k3 q9 a$ k7 E/ V% d& W7 m& _3 w+ L
' o" H) C4 ^# ?
4
5 |! p3 I/ @0 |2 l小结 ( K' w- Y" Z! W- {' ?8 F
以上就是 LTDC RGB 接口 LCD 的 TouchGFX 工程的移植步骤,本文档对关键步骤进 行了解释说明,具体细节可参考 AN4861 和官方的 TBS。2 V9 \8 M4 Y" U8 \- i

. h' H( s5 ?/ }+ o5 H

# \/ Z5 k# |6 _- @
▼▼▼
点击按钮下载《LTDC RGB 接口 LCD TouchGFX 工程的移植步骤》原文档。8 O- W: V" ]  [; v  p; ]& N( B% R
点击下载
2 {+ x. n" E# d4 r( q' v2 j  j5 `, R) y0 j  S% o  @, S' i
收藏 评论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 手机版