STM32F103 FSMC详解以及驱动LCD的应用
http://www.docin.com/p-481164347.html
FSMC硬件
对于STM32F103,无论是VET还是ZET6系列,FSMC的16位数据引脚D0~D15分别对应
D0->PD14, D1->PD15, D2->PD0, D3->PD1, D4->PE7, D5->PE8, D6->PE9, D7->PE10
D8->PE11, D9->PE12, D10->PE13, D11->PE14, D12->PE15, D13->PD8, D14->PD9, D15->PD10
控制线:手控板,战舰,奋斗版
都是LCD RD 和WR对应FSMC_NOE和FSMC_NWR,分别是PD4,PD5
战舰上,LCD片选使用NE4,对应PG12.手控板和奋斗版使用NE1,对应PD7
mini板接线图
数据线由PB0~PB15对应。
LCD背光PC10,
CS-》PC9,RS->PC8,WR->PC7,RD-》PC6
LCD硬件
2个都是16bit 80并口驱动。左侧为正点原子的LCD,ili9341驱动,右侧是手控板的LCDili9325驱动。
其中RS表示对LCD操作是命令还是数据,RS=0命令,RS=1数据
以代码形式说明LCD的读写时序
注意:下列分别是8bit和16bit位宽,以LPC1114和STM32F103RCT6的GPIO方式读写LCD
写命令,RS拉低,准备好数据后,WR信号来一个上升沿。(8bit位宽)
void LCD_WR_REG(uint16_t reg) { LPC_GPIO3->DATA &=~(1<<0); //RS=0; LPC_GPIO3->DATA &=~(1<<1); //CS=0; OUT_DATA(reg>>8); LPC_GPIO3->DATA &=~(1<<2); //WR=0; LPC_GPIO3->DATA |= (1<<2); //WR=1; OUT_DATA(reg); LPC_GPIO3->DATA &=~(1<<2); //WR=0; LPC_GPIO3->DATA |= (1<<2); //WR=1; LPC_GPIO3->DATA |= (1<<0); //RS=1; }
void LCD_WR_DATA(uint16_t val) { LPC_GPIO3->DATA |= (1<<0); //RS=1; LPC_GPIO3->DATA &=~(1<<1); //CS=0; OUT_DATA(val>>8); LPC_GPIO3->DATA &=~(1<<2); //WR=0; LPC_GPIO3->DATA |= (1<<2); //WR=1; OUT_DATA(val); LPC_GPIO3->DATA &=~(1<<2); //WR=0; LPC_GPIO3->DATA |= (1<<2); //WR=1; LPC_GPIO3->DATA |= (1<<1); //CS=1; }
16bit位宽版本
void LCD_WR_REG(u16 data) { LCD_RS_CLR;//写命令 LCD_CS_CLR; DATAOUT(data); LCD_WR_CLR; LCD_WR_SET; LCD_CS_SET; }
16bit读寄存器
u16 LCD_ReadReg(u16 LCD_Reg) { LCD_WR_REG(LCD_Reg); //写入要读取的寄存器号 return LCD_RD_DATA(); }
u16 LCD_RD_DATA(void) { u16 t; GPIOB->CRL=0X88888888; //PB0-7 上拉输入 GPIOB->CRH=0X88888888; //PB8-15 上拉输入 GPIOB->ODR=0X0000; //输出0 LCD_RS_SET; LCD_CS_CLR; LCD_RD_CLR; //拉低RD信号,从DATAIN数据线读数据后,再拉高 t=DATAIN; LCD_RD_SET; LCD_CS_SET; GPIOB->CRL=0X33333333; //PB0-7 上拉输出 GPIOB->CRH=0X33333333; //PB8-15 上拉输出 GPIOB->ODR=0XFFFF; //输出1 return t; }