如何理解FSMC写地址的自动过程LCD->LCD_REG=CMD

2019-07-20 08:09发布

诸位,最近在看FSMC,不太理解这样的操作,



//LCD 操作结构体
typedef struct
{
u16 LCD_REG;
u16 LCD_RAM;
} LCD_TypeDef;
//使用 NOR/SRAM 的 Bank1.sector4,地址位 HADDR[27,26]=11 A6 作为数据命令区分线
//注意 16 位数据总线时, STM32 内部地址会右移一位对齐!
#define LCD_BASE ((u32)(0x6C000000 | 0x0000007E))
#define LCD ((LCD_TypeDef *) LCD_BASE)
其中 LCD_BASE,必须根据我们外部电路的连接来确定,我们使用 Bank1.sector4 就是从
地址 0X6C000000 开始,而 0X0000007E,则是 A6 的偏移量,
所以,有了这个定义,当我们要往 LCD 写命令/数据的时候,可以这样写:
LCD->LCD_REG=CMD; //写命令
LCD->LCD_RAM=DATA; //写数据
而读的时候反过来操作就可以了,如下所示:
CMD= LCD->LCD_REG;//读 LCD 寄存器
DATA = LCD->LCD_RAM;//读 LCD 数据
这其中, CS、 WR、 RD 和 IO 口方向都是由 FSMC 控制,不需要我们手动设置了。

  在前面的讲解中,明白了LCD->LCD_RAM与LCD->LCD_REG都是地址,为什么可以直接往地址里面写数据?查资料说有写寄存器序号啥的,也没整明白。谁能帮我解释一下,如何理解这一句。


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
11条回答
kmmyk
1楼-- · 2019-07-21 06:31
REG和RAM对应两个地址,往这两个地址写数据,D口输出数据,而A口会自己形成一个地址。
正因为两个地址的第7位(对应A6)不一样,才使便A6这根线产生不同的电平,来区分是命令还是数据。
Theone
2楼-- · 2019-07-21 10:04
二十一画生 发表于 2017-7-4 20:23
我的意思就是,是不是执行这两条语句的时候,(往这两个特殊的地址赋值写内容,比如cmd,data)fsmc会自 ...

那是fsmc这个控制器已经设计好的东西,你为什么要理解这个。
michael91
3楼-- · 2019-07-21 13:52
 精彩回答 2  元偷偷看……
二十一画生
4楼-- · 2019-07-21 16:40
michael91 发表于 2017-7-31 16:30
@正点原子 请问楼主理解了没,我看了一天了,也是这个地方理解不了,为什么把数据送到这两个地址里面数据就 ...

stm32f407自己的内存范围只有几百M大小,而LCD->LCD_REG这个地址是远远大于自身内存大小,(也就是默认的程序存储运行区,),这样的话,当向这个地址写数据的时候,FSMC内部会比较是外部还是内部,判断为外部存储设备(LCD显存,也就是目标寄存器)时,它就会产生相应的读写时序以及数据发送方向。这样就完成了写数据和命令的过程。姑且就这么理解吧,希望有大神帮我们有更透彻的理解。
gotofly21
5楼-- · 2019-07-21 19:40
 精彩回答 2  元偷偷看……

一周热门 更多>