FSMC驱动TFT_LCD(mcu接口) --Stm32CubeIDE

 

一、介绍

本次开发基于战舰v3开发板(stm32ZET6  2.8寸TFTLCD屏  分辨率320*240  16位80并口)   采用STM32CubeIDE 配置FSMC模块

二、原理

1、TFTLCD

  TFTLCD 采用I80并口   5条基本控制信号线: 1、片选 2、写使能 3、读使能 4、数据、命令选择 5、复位    80并口时序图如下:

FSMC驱动TFT_LCD(mcu接口) --Stm32CubeIDE_第1张图片

2、FSMC

STM32F10xxx 灵活的静态存储控制器(FSMC) 为嵌入式外部存储控制器, 可使 STM32F10xxx
微控制器与多种存储器接口,包括 SRAM、 NOR Flash、 NAND Flash 及 LCD 模组。
FSMC NOR Flash/SRAM 存储区域适合 MCU 并行彩色 LCD 接口。

FSMC 框图如下:

                           FSMC驱动TFT_LCD(mcu接口) --Stm32CubeIDE_第2张图片

从FSMC的角度  外部存储器划分为4个固定大小存储区域 ,每个存储区域大小为256MB,存储区域1 可连接多达4个NOR Flash 或PSRAM区域,带4个专用片选信号。 如下:

     FSMC驱动TFT_LCD(mcu接口) --Stm32CubeIDE_第3张图片

NOR/PSRAM地址映射

  HADDR[27:26] 用于从四个存储区域之中选择一个存储区域 , 这里我们选择 NOR/PSRAM4  连接LCD 

             FSMC驱动TFT_LCD(mcu接口) --Stm32CubeIDE_第4张图片

  HADDR[25:0] 包含外部存储器地址,由于HADDR 为字节地址,而存储器按字寻址,所以根据存储器数据宽度不同,实际向存储器发送的地址也将有所不同,我们LCD 显存是16位寻址   如下:

           FSMC驱动TFT_LCD(mcu接口) --Stm32CubeIDE_第5张图片

                     FSMC驱动TFT_LCD(mcu接口) --Stm32CubeIDE_第6张图片         FSMC的NOR FLASH 控制器支持同步和异步突发模式,对于异步突发访问方式,FSMC 主要设置3个时间参数: 地址建立时间(AADDSET)数据建立时间(DATASET)和地址保持时间(ADDHLD)  FSMC 综合SRAM、PSRAM、NOR FLASH信号特点定义了4种不同的异步时序模型  如下:

                   FSMC驱动TFT_LCD(mcu接口) --Stm32CubeIDE_第7张图片

       本次LCD 选用异步模式A方式来控制TFTLCD   根据模式A计算公式得到三个参数值   ,计算公式就不贴出来了     

模式A的读写操作时序如下:

                             FSMC驱动TFT_LCD(mcu接口) --Stm32CubeIDE_第8张图片

                      FSMC驱动TFT_LCD(mcu接口) --Stm32CubeIDE_第9张图片

写或读访问的时间为 LCD 片选信号下降沿和上升沿之间的时间。使用 FSMC 时间参数的函数
计算此时间:
           写 / 读访问 = ((ADDSET + 1) + (DATAST + 1)) × HCLK = tCYC
DATAST 参数在写操作中写信号的下降沿和上升沿之间测量:
          写使能信号低电平到高电平 = DATAST × HCLK
为确保 FSMC 的正确时间配置,必须考虑下列时间:
       ● 最大写 / 读访问时间
       ● 不同的内部存储器延迟。
因此,我们有如下等式:
             ((ADDSET + 1) + (DATAST + 1)) × HCLK = max(tCYC, tCYC(READ))
             DATAST × HCLK = tWRLW
             DATAST 必须为:
             DATAST = (((tACC + tAS ) + (tsu(Data_NE)+ tv(A_NE)))/HCLK) – ADDSET – 4

其中:
 tsu(Data_NE): FSMC_NEx 低电平到数据有效
 tv(A_NE): FSMC_NEx 低电平到 FSMC_A 有效

(tsu(Data_NE)+ tv(A_NE)) = 36 ns

                               FSMC驱动TFT_LCD(mcu接口) --Stm32CubeIDE_第10张图片

三、案例

1、硬件连接

                       FSMC驱动TFT_LCD(mcu接口) --Stm32CubeIDE_第11张图片

LCD接口 介绍 mcu接口 介绍
LCD_CS 片选 FSMC_NE4 BANK1
LCD_RS 命令/数据标志 FSMC_A10 地址线
LCD_WR 写信号 FSMC_NWE 写信号
LCD_RD 读信号 FSMC_NOE 读信号
LCD_RST 硬复位 RESET 复位
DB[...] 16位双向数据线 FSMC_D[0-15] 数据线
BL 背光 PB0  

 

2、STM32CubeIDE FSMC 配置

FSMC驱动TFT_LCD(mcu接口) --Stm32CubeIDE_第12张图片

 

FSMC驱动TFT_LCD(mcu接口) --Stm32CubeIDE_第13张图片

生成代码如下:

void MX_FSMC_Init(void)
{
  FSMC_NORSRAM_TimingTypeDef Timing = {0};
  FSMC_NORSRAM_TimingTypeDef ExtTiming = {0};

  /** Perform the SRAM1 memory initialization sequence
  */
  hsram1.Instance = FSMC_NORSRAM_DEVICE;
  hsram1.Extended = FSMC_NORSRAM_EXTENDED_DEVICE;
  /* hsram1.Init */
  hsram1.Init.NSBank = FSMC_NORSRAM_BANK4;
  hsram1.Init.DataAddressMux = FSMC_DATA_ADDRESS_MUX_DISABLE;
  hsram1.Init.MemoryType = FSMC_MEMORY_TYPE_SRAM;
  hsram1.Init.MemoryDataWidth = FSMC_NORSRAM_MEM_BUS_WIDTH_16;
  hsram1.Init.BurstAccessMode = FSMC_BURST_ACCESS_MODE_DISABLE;
  hsram1.Init.WaitSignalPolarity = FSMC_WAIT_SIGNAL_POLARITY_LOW;
  hsram1.Init.WrapMode = FSMC_WRAP_MODE_DISABLE;
  hsram1.Init.WaitSignalActive = FSMC_WAIT_TIMING_BEFORE_WS;
  hsram1.Init.WriteOperation = FSMC_WRITE_OPERATION_ENABLE;
  hsram1.Init.WaitSignal = FSMC_WAIT_SIGNAL_DISABLE;
  hsram1.Init.ExtendedMode = FSMC_EXTENDED_MODE_ENABLE;
  hsram1.Init.AsynchronousWait = FSMC_ASYNCHRONOUS_WAIT_DISABLE;
  hsram1.Init.WriteBurst = FSMC_WRITE_BURST_DISABLE;
  /* Timing */
  Timing.AddressSetupTime = 2;
  Timing.AddressHoldTime = 15;
  Timing.DataSetupTime = 16;
  Timing.BusTurnAroundDuration = 0;
  Timing.CLKDivision = 16;
  Timing.DataLatency = 17;
  Timing.AccessMode = FSMC_ACCESS_MODE_A;
  /* ExtTiming */
  ExtTiming.AddressSetupTime = 2;
  ExtTiming.AddressHoldTime = 15;
  ExtTiming.DataSetupTime = 4;
  ExtTiming.BusTurnAroundDuration = 0;
  ExtTiming.CLKDivision = 16;
  ExtTiming.DataLatency = 17;
  ExtTiming.AccessMode = FSMC_ACCESS_MODE_A;

  if (HAL_SRAM_Init(&hsram1, &Timing, &ExtTiming) != HAL_OK)
  {
    Error_Handler( );
  }

  /** Disconnect NADV
  */

  __HAL_AFIO_FSMCNADV_DISCONNECTED();

}

3、代码实现操作LCD寄存器

定义一个结构体 LCD_TypeDef    LCD_REG 地址为0x6C0007FE  LCD_RAM 地址 0x6C000800   

LCD->LCD_REG = value ;A10 电平为低     写入LCD的value为命令   

LCD->LCD_RAM = value;  A10电平为高, 写入LCD的value为数据

typedef struct
{
  __IO uint16_t LCD_REG;
  __IO uint16_t LCD_RAM;
} LCD_TypeDef;

/* LCD is connected to the FSMC_Bank1_NOR/SRAM4 and NE4 is used as ship select signal */
#define LCD_BASE    ((uint32_t)(0x6C000000 | 0x00007FE))
#define LCD         ((LCD_TypeDef *) LCD_BASE)

4、根据LCD手册配置参数 、 上点、 开启背光、设置屏幕区域大小  清屏 

代码上传地址:  

你可能感兴趣的:(LCD)