关键词: FSMC驱动LCD,STM32F407VE
调试环境:
编译器:RT-Thread Studio
驱动生成:STM32CubeMX
开发板:STM32F407VET6 核心开发板
LCD:320x480_ILI9488 ,驱动IC:ILI9488, 3.5寸TFT LCD
1.相关工程:
以下资料可到这个链接下载
https://download.csdn.net/download/yutian0606/87720273
STM32CubeMX 配置工程
LCD驱动和GUI相关代码:GUI-2021120301.zip
2.用 STM32CubeMX 创建FSMC 的驱动
按如下截图顺序设置
3. RT-Thread Studio 创建 STM32F407 工程
4.修改工程中与 FSMC 相关设置
4.1. 打开FSMC相关宏
4.2. 打开组件 libc
4.3.复制STM32CubeMX 生成工程文件中的两个FSMC文件到 工程库中
stm32f4xx_ll_fmc.c
stm32f4xx_ll_fsmc.c
两个文件到 RT-Thread 工程的如下目录 \libraries\STM32F4xx_HAL_Driver\Src
文件来源,在STM32CubeMX 生成的FSMC 工程目录中找到如下文件
复制到工程的路径如下图,③ ④ 是复制过来后的文件。
4.4.复制 STM32CubeMX 生成的 FSMC 驱动文件到工程
STM32CubeMX生成的驱动文件路径如图:
将 fsmc.c 文件中全部代码复制到 board.c 文件的末尾。
将 STM32CubeMX 生成的时钟配置代码复制到工程中 drv_clk.c 文件里面替代函数
void system_clock_config(int target_freq_mhz) 中的内容。
将源文件 \STM32F407VE_KEIL_FSMC\Core\Src\main.c 中的 void SystemClock_Config(void)
替代新工程中 drv_clk.c 文件 void system_clock_config(int target_freq_mhz) 函数中的内容
注意:只是替换函数中的代码,函数名不用更改和替换
5. 复制 LCD 驱动和 GUI 代码到工程
5.1 复制LCD驱动 GUI 框架到工程
delay.c :包含2个延时函数,用rt 延时函数替代了参考代码的函数。
font.c:字库文件
GUI.c:GUI框架文件
lcd.c :LCD 驱动代码
pic.c:测试用图片文件
test.c:测试工程代码
5.2.修改LCD驱动代码,主要修改 LCD 驱动中关于 FSMC 初始的函数
MX_FSMC_Init(); 是STM32CubeMX 生成的驱动。
rt_pin_mode(LCD_BL , PIN_MODE_OUTPUT);LCD背光驱动的代码也修改成 RT 的函数。
其他关于代码风格不同根据具体调试情况修改。
void LCD_GPIOInit(void)
{
MX_FSMC_Init();
rt_pin_mode(LCD_BL , PIN_MODE_OUTPUT);//初始化完成以后,提速//重新配置写时序控制寄存器的时序
FSMC_Bank1E->BWTR[6] &= ~(0XF << 0); //地址建立时间(ADDSET)清零
FSMC_Bank1E->BWTR[6] &= ~(0XF << 8); //数据保存时间清零
FSMC_Bank1E->BWTR[6] |= 3 << 0; //地址建立时间(ADDSET)为3个HCLK =18ns
FSMC_Bank1E->BWTR[6] |= 2 << 8; //数据保存时间(DATAST)为6ns*3个HCLK=18ns
}
5.3 代码中 LCD 关于 FSMC 接口的代码在这里定义lcd.h
//LCD地址结构体
typedef struct
{
#if LCD_USE8BIT_MODEL
vu8 LCD_REG;
vu8 LCD_RAM;
#else
vu16 LCD_REG;
vu16 LCD_RAM;
#endif
} LCD_TypeDef;
//使用NOR/SRAM的 Bank1.sector1,地址位HADDR[27,26]=00 A16作为数据命令区分线
#if LCD_USE8BIT_MODEL
//使用8位模式时,STM32内部地址不需要右移一位
#define LCD_BASE ((u32)(0x60000000 | 0x0000FFFF))
#else
//使用16位模式时,注意设置时STM32内部会右移一位对齐! 111 1110=0X7E
#define LCD_BASE ((u32)(0x60000000 | 0x0001FFFE))
#endif
#define LCD ((LCD_TypeDef *) LCD_BASE)
参考资料:
RT-Thread Studio使用记录(七)STemWin
RT-Thread-RT-Thread Studio使用记录(七)STemWinRT-Thread问答社区 - RT-Thread
STM32CubeMX | 35-使用硬件FSMC驱动TFT-LCD屏幕(MCU屏,NT35510控制器)
STM32CubeMX | 35-使用硬件FSMC驱动TFT-LCD屏幕(MCU屏,NT35510控制器)_tft 驱动 mcu_Mculover666的博客-CSDN博客
STM32CubeMX系列|TFTLCD显示
STM32CubeMX系列|TFTLCD显示_fsmc norsram_安迪西的博客-CSDN博客
基于stm32f407的示波器
基于stm32f407的示波器_stm32f407zet6示波器_Wyd_(ง •̀_•́)ง的博客-CSDN博客
FSMC驱动TFT显示屏(和驱动触摸屏)
FSMC驱动TFT显示屏(和驱动触摸屏)_SeanOY的博客-CSDN博客
FSMC版本:多驱动器(ILI9486L等)驱动TFTLCD屏幕