FSMC驱动lcd,lcd_cs接NCE2, lcd_rs接FSMC_A16, 其他按总线接法,可一直调不通,恳请高手赐教。
附相关代码:
/* 使用总线方式时定义地址 */
/* 挂在不同的BANK,使用不同地址线时请自行换算地址 */
// NCE2, A16=RS, 注意左移一位
#define LCD_REG (*((volatile unsigned short *) 0x64000000)) /* RS = 0 */
#define LCD_RAM (*((volatile unsigned short *) 0x64020000)) /* RS = 1 */
void ili9320_WriteData(u16 data)
{
LCD_RAM = data;
}
__inline void ili9320_WriteIndex(u16 idx)
{
LCD_REG = idx;
}
//初始化
void Lcd_Configuration(void)
{
RCC->AHBENR|=1<<8; //使能FSMC时钟
RCC->APB2ENR|=1<<3; //使能PORTB时钟
RCC->APB2ENR|=1<<5; //使能PORTD时钟
RCC->APB2ENR|=1<<6; //使能PORTE时钟
RCC->APB2ENR|=1<<8; //使能PORTG时钟
GPIOB->CRH&=0XFFFFFF0F;//PB9 推挽输出 背光
GPIOB->CRH|=0X00000030;
GPIOD->CRH&=0XFFF0FFFF;//PD12 推挽输出 RESET
GPIOD->CRH|=0X00030000;
//PORTD复用推挽输出 0 1 4 5 7 8 9 10 14 15
// PD7 NE1/NCE2
GPIOD->CRH&=0X00FFF000;
GPIOD->CRH|=0XBB000BBB;
GPIOD->CRL&=0X0F00FF00;
GPIOD->CRL|=0XB0BB00BB;
//PORTE复用推挽输出7~15,
GPIOE->CRH&=0X00000000;
GPIOE->CRH|=0XBBBBBBBB;
GPIOE->CRL&=0X0FFFFFFF;
GPIOE->CRL|=0XB0000000;
// PD11 A16
GPIOD->CRH&=0XFFFF0FFF;
GPIOD->CRH|=0X0000B000;
//寄存器清零
//bank1有NE1~4,每一个有一个BCR+TCR,所以总共八个寄存器。
//这里我们使用NCE2 ,也就对应BTCR[2],[3]。
FSMC_Bank1->BTCR[2]=0X00000000;
FSMC_Bank1->BTCR[3]=0X00000000;
FSMC_Bank1E->BWTR[2]=0X00000000;
//操作BCR寄存器 使用异步模式
FSMC_Bank1->BTCR[2]|=1<<12; //存储器写使能
FSMC_Bank1->BTCR[2]|=1<<14; //读写使用不同的时序
FSMC_Bank1->BTCR[2]|=1<<4; //存储器数据宽度为16bit
//操作BTR寄存器
//读时序控制寄存器
FSMC_Bank1->BTCR[3]|=0<<28; //模式A
FSMC_Bank1->BTCR[3]|=1<<0; //地址建立时间(ADDSET)为2个HCLK 1/36M=27ns
//因为液晶驱动IC的读数据的时候,速度不能太快,尤其对1289这个IC。
FSMC_Bank1->BTCR[3]|=0XF<<8; //数据保存时间为16个HCLK
//写时序控制寄存器
FSMC_Bank1E->BWTR[2]|=0<<28; //模式A
FSMC_Bank1E->BWTR[2]|=0<<0; //地址建立时间(ADDSET)为1个HCLK
//4个HCLK(HCLK=72M)因为液晶驱动IC的写信号脉宽,最少也得50ns。72M/4=24M=55ns
FSMC_Bank1E->BWTR[2]|=3<<8; //数据保存时间为4个HCLK
//使能BANK1,区域4
FSMC_Bank1->BTCR[2]|=1<<0; //使能BANK1,区域2
} |