TFTLCD简介
LCD为4.3 TFTLCD
本实验参考正点原子《STM32F1开发指南(精英版)-HAL库版本_V1.0》
FSMC简介
本实验参考正点原子《STM32F1开发指南(精英版)-HAL库版本_V1.0》
STM32CubeMX配置FSMC
LCD的背光引脚配置
使用PB0引脚,高电平点亮背光
工程代码解析
FSMC初始化
SRAM_HandleTypeDef hsram4;
/* FSMC initialization function */
void MX_FSMC_Init(void)
{
FSMC_NORSRAM_TimingTypeDef Timing = {0};
FSMC_NORSRAM_TimingTypeDef ExtTiming = {0};
/** Perform the SRAM4 memory initialization sequence
*/
hsram4.Instance = FSMC_NORSRAM_DEVICE;
hsram4.Extended = FSMC_NORSRAM_EXTENDED_DEVICE;
/* hsram4.Init */
hsram4.Init.NSBank = FSMC_NORSRAM_BANK4;//使用 NE4
hsram4.Init.DataAddressMux = FSMC_DATA_ADDRESS_MUX_DISABLE;//地址/数据线不复用
hsram4.Init.MemoryType = FSMC_MEMORY_TYPE_SRAM;//使用SRAM驱动来驱动LCD
hsram4.Init.MemoryDataWidth = FSMC_NORSRAM_MEM_BUS_WIDTH_16;//16 位数据宽度
hsram4.Init.BurstAccessMode = FSMC_BURST_ACCESS_MODE_DISABLE;//是否使能突发访问,仅对同步突发存储器有效,此处未用到
hsram4.Init.WaitSignalPolarity = FSMC_WAIT_SIGNAL_POLARITY_LOW;//等待信号的极性,仅在突发模式访问下有用
hsram4.Init.WrapMode = FSMC_WRAP_MODE_DISABLE;
hsram4.Init.WaitSignalActive = FSMC_WAIT_TIMING_BEFORE_WS;//存储器是在等待周期之前的一个时钟周期还是等待周期期间使能 NWAIT
hsram4.Init.WriteOperation = FSMC_WRITE_OPERATION_ENABLE;//存储器写使能
hsram4.Init.WaitSignal = FSMC_WAIT_SIGNAL_DISABLE;//等待使能位,此处未用到
hsram4.Init.ExtendedMode = FSMC_EXTENDED_MODE_ENABLE;//读写使用不同的时序
hsram4.Init.AsynchronousWait = FSMC_ASYNCHRONOUS_WAIT_DISABLE;//是否使能同步传输模式下的等待信号,此处未用到
hsram4.Init.WriteBurst = FSMC_WRITE_BURST_DISABLE;//禁止突发写
/* Timing */
Timing.AddressSetupTime = 6;//地址建立时间(ADDSET)为 7 个 HCLK 13.8ns*7=96.6ns
Timing.AddressHoldTime = 15;
Timing.DataSetupTime = 26;//数据保存时间为 27 个 HCLK =13.8*27=372.6ns
Timing.BusTurnAroundDuration = 0;//总线周转阶段持续时间为 0,
Timing.CLKDivision = 16;
Timing.DataLatency = 17;
Timing.AccessMode = FSMC_ACCESS_MODE_A;
/* ExtTiming */
ExtTiming.AddressSetupTime = 3;//地址建立时间(ADDSET)为 4 个 HCLK =55.2ns
ExtTiming.AddressHoldTime = 15;
ExtTiming.DataSetupTime = 6;//数据保存时间为 13.8ns*7 个 HCLK=96.6ns
ExtTiming.BusTurnAroundDuration = 0;//总线周转阶段持续时间为 0,
ExtTiming.CLKDivision = 16;
ExtTiming.DataLatency = 17;
ExtTiming.AccessMode = FSMC_ACCESS_MODE_A;
if (HAL_SRAM_Init(&hsram4, &Timing, &ExtTiming) != HAL_OK)
{
Error_Handler( );
}
/** Disconnect NADV
*/
__HAL_AFIO_FSMCNADV_DISCONNECTED();
}
注:这里的读时序配置(Timing)、写时序配置(ExtTiming )可以根据LCD的读写时序进行配置
LCD初始化
void LCD_Init(void)
{
HAL_Delay(50); // delay 50 ms
/*读LCD-ID*/
LCD_WR_REG(0XDA00);
lcddev.id=LCD_RD_DATA(); //读回0X00
LCD_WR_REG(0XDB00);
lcddev.id=LCD_RD_DATA(); //读回0X80
lcddev.id<<=8;
LCD_WR_REG(0XDC00);
lcddev.id|=LCD_RD_DATA(); //读回0X00
if(lcddev.id==0x8000)lcddev.id=0x5510;//NT35510读回的ID是8000H,为方便区分,我们强制设置为5510
if(lcddev.id==0x5510)
{
...
LCD_WR_REG(0x1100);
delay_us(120);
LCD_WR_REG(0x2900);
}
LCD_Display_Dir(0); //默认为竖屏
HAL_GPIO_WritePin(GPIOB, LCD_BL_PIN_Pin, GPIO_PIN_SET); /*开LCD背光*/
LCD_Clear(WHITE);
}