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

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

[复制链接]
STMCU-管管 发布时间:2025-2-6 09:47
1
  M3 K+ P) |" x/ m0 y$ N* N引言' \9 k) l# r1 [) m- P1 x3 ^
文档基于 STM32F746G_DISCO 硬件平台,参考从 TouchGFX Designer 下载的 STM32F746 的 TBS(TouchGFX Board Setup),讲解 STM32CubeMX 相关配置,介绍了LTDC RGB 接口 LCD 的 TouchGFX 工程的移植步骤。 + U' ]" \1 k. y% s$ f6 u- P' z
12.png
▲ 图1. TouchGFX Designer 中的 STM32F746G_DISCO TBS
9 o% [9 V: h" |" `. @9 c; _/ E0 m
3 z, {( r. [  B
2
! {) S1 m/ |: x5 X( ySTM32CubeMX 配置过程
. I& ?! C, S- ~5 @; ]* y8 o2 ASTM32F746G_DISCO 有两个外部存储器,SDRAM 和 QSPI Flash,SDRAM 用于帧缓冲器,QSPI Flash 用于存储图片、字体等素材,其图形实现过程如图 1 所示。本文档参考从 TouchGFX Desinger 上下载的 TBS,第一步首先完成 IOC 文件的配置,由于会使用 外部 RAM 和外部 Flash,生成代码后还需要添加相应的存储器驱动代码,以及修改链接文件。对于仅使用内部 Flash 和内部 RAM 的应用,用 STM32CubeMX 和 TouchGFX Desinger 生成代码后,就可以直接使用 TouchGFX 点亮屏幕了。
5 @+ h! t/ x4 A# m  T: V
13.png
▲ 图2. 图形实现过程

9 C7 F- p( e, l8 G, p$ G7 \# i2.1. 新建 IOC 工程
+ t* m( k) }1 c5 S- X( q3 V  _
; F. q6 I4 [& E# u4 O3 J' U- R# b

4 e8 i' W2 A) a- ?. N" ]双击打开 STM32CubeMX 软件,按照图中 1-5 步骤操作,MCU 型号输入 STM32F746NGH6 进行选择,其中第 5 步提示配置默认 MPU 单元来优化内核的推测性 读取访问,请点击“YES”。 $ x/ L8 V3 @4 J
14.png
▲ 图3. 新建 STM32CubeMX 工程
然后点击“Project Manager”,配置工程名称,如图所示。
/ Z+ C* N; J8 n2 U# F
15.png
▲ 图4. 配置工程名称

7 x) C$ e- x- E0 E0 m3 G$ S) {* R, ?
4 W, Y% U, X. l3 z: w( ?' J# ?% v
2.2. CORTEX_M7
( I3 P& |) C, z1 ~4 f7 T( F; d! D6 l6 O* J/ L  D/ H$ p3 z  @

- a3 v! `0 r) l! A" i' c5 v$ y( n这里使能 ICACHE 和 DCACHE,并配置内存保护单元 MPU,要正确配置 MPU 属性 以避免由 Cortex®-M7 推测性读取访问和缓存维护引起的图形性能问题,使用 STM32CubeMX 可以轻松配置 MPU 存储器属性。详细配置过程可以参考 AN4861 4.6 小节 Special recommendations for Cortex-M7 (STM32F7/H7),其中介绍对嵌入了 Cortex®-M7 CPU 的 STM32F7 系列的一些建议,建议大家仔细阅读下。8 n- R+ X$ h7 |4 |
% C: n, [: i; A6 S$ r

! j! [1 A; W2 V& V( K* ~2.3. CRC
3 `1 T$ h! D# e- n# R" h* N% ?: P+ j9 W" a

7 Y2 o& b2 H) q6 D# ~4 fCRC 是循环冗余校验计算单元,如果要使用 TouchGFX,必须要使能 CRC,其配置保 持默认即可。6 h0 T4 w$ f7 K: k# X! c
' j0 S; g" h& N' C% u1 B$ P

& w4 [! b7 F* v- g% Q, U9 E9 i8 h
16.png
▲ 图5. 使能 CRC
+ O9 k( L& j# \: f
2.4. DMA2D
6 O& r, u8 L8 X, Y+ Z5 q
! y2 H6 J" ~: ?
7 `$ }1 b4 B2 m. N
DMA2D 是 AHB 总线矩阵上的主设备,它将图形数据传输到内存,也可用于图形渲 染,建议使用 DMA2D 来减轻 CPU 负载。DMA2D 使能后保持默认配置即可,当需要 DMA2D 来进行图形加速时,TouchGFX 引擎会自动调用 DMA2D。 % v$ x4 d; [, p  o) p

8 [& z1 m8 i4 [- h: G
17.png
▲ 图6. 使能 DMA2D
2 z* ?( \% |8 o4 Y# G$ D6 X
2.5. FMC 配置 LTDC 帧缓存区和 Video 缓冲区放在了外部 SDRAM 中。配置 FMC 相关参数时,需 要对照原理图和 SDRAM 的 datasheet,了解相关参数,然后进行配置。配置结束后,需 要添加相应的驱动代码,将其配置内存映射模式。
1 u4 H5 W  m# }( @! W2 P/ B! B
18.png
▲ 图7. FMC 配置

! B. o3 |% T# _) d+ \" X% ]
3 Y& E$ n6 ~& N( t
2.6. FREERTOS 6 y7 d, k* s8 p; p& f. Z8 k" {* a: H
& J! Q2 @# A* j8 Q
  e/ c, D" ~. C1 Z/ d
TouchGFX 可以运行在有 RTOS 和无 RTOS 的工程中,本工程移植的是带有 RTOS, RTOS 选择 FreeRTOS,在本工程中新增了 2 个 task,TouchGFXTask 任务用于运行ToucGFX 图形引擎,VideoTask 任务用于进行 Mjpeg 视频的编解码,如果您的项目不用 video 控件,那么 videoTask 可以不用添加。7 n0 x; j4 o  x/ q
19.png
▲ 图8. FreeRTOS 新增任务
4 T) m9 O. p3 d+ q) R5 X0 A* ^2 X5 S0 T
# o9 o' `3 j& v
注意新增总的堆空间大小,防止新建任务的栈大小不足。7 {3 g6 j- H1 Z( H$ n
% a; l- L) T$ g

) y& [- o5 R9 W" p9 e7 C
20.png
▲ 图9. 堆空间大小配置
, E3 L; e+ Q' D
2.7. GPIO
* }7 X9 y. R# p* P4 m9 Z5 L
5 r& o$ E+ ~; v& u0 C) ~

! p# ]) _3 G. c1 P- z: M9 }在官方下载的 TBS,配置的 GPIO 如图 9 所示。与 LCD 显示相关的引脚有 2 个, LCD_DISP 和 LCD_BL_CTRL。LCD_DISP 用来启用/禁用显示待机模式,需要将 LCD_DISP 配置为高电平来启用显示器,否则显示器将保持待机模式。LCD_BL_CTRL 信 号上的高电平可以点亮背光,而低电平则将其关闭。
& X2 n, C  ?+ c6 O& a% k- {. N8 V, ?) i3 J* f
4 {4 V; L# _. c4 w8 K$ |6 a! R' D) @
另外几个 GPIO 引脚可以用来测试性能的,它们的解释说明可以查看 TouchGFXGPIO.cpp 中注释,其中 RENDER_TIME,可以用来查看实际的渲染时间。
+ {4 H0 |+ H! k8 |& v
  M0 n5 c: ~# l
% k- L# c- |5 F' ~: D" q
21.png
▲ 图10. GPIO 配置

7 t/ G5 e% y: [  g# e" J$ c2.8. I2C3 1 |/ p( u( E$ R( g/ Y" I
" {- K; c/ [! |. T! r
/ V5 T0 Y7 g9 I& m
STM32F746G_DISCO 的电容 LCD 的触摸的接口是 I2C3 的 PH7 和 PH8,相关参数 的配置参数如图所示。, ^" K' d  P" A/ p0 d/ D

$ G/ V8 S$ F& h
22.png
▲ 图11. I2C3 配置
" ?! V' f8 Q9 B: r/ e
% n, f/ c, S' U* J
2.9. LIBJPEG / S+ U+ G# e, [; w

+ J9 Q$ z/ a- a6 w* K; ~, f

1 \; a& l& f, W9 v$ S如果 TouchGFX 使用 Video 控件,要使能 LIBJPEG,用于视频流的软件编解码。如果 您的工程用不到 Video 控件,那么可以不用使能 LIBJPEG。) O! Y1 G. e3 q; X
7 R. Y6 J) R% s5 ^
23.png
▲ 图12. GPIO 配置

- a+ x# D( M, b
: I: }4 w$ d3 A1 r0 J# h
2.10. LTDC " a. y" |$ u" r5 q" j
4 N' Y" C. e' A. Y+ X( m7 X0 I  s% J
0 a$ D, |* V, x3 L+ K
LTDC 外设主要用来配置 LCD 显示接口,对于 STM32F746G_DISCO 的 LCD 可以参 考下载的 TBS 进行配置。如果是其他型号的 LCD,需要查看 LCD 的屏幕时序表进行配 置。关于 LTDC 的 layer,虽然在 STM32CubeMX 可以配置为 2 个 layers,但是 TouchGFX Designer 是采用 1 个 layer 来做 GUI 开发的,这是因为 2 个 layer 会占用更 多带宽,同时打开 LTDC 全局中断和错误中断。
4 P* X' j1 r' G, n' p2 m4 c' y  D
24.png
▲ 图13. LTDC 参数配置

& x% V1 d3 z& s
25.png
▲ 图14. LTDC layer 配置
26.png
▲ 图15. 打开 LTDC 全局中断和错误中断
0 `% l  o( b; ^

; L' U: O) H9 P# f3 k( E* ]2.11. QUADSPI , j+ e, _: K* ?3 k, U
当要存储的数据量相对较少时,可以使用内部 FLASH 存储器。否则,应将图形内容放 置在外部存储器中。QUADSPI 外接了一个 128-Mbit Quad-SPI NOR Flash。
( I' k" s4 |9 ^- p  D; _# Y3 }( `4 a
27.png
▲ 图16. QUADSPI 配置

) r) L( T# H; n7 ]/ k

$ C3 Z8 `' J% ?" s. ]# t' w% A: j2.12.SYS 5 k3 M. |. W* ~, z& s
由于 SysTick 被 RTOS 使用,这里 HAL 库的时基选择 TIM6。
( R% O- c' I# V
, A! }& }. Q4 R2 D
28.png
▲ 图17. 系统时钟配置

8 e. [" P1 ~0 g5 H( ^

& A9 i" B4 a3 R4 |6 C7 J2.13. X-CUBE-TOUCHGFX
5 o2 v9 \  X/ t; AInterface:接口选择 Parallel RGB(LTDC)
" t6 G) ^1 ]1 M* L' h$ R对于 RGB 接口的 LCD 来说,通常无内置 GRAM,FrameBuffer Strategy 无法使用 Partial Buffer 策略。在 RAM 足够时,可选择 Double Buffer 策略。存放位置选择 By Allocation。这个可以通过链接文件配置放置在什么位置。
$ i8 y: F2 L% h1 g! l; }" S  sApplication Tick Source:应用滴答时钟来源,选择 LTDC,它的实现代码可以在 TouchGFXGeneratedHAL.cpp 中 HAL_LTDC_LineEventCallback 函数找到。
0 t5 ]/ a! \* H/ ?* K; [9 l$ ?5 C2 J
  G( K3 X. n: g6 e: J9 H
29.png
▲ 图18. TouchGFX 配置
' K9 l9 S" y" C( O0 \" Y
# d5 Q6 r+ C* I( {
2.14.Clock Configuration
5 s) @9 ]( P3 S' m系统时钟配置为 216MHz,LTDC 时钟配置为 9.6MHz,这个 LTDC 时钟的配置是参 考 LCD 时序参数表确定的,它与 LCD 的刷新率相关。$ R! S% R' J% d; N- I
- X# {1 E  U( h. y8 v
30.png
▲ 图19. 时钟树配置
4 c$ ~8 \/ r2 S- {3 j3 S$ I/ i9 f
至此,外设配置基本完成,选择所使用的 IDE(这里选择的是 STM32CubeIDE),点 击 Generate Code 按钮,生成代码。然后使用 TouchGFX Designer 打开 TouchGFX 文 件夹下的 ApplicationTemplate.touchgfx.part,在 TouchGFX Designer 中生成 UI 相关 代码。
" P" ^; g6 g- |* M' M5 Z# M% f! _' w$ F0 n

/ t  x: r8 b8 q. e3
& n" h0 x# ^" I0 l添加驱动代码 2 q) w" A2 ?0 m  Z4 N4 z; y
对于 LTDC 接口的 TouchGFX 工程,使用 TouchGFX Desiger 生成代码后,如果仅使 用内部 RAM 和 Flash,那么在 TouchGFX 生成代码后,整个软件架构就建好了,可以使 用 TouchGFX 来点亮屏幕了。& b( E7 D' A& K3 l; F0 C

5 V2 d( e- S1 i9 M( p对于使用外部 SDRAM、 QSPI Flash 以及触摸功能的应用可以参考下载的 TBS 进行对 照检查,添加相应的驱动代码和修改链接文件,完善整个工程代码后实现 TouchGFX 点亮 LCD 的效果。
0 H" n$ k9 w8 C; Y; w& N/ L! a& H3 j1 G
- n& j0 L5 q  Y- a5 L$ l$ H
3.1. 添加 SDRAM 驱动代码
. F  e+ T! E  q) ]8 f# 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 位来完成,默认情况下该位在复位后使能。
9 y1 ]. N- K# X3 G
  E7 z- ~. K! g& k' I! B; Y

4 a: m7 I7 u6 e. A% f/ u5 A3.2. 添加 QSPI Flash 驱动代码
- h4 E, a- {' ~& U! N  \添加驱动代码把 QSPI Flash 配置成 memory mapped 模式。% l; y. d7 |7 S

" l1 f7 t8 W* G5 t+ [- [# V) ~
. G1 Q; I; E9 {3 G7 d! X3 O
3.3. 添加 Touch 功能
' \8 t/ P) R7 K3 {. K* u触摸功能在 STM32TouchController.cpp 中实现,具体代码请参考 TBS。
3 S! W/ h7 ]) ^  U* r* G! o. D( g: |1 r+ X
5 t% p1 {: Z! z; Z
3.4. 修改链接文件( X0 h- B  p6 l. q) i5 I" |' s
为了把帧缓冲区和视频缓冲放到外部 SDRAM,把字体、图片等素材放到外部 Flash, 需要修改链接文件。不同的 IDE,它的链接文件是不同的。对于 STM32CubeIDE,它的 链接文件是 STM32F746NGHX_FLASH.ld,对于 EWARM,它的链接文件是 stm32f746xx_flash.icf,对于 MDK-ARM,它的链接文件是 STM32F746G_DISCO.sct, 它们的语法略有不同。大家可以参考它的结构进行修改。( y) m, N, J3 ^! w6 U. w

4 N* \4 {9 X  x9 M

, z+ W/ J5 W* l! g. S4. b9 q( N; k2 T  v& I# b
小结 $ I8 ^' V; X; R# ~1 M' h: o( B
以上就是 LTDC RGB 接口 LCD 的 TouchGFX 工程的移植步骤,本文档对关键步骤进 行了解释说明,具体细节可参考 AN4861 和官方的 TBS。" b) n* H$ _* x, i- v

& m, T" N# Z! D) @3 i
6 h2 i& ~/ F& Q' F% d+ C
▼▼▼
点击按钮下载《LTDC RGB 接口 LCD TouchGFX 工程的移植步骤》原文档。1 N+ J, }: @; r" S9 q
点击下载6 f% S4 v2 H/ `9 w( h& s# x
( i" Y* D) q8 @) _
收藏 评论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 手机版