【官方原创】FMC 8080接口LCD的TouchGFX工程的移植步骤 LAT1391
本文档详细介绍了基于NUCLEO-H563ZI+X-NUCLEO-GFX02Z1硬件平台的FMC8080显示接口TouchGFX工程移植步骤。通过STM32CubeMX配置了CRC、FMC、GPDMA1等关键外设,重点讲解了FMC8080接口的参数设置和时序配置,以及GPDMA链表模式的数据传输方案。文档还包含TouchGFX与FreeRTOS的集成配置、时钟树设置及关键代码添加说明,为开发者提供
关键字:FMC,8080, TouchGFX
1. 引言
本文档基于NUCLEO-H563ZI + X-NUCLEO-GFX02Z1硬件平台,使用
STM32CubeMX从零开始一步一步配置,介绍了FMC 8080显示接口的TouchGFX工程的
移植步骤。
2. STM32CubeMX配置过程
X-NUCLEO-GFX02Z1扩展板为STM32 Nucleo-144板添加了图形用户界面功能。需要
注意的是GFX02Z1 GUI扩展板有2个版本AZ1和AZ2,其中AZ1所用的IL19341,AZ2
所用的驱动芯片是ST7789V。两个版本的驱动IC寄存器基本相同,因此开发用的是同一套代
码。

图1. NUCLEO-H563ZI + X-NUCLEO-GFX02Z1硬件平台
针对FMC 8080接口LCD的TouchGFX工程,需要配置的外设涉及到CRC、FMC、
GPDMA1、GPIO、ICACHE、X-CUBE-FREERTOS、X-Cube-TOUCHGFX。下面来介绍
STM32CubeMX工程的配置,以及后续添加相应的驱动代码。
2.1. 新建IOC工程
双击打开STM32CubeMX软件,按照图中1-5步骤操作,MCU型号输入
STM32H563ZITx 进行选择。

图2. 新建STM32CubeMX工程
然后点击“Project Manager”,配置工程名称,如图所示。

图3. 配置工程名称
2.2. CRC
如果要使用TouchGFX,必须使能CRC循环冗余校验计算单元,配置保持默认

图4. 使能CRC
2.3. FMC 配置
FMC是灵活存储控制器的简写,所有带F(S)MC的STM32 MCU均支持Intel 8080和
Motorola 6800 模式,STM32H5具有FMC外设,所以STM32H5也支持8080协议的
LCD。图 5所示MIPI-DBI A或B类型的显示器,其像素数据在显示器GRAM中更新。因此
需要MCU把待刷新的图像数据通过FMC,按照8080模式,发送到显示器GRAM中。

图5. MIPI-DBI A 或B类型的显示器接口示例
在FMC配置界面中,需要对图中参数进行配置,这里一一进行介绍。
FMC_NE:STM32H5一共有4个FMC_NE,FMC模块的NE信号是用于控制外部存储
器的片选信号,它的作用是使能或禁用外部存储器的访问。查看原理图,这里用到了
FMC_NE1。
Memory type:选择LCD Interface,把它作为LCD显示接口。
LCD Register Select:LCD 的寄存器选择(Register Select,简称 RS)信号是用于控制
LCD模块访问数据寄存器或指令寄存器的信号。当RS信号为低电平时,LCD模块将访问指
令寄存器,当RS信号为高电平时,LCD模块将访问数据寄存器。这个需要查看原理图,看看
RS 信号使用了哪个Pin,这里用到了PE4,对应FMC_A20,那么我们选择A20。这个引脚
的选择还与代码中FMC_BANK1_MEM的宏定义相关FMC_BANK1_MEM被定义为
0x60100000。
数据总线选择8bit。

图6. FMC配置参数

图7. FMC 时序参数
参考UM2905手册的Table 2来进行配置来配置FMC的引脚,如果是其他板子,需要根
据这个类似的引脚对应关系来进行配置。

图8. LCD 的IO配置
2.4. GPDMA
为减轻CPU负荷,可以使用GPDMA协助数据传输。GPDMA可配置为链表模式和标准
请求模式。由于GPDMA 1个块最多传输64KB,而本项目一帧的数据量超过64KB,故采用
链表模式来提高传输速率。具体配置如下,然后使能GPDMA中断。


图9. GPDMA配置
2.5. GPIO
有LCD相关的GPIO有LCD_RESET和LCD_TE。其中LCD_RESET作为LCD的复位引
脚,配置成输出模式,LCD_TE接LCD的TE信号,配置成外部中断模式,并开启中断。

图10. GPIO配置
2.6. ICACHE
为了提高系统性能,打开ICACHE,这里是默认配置。如果为了更低功耗,可以把它配置
为Direct-mapped ICACHE (1-way cache)。

图11. ICACHE配置
2.7. SYS
由于SysTick被RTOS使用,这里系统时钟的时基选择TIM6。

图12. 系统时基来源配置
2.8. X-CUBE-FREERTOS
TouchGFX可以运行在有RTOS和无RTOS的工程中,本工程移植的是带有RTOS,
RTOS选择FreeRTOS。如图所示:新建一个任务来运行TouchGFX,任务名称和入口函数请
参照图中的配置。

图13. RTOS任务配置
配置TOTAL_HEAP_SIZE 为50000,该值过小容易导致堆溢出。

图14. RTOS堆大小设置
2.9. X-CUBE-TOUCHGFX
Interface:由于 Parallel RGB(FMC)的 FMC Data Size 仅支持 16bits,而本工程的FMC
仅用到了8 bit,所以这里Interface选择Custom。如果需要16bit数据传输,则可以选择
Parallel RGB(FMC)
对于8080接口的LCD,由于LCD自带RAM,FrameBuffer Strategy 也是支持Partial
Buffer 的。这里内部RAM足够放下2个帧缓存区,选择Double Buffer。
Application Tick Source:应用滴答时钟来源,选择Custom,本工程使用的是TE中断
来对TouchGFX引擎作触发,需要在中断处理函数中添加相应代码。对没有TE信号的
LCD,需要额外一个定时器来做触发,定时器定期(例如16ms)来调用图16中的
LCD_SignalTearingEffectEvent。

图15. TouchGFX 配置
void LCD_SignalTearingEffectEvent(void)
{
// VSync has occurred, increment TouchGFX engine vsync counter
HAL::getInstance()->vSync();
// VSync has occurred, signal TouchGFX engine
OSWrappers::signalVSync();
if (refreshRequested && !displayRefreshing)
{
// Swap frame buffers immediately instead of waiting for the task to be scheduled in.
// Note: task will also swap when it wakes up, but that operation is guarded and will
not have
// any effect if already swapped.
touchgfx::HAL::getInstance()->swapFrameBuffers();
displayRefreshing = true;
/* Transmit framebuffer */
LCD_IO_SendDataDMA((uint8_t*)TFTframebuffer, DISPLAY_WIDTH * DISPLAY_HEIGHT *
2);
}
}
图16. TE中断中的处理函数
Use DMA2D Accelerator(ChromART):由于 STM32H563没有DMA2D,这里选择
No。对于有DMA2D功能的MCU,这里应该选择Yes,来提高系统性能。DMA2D主要用
来做数据搬运,例如可以将Flash中的图片素材搬运到RAM中,也可以用来做渲染。
Real-Time Operating System:选择 CMSIS_RTOS_V2。对于不需要操作系统的应用,
选择NoOS。
其他参数的配置参考模板配置即可,每个参数下边都有含义解释。
2.10. Clock Configuration

图17. 时钟树配置
至此,外设配置基本完成,选择所使用的IDE(本文选择STM32CubeIDE),点击
Generate Code 按钮,生成代码。然后使用TouchGFX Designer打开
ApplicationTemplate.touchgfx.part。需要在中断处理函数中添加相应代码。

图18. 第一次生成的TouchGFX 文件夹
3. 添加代码
通过TouchGFX Designer重新生成代码后,客户仅需要在TouchGFX/Target文件夹下
的TouchGFXHAL.cpp和TouchGFXHAL.hpp添加相应的代码,主要包括表1中的函数。注
意:generated 的文件夹是不允许用户修改的。更详细的介绍,大家可以直接看对应的代码
注释。大家可以通过代码比较添加对应的代码。
static volatile uint8_t DisplayEnabled = 0;
static volatile bool displayRefreshing = false;
static volatile bool refreshRequested = false;
static uint16_t* TFTframebuffer = 0;
static bool isAZ2 = false;
extern "C" DMA_HandleTypeDef handle_GPDMA1_Channel6;
void initLCD(void);
void setDisplayWindow(uint32_t Xpos, uint32_t Ypos, uint32_t Width, uint32_t Height);
static void DMA_TxCpltCallback(DMA_HandleTypeDef* hdma);
static void DMA_TxErrorCallback(DMA_HandleTypeDef* hdma);
图19. 用到的函数变量


表1. 函数列表
/* FMC registers */
#define FMC_BANK1_REG ((uint16_t *) 0x60000000)
#define FMC_BANK1_MEM ((uint16_t *) (0x60000000 | 0x0100000))
#define DISPLAY_SLEEP_OUT 0x11U /* Sleep out register */
#define DISPLAY_RAM_CTRL 0xB0U /* RAM Control */
#define DISPLAY_PIXEL_FORMAT 0x3AU /* Pixel Format register */
#define DISPLAY_PV_GAMMA_CTRL 0xE0U /* Positive Voltage Gamma Control */
#define DISPLAY_NV_GAMMA_CTRL 0xE1U /* Negative Voltage Gamma Control */
#define DISPLAY_TEON 0x35U /* Tearing Effect Line ON */
#define DISPLAY_GRAM 0x2CU /* GRAM register */
#define DISPLAY_ON 0x29U /* Display on register */
#define DISPLAY_CASET 0x2AU /* Colomn address register */
#define DISPLAY_RASET 0x2BU /* Raw address register */
#define DISPLAY_RDID3 0xDCU /* Read ID 3 register */
#define DISPLAY_IFCTL 0xF6U /* Interface Control register */
/* Display Data */
#define DISPLAY_FORMAT_RBG565 0x55U /* Pixel format RGB565 : 16 bpp */
#define DISPLAY_WIDTH 0xF0U /* Width 240 pixels */
#define DISPLAY_HEIGHT 0x140U /* Height 320 pixels */
图20. TouchGFXHAL.hpp 添加的代码
4. 小结
以上就是FMC 8080接口LCD的TouchGFX工程的移植步骤,完成以上配置之后就
可以在UI界面上添加控件来验证效果了。
意法半导体公司及其子公司 (“ST”)保留随时对 ST 产品和 / 或本文档进行变更的权利,恕不另行通知。买方在订货之前应获取关于 ST 产 品的最新信息。 ST 产品的销售依照订单确认时的相关 ST 销售条款。 买方自行负责对 ST 产品的选择和使用, ST 概不承担与应用协助或买方产品设计相关的任何责任。 ST 不对任何知识产权进行任何明示或默示的授权或许可。 转售的 ST 产品如有不同于此处提供的信息的规定,将导致 ST 针对该产品授予的任何保证失效。 ST 和 ST 徽标是 ST 的商标。若需 ST 商标的更多信息,请参考 www.st.com/trademarks。所有其他产品或服务名称均为其 各自所有者的财 产。 本文档是ST中国本地团队的技术性文章,旨在交流与分享,并期望借此给予客户产品应用上足够的帮助或提醒。若文中内容存有局限或与ST 官网资料不一致,请以实际应用验证结果和ST官网最新发布的内容为准。您拥有完全自主权是否采纳本文档(包括代码,电路图等)信息, 我们也不承担因使用或采纳本文档内容而导致的任何风险。 本文档中的信息取代本文档所有早期版本中提供的信息。 © 2020 STMicroelectronics - 保留所有权利
openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。
更多推荐

所有评论(0)