关键词: FSMC驱动LCD,STM32F407VE

调试环境:

编译器:RT-Thread Studio

驱动生成:STM32CubeMX

开发板:STM32F407VET6 核心开发板

LCD:320x480_ILI9488 ,驱动IC:ILI9488, 3.5寸TFT LCD

1.相关工程:

以下资料可到这个链接下载


STM32CubeMX 配置工程

LCD驱动和GUI相关代码:GUI-2021120301.zip

2.用 STM32CubeMX 创建FSMC 的驱动

按如下截图顺序设置

STM32 控制emmc读写 stm32 emmc驱动_单片机

 

STM32 控制emmc读写 stm32 emmc驱动_单片机_02

STM32 控制emmc读写 stm32 emmc驱动_stm32_03

 

STM32 控制emmc读写 stm32 emmc驱动_#define_04

 

STM32 控制emmc读写 stm32 emmc驱动_stm32_05

STM32 控制emmc读写 stm32 emmc驱动_#define_06

STM32 控制emmc读写 stm32 emmc驱动_单片机_07

3. RT-Thread Studio 创建 STM32F407 工程

4.修改工程中与 FSMC 相关设置

4.1. 打开FSMC相关宏

STM32 控制emmc读写 stm32 emmc驱动_#define_08

4.2. 打开组件 libc 

STM32 控制emmc读写 stm32 emmc驱动_#define_09

4.3.复制STM32CubeMX 生成工程文件中的两个FSMC文件到 工程库中

stm32f4xx_ll_fmc.c 
stm32f4xx_ll_fsmc.c

两个文件到 RT-Thread 工程的如下目录 \libraries\STM32F4xx_HAL_Driver\Src

文件来源,在STM32CubeMX 生成的FSMC 工程目录中找到如下文件

STM32 控制emmc读写 stm32 emmc驱动_嵌入式硬件_10

复制到工程的路径如下图,③ ④ 是复制过来后的文件。

STM32 控制emmc读写 stm32 emmc驱动_嵌入式硬件_11

4.4.复制 STM32CubeMX 生成的 FSMC 驱动文件到工程

STM32CubeMX生成的驱动文件路径如图:

 

STM32 控制emmc读写 stm32 emmc驱动_嵌入式硬件_12

将 fsmc.c 文件中全部代码复制到 board.c 文件的末尾。

STM32 控制emmc读写 stm32 emmc驱动_#define_13

将 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:测试工程代码

 

STM32 控制emmc读写 stm32 emmc驱动_STM32 控制emmc读写_14

 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)