1. FSMC是什么?为什么ILI9341需要它?
大家好,我是老李,在嵌入式行业摸爬滚打十多年了。今天我想和大家聊聊STM32的FSMC外设,以及如何用它来高效驱动ILI9341 LCD屏。如果你曾经用普通IO口模拟8080时序驱动过LCD,肯定体会过那种速度慢、CPU占用率高的痛苦。FSMC就是为了解决这个问题而生的。
FSMC的全称是Flexible Static Memory Controller,翻译过来就是"灵活的静态存储控制器"。这个外设最初设计是用来连接外部存储器的,比如SRAM、NOR Flash等。但因为它太灵活了,我们可以巧妙地配置它来模拟8080接口的时序,从而高效地驱动LCD屏。
ILI9341是一款很常见的TFT LCD控制器,它使用8080并行接口。传统的驱动方式需要我们用GPIO模拟时序,每写一个像素点都要操作多个引脚,既麻烦又慢。而使用FSMC,我们只需要像操作内存一样读写特定的地址,FSMC就会自动生成正确的时序,CPU占用率几乎为零,速度却能提升几十倍!
我记得第一次用FSMC驱动ILI9341时,那种流畅的刷新效果真的让我惊艳。之前用软件模拟时序,刷个全屏都要几百毫秒,还有明显的扫描线。改用FSMC后,同样的操作只需要几毫秒,动画效果丝般顺滑。
2. FSMC的工作原理与硬件连接
2.1 FSMC的地址映射机制
FSMC最巧妙的地方在于它的地址映射机制。STM32为FSMC预留了固定的地址空间,从0x60000000开始,总共1GB的空间被划分为4个Bank,每个Bank 256MB。我们通常使用Bank1,它又分为4个区,每个区64MB。
当我们向这些地址写入数据时,FSMC并不会真的去访问内存,而是会根据配置产生相应的时序信号。这就是为什么我们可以用FSMC来模拟各种接口时序。
对于ILI9341来说,我们需要两个重要的地址:一个用于发送命令,一个用于发送数据。这通过FSMC的地址线来实现。比如,如果我们把ILI9341的RS(寄存器选择)引脚连接到FSMC的A10地址线,那么:
当A10=0时,我们访问的是命令寄存器 当A10=1时,我们访问的是数据寄存器
对应的地址计算也很简单:
- 命令地址:Bank基地址 + 0x0000
- 数据地址:Bank基地址 + (1 << (10 + 1)) = Bank基地址 + 0x800
2.2 硬件连接要点
在实际硬件连接时,需要注意以下几点:
数据线连接:ILI9341支持8位和16位模式,推荐使用16位模式,因为速度更快。将FSMC_D0-D15连接到LCD的D0-D15。
控制线连接:
- FSMC_NE(片选) → LCD_CS
- FSMC_NWE(写使能) → LCD_WR
- FSMC_NOE(输出使能) → LCD_RD
- FSMC_Ax(地址线) → LCD_RS(DC)
其他引脚:
- 复位引脚接到普通GPIO
- 背光控制接到普通GPIO或者PWM输出
我遇到过最坑的一个问题是地址线对齐。有一次硬件同事把LCD_RS接到了

9611

被折叠的 条评论
为什么被折叠?



