1. STM32与LCD显示模块的基础连接
在嵌入式开发领域,STM32微控制器与LCD显示模块的结合是最经典的人机交互方案之一。我使用STM32F4系列驱动4.3寸TFT-LCD已经五年有余,从最初的FSMC总线到现在的LTDC控制器,积累了不少实战经验。让我们从硬件连接这个最基础的环节开始。
1.1 接口选型与物理连接
常见的LCD接口主要有三种:8080并行接口(又称MCU接口)、RGB接口和SPI接口。对于STM32而言:
- 8080接口:适合中小尺寸LCD(通常7寸以下),使用8/16位数据线+控制信号线,STM32通过FSMC/FMC控制器实现高效访问
- RGB接口:适合大尺寸LCD(通常4.3寸以上),需要STM32配备LTDC控制器
- SPI接口:适合超小尺寸LCD(通常2寸以下),节省IO但刷新率低
以最常用的8080接口为例,硬件连接需要注意:
- 数据线D0-D15对应连接FSMC_D0-D15
- 读写信号线/NRD、/NWE分别连接LCD模块的/RD、/WR
- 片选信号连接FSMC_NE1/NE2等(不同Bank地址范围不同)
- 背光控制建议使用PWM驱动,避免直接接VCC
关键提示:FSMC的地址线A0-A25中只需要用一根(通常A10)连接LCD的RS(寄存器选择)引脚,这决定了是发送命令还是数据。
1.2 FSMC控制器配置
STM32的FSMC(Flexible Static Memory Controller)是驱动并行LCD的核心。以STM32F407为例,配置步骤如下:
-
使能FSMC时钟:
c复制
RCC_AHB3PeriphClockCmd(RCC_AHB3Periph_FSMC, ENABLE); -
配置时序参数(以ILI9341为例):
c复制FSMC_NORSRAMInitTypeDef init; FSMC_NORSRAMTimingInitTypeDef timing; timing.FSMC_AddressSetupTime = 2; timing.FSMC_AddressHoldTime = 0; timing.FSMC_DataSetupTime = 5; // 根据LCD手册调整 timing.FSMC_BusTurnAroundDuration = 0; timing.FSMC_CLKDivision = 0; timing.FSMC_DataLatency = 0; timing.FSMC_AccessMode = FSMC_AccessMode_A; init.FSMC_Bank = FSMC_Bank1_NORSRAM1; init.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable; init.FSMC_MemoryType = FSMC_MemoryType_SRAM; init.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b; init.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable; init.FSMC_AsynchronousWait = FSMC_AsynchronousWait_Disable; init.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low; init.FSMC_WrapMode = FSMC_WrapMode_Disable; init.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState; init.FSMC_WriteOperation = FSMC_WriteOperation_Enable; init.FSMC_WaitSignal = FSMC_WaitSignal_Disable; init.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable; init.FSMC_WriteBurst = FSMC_WriteBurst_Disable; init.FSMC_ReadWriteTimingStruct = &timing; init.FSMC_WriteTimingStruct = &timing; FSMC_NORSRAMInit(&init); FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM1, ENABLE); -
定义访问宏:
c复制#define LCD_BASE ((uint32_t)0x60000000) #define LCD_REG *(volatile uint16_t *)(LCD_BASE) #define LCD_RAM
