资讯详情

RT-Thread studio学习笔记5-stm32F407 FSMC驱动TFTLCD

由于要通过fsmc驱动TFTLCD,计划参考下FSMC驱动sdram在RT-Thread studio看了看,没有找到使能SDRAM在其他教程需要在哪里ENV中开启,我使用正点原子的探索者F407,则在RT-Thread的rt-thread-master\rt-thread-master\bsp\stm32\stm32f407-atk-explorer目录下打开ENV,进入Onborad Peripheral Drvers中没有找到SDRAM,只找到了SRAM。我试过下在stm32f767-atk-apollo、stm32f429-atk-apollo目录下打开ENV能够找到SDRAM驱动,具体为什么F407没有。我试过下在stm32f767-atk-apollo、stm32f429-atk-apollo目录下打开ENV能够找到SDRAM驱动,具体为什么F407没有。原因不明。

FSMC:灵活的静态存储控制器可与同步或异步存储器和16位PC存储卡连接,STM32F407的FSMC接口支持包括SRAM、NAND FLASH、NOR FLASH和PSRAM等存储器。

在这里,准备用TFTLCD测试下FSMC接口,驱动TFTLCD屏幕显示可以理解为FSMC接口就像读写外部SRAM显示操作基本相同,需要显示的数据可以通过写入9341一般的SRAM控制一般包括:地址线(如A0~A数据线(如D0~D15),写信号WE、读信号OE、片选信号CS,如果SRAM支持字节控制,然后就有了UB/LB信号。而TFTLCD信号包括:RS、D0~D15、WR、RD、CS、RST和BL等,其中在操作TFTLCD只用于时间RS、D0~D15、WR、RD、CS。而TFTLCD信号包括:RS、D0~D15、WR、RD、CS、RST和BL等,其中在操作TFTLCD只用于时间RS、D0~D15、WR、RD、CS。TFTLCD操作时序和SRAM控制完全相似,区别在于TFTLCD有RS但是没有地址信号。

TFTLCD通过RS决定传输的数据是数据还是命令的信号。

STM32F4的FSMC支持8/16/32位数据宽度,正点原子LCD的16位宽度。

STM32F4的FSMC将外部存储器分为固定大小的256M四个字节存储块。从图中可以看出,FSMC最高可管理1G外部空间有4个存储块,由块1驱动TFTLCD。

第一个存储块分为4个区域,每个区域管理64个区域M字节空间如下图所示

中途忙于其他事情,必须从零开始慢慢学习。

我这里使用的是正点原子的4.3 TFTLCD屏幕,驱动IC是9341,这里引用屋脊雀写的FSMC-TFTLCD调试记录:

在红色框1: 说明的9341这个IC支持RGB、串口、MCU接口,其中MCU接口为6800或8800时序口,正原子屏幕对应8800口。

红框2:9341显存,驱动lcd就是把显示数据写在这个地方

与屏幕连接的红框3和4:9341。

接下来看下TFTLCD的引脚定义

1号引脚CS是片选信号,2号引脚RS写命令/数据选择(0:命令,1:数据)WR是控制向TFTLCD写入数据,4号引脚RD是从TFTLCD读取数据,5号引脚RESET是屏幕的复位信号,6-21引脚是双向数据线,22、26、27是地面,23引脚LCD_BL是背光控制,24、25、28是3.3V电源。28是5V触摸控制信号为29、30、31、33、34。

下一步是STM33cubemx中设置FSMC,生成代码。

https://github.com/RT-Thread/rt-thread/tree/master/bsp/stm32/stm32f407-atk-explorer/board/ports https://github.com/RT-Thread/rt-thread/tree/master/bsp/stm32/stm32f407-atk-explorer/board/ports地址下载drv_lcd.c/drv_lcd.h,并将其复制到工程中drivers将文件夹下并添加到工程中。stm32f4xx_hal_conf.h找取消#define HAL_SRAM_MODULE_ENABLED注释(注意不是HAL_SDRAM_MODULE_ENABLED)编译通过。

在drv_lcd.h添加以下代码来指定画笔的颜色。

///画笔颜色 #define WHITE            0xFFFF #define BLACK            0x0000 #define BLUE             0x001F #define BRED             0XF81F #define GRED             0XFFE0 #define GBLUE            0X07FF #define RED              0xF800 #define MAGENTA          0xF81F #define GREEN            0x07E0 #define CYAN             0x7FFF #define YELLOW           0xFFE0 #define BROWN            0XBC40 #define BRRED            0XFC07 #define GRAY             0X8430  #define DARKBLUE         0X01CF #define LIGHTBLUE        0X7D7C #define GRAYBLUE         0X5458  #define LIGHTGREEN       0X841F #define LGRAY            0XC618  #define LGRAYBLUE        0XA651 #define LBBLUE           0X2B12

在main.c在串口控制台上输入以下代码进行编译、下载和输入lcd_fill,屏幕开始刷新。

void lcd_fill(int argc, void **argv) {     static rt_uint8_t lcd_init = 0;     rt_device_t lcd = RT_NULL;     rt_uint8_t x=0;     if(lcd_init == 0)     {         lcd_init = 1;          lcd = rt_device_find("lcd");//获取设备句柄         rt_device_init(lcd);//初始化lcd     }     while(1)     {         switch(x)         {         //填充颜色测试             case 0:LCD_Clear(WHITE);break;             case 1:LCD_Clear(BLACK);break;             case 2:LCD_Clear(BLUE);break;             case 3:LCD_Clear(RED);break;             case 4:LCD_Clear(MAGENTA);break;             case 5:LCD_Clear(GREEN);break;             case 6:LCD_Clear(CYAN);break;             case 7:LCD_Clear(YELLOW);break;             case 8:LCD_Clear(BRRED);break;             case 9:LCD_Clear(GRAY);break;             case 10:LCD_Clear(LGRAY);break;             case 11:LCD_Clear(BROWN);break;         };        x++;
        if(x==12)x=0;
        rt_thread_mdelay(1000);
    }


}
MSH_CMD_EXPORT(lcd_fill, lcd fill test for mcu lcd);

        新人刚刚入手玩RTT,记录得有点乱,请大佬们轻喷。

标签: tft2电容

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台