关键字: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 - 保留所有权利

Logo

openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。

更多推荐