原创 STM32的FSMC是怎样通过什么机制去控制LCD_ILI9320的RS

2011-6-29 15:44 5478 9 9 分类: MCU/ 嵌入式

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
互相学习~~~~
PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
9
关闭 站长推荐上一条 /3 下一条