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

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

[复制链接]
STMCU-管管 发布时间:2025-2-6 09:47
13 z% J$ W5 q, u4 p
引言
) }' f! `, [4 X0 f  `8 H# {文档基于 STM32F746G_DISCO 硬件平台,参考从 TouchGFX Designer 下载的 STM32F746 的 TBS(TouchGFX Board Setup),讲解 STM32CubeMX 相关配置,介绍了LTDC RGB 接口 LCD 的 TouchGFX 工程的移植步骤。 : L5 X1 _3 R) G) G" I( I% L8 t
12.png
▲ 图1. TouchGFX Designer 中的 STM32F746G_DISCO TBS
/ y9 H# P$ o7 C
1 }5 T2 i# L9 C/ }6 Y
2
- v( H0 s  t3 H, \3 M9 K  m: nSTM32CubeMX 配置过程
) g7 |. s: M2 A  W0 {STM32F746G_DISCO 有两个外部存储器,SDRAM 和 QSPI Flash,SDRAM 用于帧缓冲器,QSPI Flash 用于存储图片、字体等素材,其图形实现过程如图 1 所示。本文档参考从 TouchGFX Desinger 上下载的 TBS,第一步首先完成 IOC 文件的配置,由于会使用 外部 RAM 和外部 Flash,生成代码后还需要添加相应的存储器驱动代码,以及修改链接文件。对于仅使用内部 Flash 和内部 RAM 的应用,用 STM32CubeMX 和 TouchGFX Desinger 生成代码后,就可以直接使用 TouchGFX 点亮屏幕了。
! ]  d0 p! U; a
13.png
▲ 图2. 图形实现过程
3 C6 Z: S3 u' `8 n( q" {
2.1. 新建 IOC 工程 & ]2 ]4 @' |  q8 v/ M

% R; a$ y6 I: {5 J1 ]* k

. J" `2 O' H" u9 A$ L+ J, ~双击打开 STM32CubeMX 软件,按照图中 1-5 步骤操作,MCU 型号输入 STM32F746NGH6 进行选择,其中第 5 步提示配置默认 MPU 单元来优化内核的推测性 读取访问,请点击“YES”。
5 \; q$ [0 A) N  M1 W
14.png
▲ 图3. 新建 STM32CubeMX 工程
然后点击“Project Manager”,配置工程名称,如图所示。 8 }( j* Y' s. j1 I# V; v( s
15.png
▲ 图4. 配置工程名称

9 E  S$ s7 M6 I" j% a! `+ K* U
1 a0 Z. ~1 G! G1 E% W- c9 x+ ?
2.2. CORTEX_M7 : N# _0 c* Z* A1 C1 P4 ]

* b6 X7 Z1 ^9 q! {$ W; T1 B
! l5 U6 {& _3 S. t) i8 f
这里使能 ICACHE 和 DCACHE,并配置内存保护单元 MPU,要正确配置 MPU 属性 以避免由 Cortex®-M7 推测性读取访问和缓存维护引起的图形性能问题,使用 STM32CubeMX 可以轻松配置 MPU 存储器属性。详细配置过程可以参考 AN4861 4.6 小节 Special recommendations for Cortex-M7 (STM32F7/H7),其中介绍对嵌入了 Cortex®-M7 CPU 的 STM32F7 系列的一些建议,建议大家仔细阅读下。
; @) b+ M1 ?2 D) O+ }, x) G! w5 E5 R/ {5 P) D

+ J4 q5 z" b5 n! i  ?2 S* o2.3. CRC
( q& d4 n1 t( V3 g
  f- H8 L: l' j
: v# @% L, ~( e/ t! A/ z+ ?
CRC 是循环冗余校验计算单元,如果要使用 TouchGFX,必须要使能 CRC,其配置保 持默认即可。' n- ~$ O% `. p3 g
: V/ }; s/ ]! c/ F* x' m- w

2 K, r- e# k2 ]( A: }$ x9 r
16.png
▲ 图5. 使能 CRC

! I; c/ ]  v. ]2 q2.4. DMA2D
# d5 Q- N! o/ W9 C* {9 A( K& V5 Y" C- P' M* G
" P0 j1 a) @5 r" K
DMA2D 是 AHB 总线矩阵上的主设备,它将图形数据传输到内存,也可用于图形渲 染,建议使用 DMA2D 来减轻 CPU 负载。DMA2D 使能后保持默认配置即可,当需要 DMA2D 来进行图形加速时,TouchGFX 引擎会自动调用 DMA2D。   @# z1 s) K- a9 j4 V

, G- G+ F+ I+ s. z. |& m
17.png
▲ 图6. 使能 DMA2D

$ I' o* j! p1 A& @! ~: z8 a1 L3 Q) S2.5. FMC 配置 LTDC 帧缓存区和 Video 缓冲区放在了外部 SDRAM 中。配置 FMC 相关参数时,需 要对照原理图和 SDRAM 的 datasheet,了解相关参数,然后进行配置。配置结束后,需 要添加相应的驱动代码,将其配置内存映射模式。
- b* {- O4 \- G, O6 ~2 n+ k
18.png
▲ 图7. FMC 配置
  {5 F- A3 O. M2 c# U2 o

4 s5 ^3 y& f, S$ i# g. k  j2.6. FREERTOS
; q" r/ j. h0 q1 w+ y; N0 O* b" A" e. {$ f

! _1 A( u% g' T1 e$ o3 G. i, ATouchGFX 可以运行在有 RTOS 和无 RTOS 的工程中,本工程移植的是带有 RTOS, RTOS 选择 FreeRTOS,在本工程中新增了 2 个 task,TouchGFXTask 任务用于运行ToucGFX 图形引擎,VideoTask 任务用于进行 Mjpeg 视频的编解码,如果您的项目不用 video 控件,那么 videoTask 可以不用添加。/ a& w# I# P+ u5 |$ o2 X3 M
19.png
▲ 图8. FreeRTOS 新增任务

" h7 e  S: ?8 u- k0 b
6 F6 h4 S# V4 q5 H( [0 O3 f
注意新增总的堆空间大小,防止新建任务的栈大小不足。4 J/ n( @4 @5 i/ P
0 e5 ?! B9 F3 @& b6 l- r# f
; o1 p" }  f/ e) v
20.png
▲ 图9. 堆空间大小配置

- n7 o! j' u/ M& g9 Q2.7. GPIO 2 F+ y: S! K( A8 |( l

" V. A4 K& y  f$ T( s7 P
) O0 L6 G# D; X" h( U* x
在官方下载的 TBS,配置的 GPIO 如图 9 所示。与 LCD 显示相关的引脚有 2 个, LCD_DISP 和 LCD_BL_CTRL。LCD_DISP 用来启用/禁用显示待机模式,需要将 LCD_DISP 配置为高电平来启用显示器,否则显示器将保持待机模式。LCD_BL_CTRL 信 号上的高电平可以点亮背光,而低电平则将其关闭。( R' f9 Z0 c. H) ]3 ~, J( y
1 B. t# ?0 Z$ \9 d; `1 B

1 d# N- y( \% {- x另外几个 GPIO 引脚可以用来测试性能的,它们的解释说明可以查看 TouchGFXGPIO.cpp 中注释,其中 RENDER_TIME,可以用来查看实际的渲染时间。
: D; u& B0 X1 K" t' a# l8 l1 F* o% ~6 A! w
) P! H7 w' ]( o- h
21.png
▲ 图10. GPIO 配置

. C/ w" a+ |8 u7 {9 I2.8. I2C3 9 F7 O$ ~$ G: o' I) T

( {2 {( ^8 O- j; O8 \
, r1 ]" S# B. K; Q1 h3 M4 Q
STM32F746G_DISCO 的电容 LCD 的触摸的接口是 I2C3 的 PH7 和 PH8,相关参数 的配置参数如图所示。
; U4 S/ G6 D; d& h
( Y. H+ f0 m4 J* P  L& x
22.png
▲ 图11. I2C3 配置

" h; b1 [3 n; ?" O1 J5 z
5 m1 y+ w. _7 y, i' d
2.9. LIBJPEG % y1 a& w/ l/ u1 ~

- W) T2 {  ?  P1 K9 L. e4 s2 p
3 {# a: |7 b& A% R# t
如果 TouchGFX 使用 Video 控件,要使能 LIBJPEG,用于视频流的软件编解码。如果 您的工程用不到 Video 控件,那么可以不用使能 LIBJPEG。
; F/ C5 m. \1 b6 |2 _& t' Q; a5 e; v
23.png
▲ 图12. GPIO 配置
/ @0 p8 v( ~5 W3 Y, g
9 A2 H+ A& k" {$ m5 P
2.10. LTDC
3 F" J- u& H4 c8 y# B7 B7 f1 C! Y( `% I. S, c1 t: r6 |
5 C2 ~$ I+ a* m" x
LTDC 外设主要用来配置 LCD 显示接口,对于 STM32F746G_DISCO 的 LCD 可以参 考下载的 TBS 进行配置。如果是其他型号的 LCD,需要查看 LCD 的屏幕时序表进行配 置。关于 LTDC 的 layer,虽然在 STM32CubeMX 可以配置为 2 个 layers,但是 TouchGFX Designer 是采用 1 个 layer 来做 GUI 开发的,这是因为 2 个 layer 会占用更 多带宽,同时打开 LTDC 全局中断和错误中断。
, ~5 b  L8 V; s$ o& _8 f2 a) A; i  h1 u
24.png
▲ 图13. LTDC 参数配置

( m; o' b/ A$ R* |
25.png
▲ 图14. LTDC layer 配置
26.png
▲ 图15. 打开 LTDC 全局中断和错误中断
/ s) t# s* u8 B1 [4 Z  `

: B, x- G; O2 R2.11. QUADSPI 2 Z/ |  y1 m" M: Z# v
当要存储的数据量相对较少时,可以使用内部 FLASH 存储器。否则,应将图形内容放 置在外部存储器中。QUADSPI 外接了一个 128-Mbit Quad-SPI NOR Flash。
3 g* P: h: T( P& N9 E& [
9 `( L: d4 b9 h0 i0 q7 Q* r# S
27.png
▲ 图16. QUADSPI 配置
) o4 _; }/ i! J6 ?+ j
" _1 ~  }) x& X5 [0 i
2.12.SYS
/ ]0 V; h" x' a9 L4 ^由于 SysTick 被 RTOS 使用,这里 HAL 库的时基选择 TIM6。+ R0 q. B+ u% l7 s7 j" J

# ~6 l# ?' S4 q' Q
28.png
▲ 图17. 系统时钟配置
' j4 }$ N0 h# c& F% p
! |7 X. c8 p. J+ t# I
2.13. X-CUBE-TOUCHGFX ' P# [( P& V0 M3 h( I- v
Interface:接口选择 Parallel RGB(LTDC)
* K+ O! [) K4 v对于 RGB 接口的 LCD 来说,通常无内置 GRAM,FrameBuffer Strategy 无法使用 Partial Buffer 策略。在 RAM 足够时,可选择 Double Buffer 策略。存放位置选择 By Allocation。这个可以通过链接文件配置放置在什么位置。
! ]/ [0 j6 x. f% R% uApplication Tick Source:应用滴答时钟来源,选择 LTDC,它的实现代码可以在 TouchGFXGeneratedHAL.cpp 中 HAL_LTDC_LineEventCallback 函数找到。& e: W* p3 F+ \' m6 e
: U2 e/ F) i! E& ?& _, @5 W
29.png
▲ 图18. TouchGFX 配置
& H# \4 O4 B3 D$ Q1 F( c6 O1 v: s1 l
; a: ^) Y# X  I2 ]/ u: T; _
2.14.Clock Configuration : w: t0 n; A: h( q
系统时钟配置为 216MHz,LTDC 时钟配置为 9.6MHz,这个 LTDC 时钟的配置是参 考 LCD 时序参数表确定的,它与 LCD 的刷新率相关。0 u: Y' O& U6 \8 e9 I7 ~
3 H. @  W0 C2 @/ n5 U
30.png
▲ 图19. 时钟树配置

; y* T+ i* E: E! I+ V$ g2 g6 [6 t1 b  ?至此,外设配置基本完成,选择所使用的 IDE(这里选择的是 STM32CubeIDE),点 击 Generate Code 按钮,生成代码。然后使用 TouchGFX Designer 打开 TouchGFX 文 件夹下的 ApplicationTemplate.touchgfx.part,在 TouchGFX Designer 中生成 UI 相关 代码。% t9 T9 A# ~* f5 {

7 {* M* A/ j- I
; [2 I6 v, w6 Q( z4 @+ _
3
1 H, ]. U: k' p: Z. z, a" c" ]) t添加驱动代码 - O! s0 w9 S! u7 t+ R) U$ B+ E  h# i
对于 LTDC 接口的 TouchGFX 工程,使用 TouchGFX Desiger 生成代码后,如果仅使 用内部 RAM 和 Flash,那么在 TouchGFX 生成代码后,整个软件架构就建好了,可以使 用 TouchGFX 来点亮屏幕了。. P5 H  M& R6 y# x  o3 c
' p7 P9 C  `! r# z* ?
对于使用外部 SDRAM、 QSPI Flash 以及触摸功能的应用可以参考下载的 TBS 进行对 照检查,添加相应的驱动代码和修改链接文件,完善整个工程代码后实现 TouchGFX 点亮 LCD 的效果。
( A1 z9 M9 R5 _; O' O
& }. L7 D6 @5 C2 U9 k: {
) W2 f4 P5 H; N8 R
3.1. 添加 SDRAM 驱动代码7 L: _  }- s8 Y) v1 h( Y. G  N/ k5 ?: Z
查看下载的 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 位来完成,默认情况下该位在复位后使能。
& Z' _6 F- L! r% X$ S  `- g9 x. |. b0 I. l  v
* K1 Z  Q$ D0 Q3 @  o
3.2. 添加 QSPI Flash 驱动代码 6 a- N& V1 s/ H9 G/ S
添加驱动代码把 QSPI Flash 配置成 memory mapped 模式。# `" r8 w7 I$ s( T
( S& R- O" J: a4 r
5 Q5 r3 B. o, n
3.3. 添加 Touch 功能 * Z5 P( ?) I9 E) c& I2 S; V2 [
触摸功能在 STM32TouchController.cpp 中实现,具体代码请参考 TBS。
( Q2 W# R" c8 }+ K3 k; B- c. W' C9 r. X! H: b' Z
: l' o# [$ y0 h
3.4. 修改链接文件
+ |- q- \# z/ A% W( {9 M为了把帧缓冲区和视频缓冲放到外部 SDRAM,把字体、图片等素材放到外部 Flash, 需要修改链接文件。不同的 IDE,它的链接文件是不同的。对于 STM32CubeIDE,它的 链接文件是 STM32F746NGHX_FLASH.ld,对于 EWARM,它的链接文件是 stm32f746xx_flash.icf,对于 MDK-ARM,它的链接文件是 STM32F746G_DISCO.sct, 它们的语法略有不同。大家可以参考它的结构进行修改。
+ ~2 H6 K% h3 f# r3 |( e! ]% S. q+ U

$ }: L& L/ O% k6 q4 L4
: ~2 \$ _( [& K* I小结 6 k, l" M, s* s! `( ~1 t
以上就是 LTDC RGB 接口 LCD 的 TouchGFX 工程的移植步骤,本文档对关键步骤进 行了解释说明,具体细节可参考 AN4861 和官方的 TBS。1 N. v, B+ f: `' y# B" |

& d1 H( y1 `: c7 w9 V: ^$ `* t6 Q5 c
& c: U* j2 X0 c
▼▼▼
点击按钮下载《LTDC RGB 接口 LCD TouchGFX 工程的移植步骤》原文档。
- g% w$ F$ c- Y" F: c/ \  a+ e点击下载# H8 \1 M/ L7 L2 F6 w
' C" W6 b& U6 H4 ?& I* T
赞 收藏 评论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管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版