Keil4自带的demo: STM32F103VE用FSMC驱动LCD AM-240320L8TNQW00H(ILI9320),MCU的A0连LCD的RS,在lcd.c里有:
typedef struct
{
__IO uint16_t LCD_REG;
__IO uint16_t LCD_RAM;
} LCD_TypeDef;
#define LCD_BASE ((uint32_t)(0x60000000 | 0x0C000000))
#define LCD ((LCD_TypeDef *) LCD_BASE)
第一个define好理解:LCD连接的是FSMC_Bank1_NOR/SRAM4,映射到FSMC的memory为0x6C00 0000 - 0x6FFF FFFF,共64MByte。
但第二个define该怎么理解呢,为什么LCD_REG(寄存器序号)地址为0x6C00 0000、LCD_RAM(该寄存器的值)地址为0x6C00 0001?
对于写寄存器,代码里有:
#define R1 0x01
LCD_WriteReg(R1, 0x0100);
uint16_t LCD_ReadReg(uint8_t LCD_Reg)
{
LCD->LCD_REG = LCD_Reg;
return (LCD->LCD_RAM);
}
MCU和LCD的通讯,从ILI9320 DS里的时序图可知是:先CS=0,RS=0,WR=0写IR,然后使CS=0,RS=1,WR=0再写index是IR值的寄存器(RS=1时不时写RAM么?不懂),而对于上面的LCD_WriteReg()语句,就是先往地址为0x6C00 0000的地方写0x01、再往地址为0x6C00 0001的地方写0x0100,中间也没有CS/RS/WR的设置,LCD_REG怎么就成了IR寄存器呢、LCD_RAM怎么就成了IR索引的那个寄存器呢?
首先我要更正一下既然你是用FSMC_A0作为RS控制线,你的写RAM地址是0X6C00 0002;其次我感觉你对C语言结构体还不是很了解,建议你在看看书,其它的如楼上所说!
因为你定义的结构的是十六位,由此判断你的LCD屏是并口16位的,而当使用STM32内部FSMC功能的时候十六位地址线对应物理地址往前移了一位。 希望对你有用,如有不懂发邮件给我259932738@163.com 互相学习~~~~ |
文章评论(0条评论)
登录后参与讨论