[其他ST产品] stm32F407 FSMC驱动TFTLCD

[复制链接]
2220|19
 楼主| 键盘手没手 发表于 2023-6-27 20:53 | 显示全部楼层 |阅读模式
  由于要通过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没有。原因还不明。
94529649adbbfc0a25.png

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

 楼主| 键盘手没手 发表于 2023-6-27 20:54 | 显示全部楼层
65283649adc0959bc5.png
在这里,准备用TFTLCD测试下FSMC接口,驱动TFTLCD屏幕显示可以理解为通过FSMC接口像读写外部SRAM基本一样,把需要显示的数据,写入9341的显存就可以完成显示操作,一般的SRAM的控制一般有:地址线(如A0~A18)、数据线(如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操作的时序和SRAM的控制完全类似,不同的是TFTLCD有RS信号,但是没有地址信号。
 楼主| 键盘手没手 发表于 2023-6-28 00:07 | 显示全部楼层
TFTLCD通过RS信号来决定传输的数据是数据还是命令。

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

        STM32F4的FSMC将外部存储器划分为固定大小为256M字节的四个存储块。从图里可得出,FSMC最高可管理1G的外部空间,拥有4个存储块,使用块1驱动TFTLCD。 38197649adc794f102.png
 楼主| 键盘手没手 发表于 2023-6-28 00:08 | 显示全部楼层
  第一个存储块被分成了4个区,每个区管理64M字节空间,寻址空间如下图

27983649b0977e859c.png

        中途去忙其他事了,又得从头来慢慢学起。
 楼主| 键盘手没手 发表于 2023-6-28 00:09 | 显示全部楼层
   我这里使用的是正点原子的4.3 TFTLCD屏幕,驱动IC是9341,这里引用屋脊雀写的FSMC-TFTLCD调试记录的内容:

76875649b0987865af.png

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

红色框2:就是9341的显存,驱动lcd就是将显示数据写到这个地方

红色框3和4:9341跟屏幕连接的地方。
 楼主| 键盘手没手 发表于 2023-6-28 00:09 | 显示全部楼层
接下来看下TFTLCD的引脚定义 4777649b09a8a5212.png 1号引脚CS是片选信号,2号引脚RS是写命令/数据选择(0:命令,1:数据),3号引脚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为触摸控制信号。
 楼主| 键盘手没手 发表于 2023-6-28 00:10 | 显示全部楼层
接下来就是在STM33cubemx中设置FSMC,生成代码。 20474649b09db149a2.png
 楼主| 键盘手没手 发表于 2023-6-28 00:10 | 显示全部楼层
地址下载drv_lcd.c/drv_lcd.h,并复制到工程的drivers文件夹下,并将其添加到工程中。到stm32f4xx_hal_conf.h中找到取消#define HAL_SRAM_MODULE_ENABLED的注释(注意不是HAL_SDRAM_MODULE_ENABLED)编译通过。
 楼主| 键盘手没手 发表于 2023-6-28 00:10 | 显示全部楼层
    在drv_lcd.h中加入以下代码,用以指定画笔颜色。
  1. //画笔颜色
  2. #define WHITE            0xFFFF
  3. #define BLACK            0x0000
  4. #define BLUE             0x001F
  5. #define BRED             0XF81F
  6. #define GRED             0XFFE0
  7. #define GBLUE            0X07FF
  8. #define RED              0xF800
  9. #define MAGENTA          0xF81F
  10. #define GREEN            0x07E0
  11. #define CYAN             0x7FFF
  12. #define YELLOW           0xFFE0
  13. #define BROWN            0XBC40
  14. #define BRRED            0XFC07
  15. #define GRAY             0X8430

  16. #define DARKBLUE         0X01CF
  17. #define LIGHTBLUE        0X7D7C
  18. #define GRAYBLUE         0X5458

  19. #define LIGHTGREEN       0X841F
  20. #define LGRAY            0XC618

  21. #define LGRAYBLUE        0XA651
  22. #define LBBLUE           0X2B12

 楼主| 键盘手没手 发表于 2023-6-28 00:16 | 显示全部楼层
  在main.c中输入以下代码,编译、下载、在串口控制台输入lcd_fill,屏幕就开始刷新了。
  1. void lcd_fill(int argc, void **argv)
  2. {
  3.     static rt_uint8_t lcd_init = 0;
  4.     rt_device_t lcd = RT_NULL;
  5.     rt_uint8_t x=0;
  6.     if(lcd_init == 0)
  7.     {
  8.         lcd_init = 1;

  9.         lcd = rt_device_find("lcd");//获取设备句柄
  10.         rt_device_init(lcd);//初始化lcd
  11.     }
  12.     while(1)
  13.     {
  14.         switch(x)
  15.         {
  16.         //填充颜色测试
  17.             case 0:LCD_Clear(WHITE);break;
  18.             case 1:LCD_Clear(BLACK);break;
  19.             case 2:LCD_Clear(BLUE);break;
  20.             case 3:LCD_Clear(RED);break;
  21.             case 4:LCD_Clear(MAGENTA);break;
  22.             case 5:LCD_Clear(GREEN);break;
  23.             case 6:LCD_Clear(CYAN);break;
  24.             case 7:LCD_Clear(YELLOW);break;
  25.             case 8:LCD_Clear(BRRED);break;
  26.             case 9:LCD_Clear(GRAY);break;
  27.             case 10:LCD_Clear(LGRAY);break;
  28.             case 11:LCD_Clear(BROWN);break;
  29.         };
  30.         x++;
  31.         if(x==12)x=0;
  32.         rt_thread_mdelay(1000);
  33.     }


  34. }
  35. MSH_CMD_EXPORT(lcd_fill, lcd fill test for mcu lcd);
童雨竹 发表于 2024-2-1 08:10 | 显示全部楼层

引线长度就决定了其响应信号的波长
Wordsworth 发表于 2024-2-1 09:13 | 显示全部楼层

数字电压表(DVM)或仪器来测量效率
Clyde011 发表于 2024-2-1 10:16 | 显示全部楼层

靠近功率开关管或整流器的电容分到的纹波电流远多于相距较远的电容分到的纹波电流
公羊子丹 发表于 2024-2-1 11:09 | 显示全部楼层

任何一条PCB引线都可能成为天线
万图 发表于 2024-2-1 12:12 | 显示全部楼层

滤波电容、功率开关管或整流器、电感或变压器
Uriah 发表于 2024-2-1 13:15 | 显示全部楼层

离线式变换器
帛灿灿 发表于 2024-2-1 15:11 | 显示全部楼层

交流能量就会从输入或输出滤波电容上流进流出
Bblythe 发表于 2024-2-1 16:14 | 显示全部楼层

经变压器映射成这么多节点
周半梅 发表于 2024-2-1 18:10 | 显示全部楼层

专门的滤波器来阻止交流噪声进入周围的电路
Pulitzer 发表于 2024-2-1 19:13 | 显示全部楼层

电流型变换器电流检测电阻的公共接点和输出端电阻分压器的下端
您需要登录后才可以回帖 登录 | 注册

本版积分规则

104

主题

1260

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部