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

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

[复制链接]
STMCU-管管 发布时间:2025-2-6 09:47
1
9 i6 D  {) ^8 r& m* T( [引言. P6 i4 x" G5 l) S- @. j, u
文档基于 STM32F746G_DISCO 硬件平台,参考从 TouchGFX Designer 下载的 STM32F746 的 TBS(TouchGFX Board Setup),讲解 STM32CubeMX 相关配置,介绍了LTDC RGB 接口 LCD 的 TouchGFX 工程的移植步骤。 ! t# J* F3 h. a/ E
12.png
▲ 图1. TouchGFX Designer 中的 STM32F746G_DISCO TBS
. O- z! B3 J/ k% A0 H9 ~* H
7 i( t/ x, g% i
2
! R7 i& L& T! L/ }STM32CubeMX 配置过程
+ Y& a: x' I* Q9 S+ ?3 S: p' MSTM32F746G_DISCO 有两个外部存储器,SDRAM 和 QSPI Flash,SDRAM 用于帧缓冲器,QSPI Flash 用于存储图片、字体等素材,其图形实现过程如图 1 所示。本文档参考从 TouchGFX Desinger 上下载的 TBS,第一步首先完成 IOC 文件的配置,由于会使用 外部 RAM 和外部 Flash,生成代码后还需要添加相应的存储器驱动代码,以及修改链接文件。对于仅使用内部 Flash 和内部 RAM 的应用,用 STM32CubeMX 和 TouchGFX Desinger 生成代码后,就可以直接使用 TouchGFX 点亮屏幕了。   {) g0 v9 H- t6 z0 j
13.png
▲ 图2. 图形实现过程

7 j6 n# x- p0 g  @2.1. 新建 IOC 工程 1 y) z) U4 ~1 A! g1 o$ U

" D+ Z- L3 f. B- R6 L

+ m) H5 U# g; r; Q+ h: {/ I& V$ k双击打开 STM32CubeMX 软件,按照图中 1-5 步骤操作,MCU 型号输入 STM32F746NGH6 进行选择,其中第 5 步提示配置默认 MPU 单元来优化内核的推测性 读取访问,请点击“YES”。 : M/ _8 g8 [! G% k# G8 L4 @
14.png
▲ 图3. 新建 STM32CubeMX 工程
然后点击“Project Manager”,配置工程名称,如图所示。
6 v- M1 h  d9 S+ s; ?
15.png
▲ 图4. 配置工程名称
5 m/ `6 Y" l, c4 ~4 E

/ G- f0 o' o& n8 S0 V' p0 ]2 t2.2. CORTEX_M7
  c+ {& I4 s, h' Q8 p) x; \  |( H$ S
+ }8 E/ F; T$ x/ m# N' @9 t
这里使能 ICACHE 和 DCACHE,并配置内存保护单元 MPU,要正确配置 MPU 属性 以避免由 Cortex®-M7 推测性读取访问和缓存维护引起的图形性能问题,使用 STM32CubeMX 可以轻松配置 MPU 存储器属性。详细配置过程可以参考 AN4861 4.6 小节 Special recommendations for Cortex-M7 (STM32F7/H7),其中介绍对嵌入了 Cortex®-M7 CPU 的 STM32F7 系列的一些建议,建议大家仔细阅读下。
% u4 U( T. X' m# O, G$ q+ h( N5 u7 L! W
# y  O  W# L, p) W
2.3. CRC
! o; V2 F2 B. E/ c6 J8 x# u- _3 {1 y1 f

$ @5 y  |# k* l* Z" J& uCRC 是循环冗余校验计算单元,如果要使用 TouchGFX,必须要使能 CRC,其配置保 持默认即可。
0 ?9 ~& o: I% @% P6 N& s
& W4 z6 d- z2 y% r% e& R' H

4 b6 \1 u& X5 Y  Q% b1 w
16.png
▲ 图5. 使能 CRC
$ x  \+ _( M+ P0 x) F+ d
2.4. DMA2D " }0 L2 C6 b$ [/ L4 x, I
3 w/ C) ?2 F: B6 S7 c# l
( J& v" e8 j# K$ H2 |3 K* t2 d5 Z7 e
DMA2D 是 AHB 总线矩阵上的主设备,它将图形数据传输到内存,也可用于图形渲 染,建议使用 DMA2D 来减轻 CPU 负载。DMA2D 使能后保持默认配置即可,当需要 DMA2D 来进行图形加速时,TouchGFX 引擎会自动调用 DMA2D。
, H+ `( \4 C/ v7 |0 d
( x8 f9 v( \' s6 r# m/ @
17.png
▲ 图6. 使能 DMA2D
3 }  w. K: ]( F
2.5. FMC 配置 LTDC 帧缓存区和 Video 缓冲区放在了外部 SDRAM 中。配置 FMC 相关参数时,需 要对照原理图和 SDRAM 的 datasheet,了解相关参数,然后进行配置。配置结束后,需 要添加相应的驱动代码,将其配置内存映射模式。 ) q( b3 a' K8 A' l( f
18.png
▲ 图7. FMC 配置
! M6 c) x/ z# r2 E
; ^  l+ D0 {* ^+ ?1 M- d: x- b
2.6. FREERTOS
0 |8 q. X' l% s# D3 w5 r0 g7 L; \$ x5 w3 L& [
5 Y7 Q1 r4 h. A7 }4 R4 k
TouchGFX 可以运行在有 RTOS 和无 RTOS 的工程中,本工程移植的是带有 RTOS, RTOS 选择 FreeRTOS,在本工程中新增了 2 个 task,TouchGFXTask 任务用于运行ToucGFX 图形引擎,VideoTask 任务用于进行 Mjpeg 视频的编解码,如果您的项目不用 video 控件,那么 videoTask 可以不用添加。
% }: I* E3 P) h8 G5 Y  V$ j
19.png
▲ 图8. FreeRTOS 新增任务
! Q5 a" W# N$ t' X5 h' R6 q
' J  e! k/ R% w; h$ `
注意新增总的堆空间大小,防止新建任务的栈大小不足。
1 w: f+ k& o' y+ Q, C  Q
9 X% m: |! W! Q

" S2 @' f1 H, K; j
20.png
▲ 图9. 堆空间大小配置
( U0 \( a" B% V' Y
2.7. GPIO * f; L6 E  s, l

1 R1 q7 Y" F, J+ ]/ J* O
; D. q  O7 U$ Q& V
在官方下载的 TBS,配置的 GPIO 如图 9 所示。与 LCD 显示相关的引脚有 2 个, LCD_DISP 和 LCD_BL_CTRL。LCD_DISP 用来启用/禁用显示待机模式,需要将 LCD_DISP 配置为高电平来启用显示器,否则显示器将保持待机模式。LCD_BL_CTRL 信 号上的高电平可以点亮背光,而低电平则将其关闭。
) q! z0 y9 T5 R+ I$ T* ]
% n" E& k' Z: h# ^/ W* V

8 V  t( \: x6 H' n. i  b3 ^9 [另外几个 GPIO 引脚可以用来测试性能的,它们的解释说明可以查看 TouchGFXGPIO.cpp 中注释,其中 RENDER_TIME,可以用来查看实际的渲染时间。
+ q) y( Q+ D/ A& E+ Y3 T8 A3 a8 ]( X
8 c# U- [% {9 x: c& C9 d1 B
21.png
▲ 图10. GPIO 配置
& {6 H. A; t+ _2 H3 v
2.8. I2C3 6 V6 T! v0 X# p3 Q0 O  k; l) O+ T

5 m$ ]( O6 x: B
+ V" ?* A7 d+ E! O$ j
STM32F746G_DISCO 的电容 LCD 的触摸的接口是 I2C3 的 PH7 和 PH8,相关参数 的配置参数如图所示。7 m5 X  X" B+ `) w% U( X' a5 g. Z
1 x* }+ g$ v, k: J
22.png
▲ 图11. I2C3 配置

$ }1 w/ h9 G( @( D  x& S
" l* N4 A3 ~1 B' i8 C. r
2.9. LIBJPEG
, Z9 E9 @. g  s- S6 m
' K( f0 E8 n/ n* ?1 I5 l1 b3 R

" E2 s" l" ^9 d6 a6 Y# ?5 N如果 TouchGFX 使用 Video 控件,要使能 LIBJPEG,用于视频流的软件编解码。如果 您的工程用不到 Video 控件,那么可以不用使能 LIBJPEG。: @1 K2 M1 u* V) B7 N5 \  X3 H
1 X4 w: W9 x, }4 k1 F
23.png
▲ 图12. GPIO 配置
9 ]0 y' t% I) G/ `9 M6 S, {
2 D4 A1 x- M' x2 |. K
2.10. LTDC : o1 L# j* G9 F/ v2 S& g( d' }

0 m3 T  X( ^8 f5 O; ~' I

1 j& X0 S" Y4 O. ~# k* y* b2 kLTDC 外设主要用来配置 LCD 显示接口,对于 STM32F746G_DISCO 的 LCD 可以参 考下载的 TBS 进行配置。如果是其他型号的 LCD,需要查看 LCD 的屏幕时序表进行配 置。关于 LTDC 的 layer,虽然在 STM32CubeMX 可以配置为 2 个 layers,但是 TouchGFX Designer 是采用 1 个 layer 来做 GUI 开发的,这是因为 2 个 layer 会占用更 多带宽,同时打开 LTDC 全局中断和错误中断。
! d! Y( N, E! Q7 @; v3 N$ ]5 p& T9 ?2 ~  Z" l4 l0 q
24.png
▲ 图13. LTDC 参数配置
; ?# y, D/ t  Z; P
25.png
▲ 图14. LTDC layer 配置
26.png
▲ 图15. 打开 LTDC 全局中断和错误中断
4 P2 b: }6 s: x2 i/ I* w
, e' M# l; T; [  s9 V
2.11. QUADSPI
$ m7 n0 D$ r% [' ^  H6 A+ s当要存储的数据量相对较少时,可以使用内部 FLASH 存储器。否则,应将图形内容放 置在外部存储器中。QUADSPI 外接了一个 128-Mbit Quad-SPI NOR Flash。* y& f6 k: ]% a) S4 K
& V% T  i, s8 z5 P1 A3 Y7 ^6 X
27.png
▲ 图16. QUADSPI 配置

7 w+ ^% w# k6 ~3 h( f

  }. K1 i/ q: Q, |( R2.12.SYS / `9 [5 g. j* M. u+ G6 ?' D
由于 SysTick 被 RTOS 使用,这里 HAL 库的时基选择 TIM6。
: L1 o% ~9 Q$ d$ X- j* n. {
9 I& V& [! Z2 [+ i
28.png
▲ 图17. 系统时钟配置
7 p( k# U+ d4 M: Z3 b  b% Z, M

5 F' x. a, K/ w9 c/ ~0 u8 O; z2.13. X-CUBE-TOUCHGFX : B* E/ h+ [+ r9 z3 [
Interface:接口选择 Parallel RGB(LTDC) ) D9 A6 @9 m  {
对于 RGB 接口的 LCD 来说,通常无内置 GRAM,FrameBuffer Strategy 无法使用 Partial Buffer 策略。在 RAM 足够时,可选择 Double Buffer 策略。存放位置选择 By Allocation。这个可以通过链接文件配置放置在什么位置。( J6 O5 ~, @( V1 L. H
Application Tick Source:应用滴答时钟来源,选择 LTDC,它的实现代码可以在 TouchGFXGeneratedHAL.cpp 中 HAL_LTDC_LineEventCallback 函数找到。
0 U# e4 v( }" T: u
% f( Z( P" l7 }9 @0 L3 k; P
29.png
▲ 图18. TouchGFX 配置

3 ^: _6 e7 }' P0 V$ ~) i* ~
9 C; g2 M4 |+ T
2.14.Clock Configuration , }: k* p7 ^* p* M0 j' h& [
系统时钟配置为 216MHz,LTDC 时钟配置为 9.6MHz,这个 LTDC 时钟的配置是参 考 LCD 时序参数表确定的,它与 LCD 的刷新率相关。
" _. Q% u8 }* O% k6 P, [7 O6 X' L# f
30.png
▲ 图19. 时钟树配置

, U5 b% \# e2 g至此,外设配置基本完成,选择所使用的 IDE(这里选择的是 STM32CubeIDE),点 击 Generate Code 按钮,生成代码。然后使用 TouchGFX Designer 打开 TouchGFX 文 件夹下的 ApplicationTemplate.touchgfx.part,在 TouchGFX Designer 中生成 UI 相关 代码。" ?2 b5 d5 f: t' A

% Z( c: N) r7 p
; O/ v% T8 C& h* W" D' f/ u
3( b' d" q! A" t
添加驱动代码
0 K% H; ]6 W: n' v$ q2 c对于 LTDC 接口的 TouchGFX 工程,使用 TouchGFX Desiger 生成代码后,如果仅使 用内部 RAM 和 Flash,那么在 TouchGFX 生成代码后,整个软件架构就建好了,可以使 用 TouchGFX 来点亮屏幕了。8 h# b1 j, Y. c6 O8 g) W
) t' f* K1 c( |- l( T/ \, l3 S( ?
对于使用外部 SDRAM、 QSPI Flash 以及触摸功能的应用可以参考下载的 TBS 进行对 照检查,添加相应的驱动代码和修改链接文件,完善整个工程代码后实现 TouchGFX 点亮 LCD 的效果。6 y; M# F/ B% z" c" U

, Z/ |2 P- J3 F5 J' s2 d% W+ G( r
/ I- A: i( U7 h
3.1. 添加 SDRAM 驱动代码% @: f( n" `, @/ ]
查看下载的 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 x5 g" Z& b: l/ ^  T+ j9 B
9 _6 `. X% f+ j* p- ^
9 D/ d0 H2 ]- q* U1 D% Q
3.2. 添加 QSPI Flash 驱动代码 $ u# a0 Z- N" n: N0 o0 L+ k  I
添加驱动代码把 QSPI Flash 配置成 memory mapped 模式。! F0 h8 j: b' ~, e2 T
3 I5 |' j! }$ r
; g* M8 k0 |- v
3.3. 添加 Touch 功能
( J5 R* R: K/ m触摸功能在 STM32TouchController.cpp 中实现,具体代码请参考 TBS。2 @8 w0 n8 x' [9 [. B- V8 {- ?

- Z% D" @: H8 I/ N- K
4 ^# r! Z( q2 a' R% ~+ b
3.4. 修改链接文件  ]- T% {  l% f, M9 h( x& S
为了把帧缓冲区和视频缓冲放到外部 SDRAM,把字体、图片等素材放到外部 Flash, 需要修改链接文件。不同的 IDE,它的链接文件是不同的。对于 STM32CubeIDE,它的 链接文件是 STM32F746NGHX_FLASH.ld,对于 EWARM,它的链接文件是 stm32f746xx_flash.icf,对于 MDK-ARM,它的链接文件是 STM32F746G_DISCO.sct, 它们的语法略有不同。大家可以参考它的结构进行修改。
) ^4 E* c! n+ ~  y& C7 Z$ c* p! [
( u0 Y; K. S; V9 M& K8 M. H9 l! m$ w6 ?

# ~& ~, v- v- \% n. \& P. A( [6 x4) Y; X7 U7 O. q" I5 l$ p, y. _
小结 4 H  X  k+ ?8 e0 s. j# g( J
以上就是 LTDC RGB 接口 LCD 的 TouchGFX 工程的移植步骤,本文档对关键步骤进 行了解释说明,具体细节可参考 AN4861 和官方的 TBS。) D  ~; x8 V1 M1 J- }5 z: u" G
8 j' O0 ~* m+ c) V" N3 x9 w: A4 |

5 q0 R: R  ~* b- e1 a3 Q
▼▼▼
点击按钮下载《LTDC RGB 接口 LCD TouchGFX 工程的移植步骤》原文档。9 @1 c! r6 f: C4 I$ p# X
点击下载
- R5 t/ r& V; Q; m3 ~" y4 _; i# j7 k" b, k& W+ Z
收藏 评论0 发布时间:2025-2-6 09:47

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版