STM32驱动LCD显示模块实战指南

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接口为例,硬件连接需要注意:

  1. 数据线D0-D15对应连接FSMC_D0-D15
  2. 读写信号线/NRD、/NWE分别连接LCD模块的/RD、/WR
  3. 片选信号连接FSMC_NE1/NE2等(不同Bank地址范围不同)
  4. 背光控制建议使用PWM驱动,避免直接接VCC

关键提示:FSMC的地址线A0-A25中只需要用一根(通常A10)连接LCD的RS(寄存器选择)引脚,这决定了是发送命令还是数据。

1.2 FSMC控制器配置

STM32的FSMC(Flexible Static Memory Controller)是驱动并行LCD的核心。以STM32F407为例,配置步骤如下:

  1. 使能FSMC时钟:

    c复制RCC_AHB3PeriphClockCmd(RCC_AHB3Periph_FSMC, ENABLE);
    
  2. 配置时序参数(以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);
    
  3. 定义访问宏:

    c复制#define LCD_BASE        ((uint32_t)0x60000000)
    #define LCD_REG         *(volatile uint16_t *)(LCD_BASE)
    #define LCD_RAM      

内容推荐

已经到底了哦
已经到底了哦