OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 17804|回复: 32

详细讲解LCD结构体地址以及地址线问题!

  [复制链接]

42

主题

358

帖子

0

精华

高级会员

Rank: 4

积分
889
金钱
889
注册时间
2014-8-16
在线时间
193 小时
发表于 2015-6-15 23:33:26 | 显示全部楼层 |阅读模式
看了好多新手都会对LCD那个结构体的地址产生疑问,刚好闲着没事发个帖子详细讲解一下。以下图为例


图中只画出了数据线与地址线 其他的线我没有花,请各位脑部一下,实在不行去看原子提供的LCD的原理图。

LCD有一个引脚是D/C引脚,用来区分往LCD中写入的数据是命令还是数据 Data/Command
比如说我要给LCD控制器的X寄存器写入数据Y 那么我需要先给LCD发送一个命令----X寄存器的地址,此时D/C引脚为低电平
然后再发送一个数据Y,此时D/C引脚为高电平。但是正常的FSMC总线中没有控制命令与数据的功能(或许我不知道)。
正常的FSMC是绝对地址寻址。也就是需要硬件地址线A0-AX(X为地址的长度)去控制。
所以STM32使用了一根地址线不是说往LCD控制的的某个地址写入数据。而是用这一根地址线去控制往LCD输入是命令还是数据。
那么是怎么控制的,咱们一点一点来分析。
首先数据手册上说 


为什么16位的时候要右移1位?这是因为宽度为16位的时候每写入一个数据,即为两个字节,那么地址就应该加2.
所以这样的话,用FSMC配置为16位数据宽度时,每次设置地址都只改变了HADDR[25:1],那么就会保证地址为2的倍数,不会出现从半个数据宽度的地址处写入数据的情况。搞清楚这个然后再来看原子提供的LCD结构体
[mw_shl_code=c,true]typedef struct { u16 LCD_REG; u16 LCD_RAM; } LCD_TypeDef; #define LCD_BASE ((u32)(0x6C000000 | 0x0000007E)) #define LCD ((LCD_TypeDef *) LCD_BASE)[/mw_shl_code]
这段代码,结构体中包含两个双字节成员LCD_REG跟LCD_RAM;
大家都知道结构体中的地址是从上到下连续增加的。
结构体的地址即为LCD_REG的地址。那么LCD_RAM的地址将为LCD_REG地址加2,因为是u16,双字节类型。
FSMC使用了NOR/SRAM的 Bank1 sector4 那么根据数据手册可以得知NOR/SRAM的起始地址为0x6000 0000
但是FSMC又把NOR这部分区域的地址分为了四块,在这使用的是第四块,所以HADDR[27 26] == 11
即27与26位为1,所以地址应该基地址应该为0x6C00 0000

然后再看地址线选用了A6当作LCD的D/C区分线,那么就应该是写入LCD_RAM时,第七位(还有A0嘛 这反应一下)应该为1。但是设置的数据宽度为16位,STM32会自动的右移1位,所以咱们需要反过来左移一位,那么就应该是1000 0000b 把这个数减2就应该是
0111 1110b 即为0x7E
那么0x6C00 0000 | 0x7E 这个地址将会是LCD结构体的首地址。 
[mw_shl_code=c,true]#define LCD_BASE ((u32)(0x6C000000 | 0x0000007E))[/mw_shl_code]
而这句话,将LCD_BASE代表这个地址数据
[mw_shl_code=c,true]#define LCD ((LCD_TypeDef *) LCD_BASE)[/mw_shl_code]
这句话将LCD定义为一个结构体指针,而这个结构体指针的地址为LCD_BASE

现在再反过来推一遍。
定义了这个结构体指针,第一个成员的地址为0x6C00 007E,第二个成员的地址为0x6C00 0080
把这两个数写成二进制格式
0110 1100 0000 0000 0000 0000 0111 1110
0110 1100 0000 0000 0000 0000 1000 0000
通过对比是不是看出来第8位从0变为了1,即为A7的电平状态,但是由于16位数据格式,要右移一位,所以就会成为A6的电平状态。
所以通过这个结构体对不同地址写入数据,就能控制是对LCD写入的是命令还是数据。
 
如果有说的不对的地方欢迎各位批评与指正!




正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

105

主题

522

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1386
金钱
1386
注册时间
2012-10-23
在线时间
97 小时
发表于 2018-4-25 14:09:18 | 显示全部楼层
本帖最后由 miaoguoqiang 于 2018-4-25 14:16 编辑

更详细的说明一下为什么使用这个存储块。原因是使用某个存储块的时候,相对应的NE就会拉低,用于指定片选信号。
回复 支持 1 反对 0

使用道具 举报

7

主题

146

帖子

1

精华

高级会员

Rank: 4

积分
895
金钱
895
注册时间
2014-1-2
在线时间
156 小时
发表于 2015-6-16 10:45:30 | 显示全部楼层
说得好 顶起
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2015-6-16 23:29:29 | 显示全部楼层
谢谢分享....
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
40
金钱
40
注册时间
2015-11-25
在线时间
8 小时
发表于 2015-12-7 13:41:33 | 显示全部楼层
讲的太好了,最缺的就是这种讲得清清楚楚的帖子了,真给力!
回复 支持 反对

使用道具 举报

4

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
80
金钱
80
注册时间
2016-1-15
在线时间
20 小时
发表于 2016-1-15 13:56:45 | 显示全部楼层
终于看明白这个7E是怎么来的了,新手就需要这种帖子,建议开发指南里加上这块,方便学习
回复 支持 反对

使用道具 举报

4

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
80
金钱
80
注册时间
2016-1-15
在线时间
20 小时
发表于 2016-1-15 13:59:33 | 显示全部楼层
正解,灰常感谢
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
19
金钱
19
注册时间
2016-1-7
在线时间
4 小时
发表于 2016-1-21 20:56:32 | 显示全部楼层
讲的太好了,醍醐灌顶啊!
回复 支持 反对

使用道具 举报

6

主题

115

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1027
金钱
1027
注册时间
2015-6-1
在线时间
126 小时
发表于 2016-1-21 21:53:08 | 显示全部楼层
谢谢分享,先收藏了
回复 支持 反对

使用道具 举报

6

主题

38

帖子

0

精华

初级会员

Rank: 2

积分
95
金钱
95
注册时间
2015-3-30
在线时间
33 小时
发表于 2016-2-5 13:51:35 | 显示全部楼层
正在学习这块,多谢讲解
回复 支持 反对

使用道具 举报

0

主题

6

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2016-5-31
在线时间
11 小时
发表于 2016-6-24 15:47:01 | 显示全部楼层
真的很感谢您!Thanks!
回复 支持 反对

使用道具 举报

10

主题

64

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
430
金钱
430
注册时间
2016-7-27
在线时间
53 小时
发表于 2016-8-5 08:34:25 | 显示全部楼层
感谢!
回复 支持 反对

使用道具 举报

3

主题

126

帖子

0

精华

高级会员

Rank: 4

积分
776
金钱
776
注册时间
2015-2-28
在线时间
251 小时
发表于 2016-8-6 16:54:54 | 显示全部楼层
感谢  !
回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2016-7-22
在线时间
7 小时
发表于 2016-10-19 18:56:24 | 显示全部楼层
楼主一生平安 ,谢谢
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
3
金钱
3
注册时间
2017-7-16
在线时间
0 小时
发表于 2017-7-16 16:04:24 | 显示全部楼层
通过这个结构体对不同地址写入数据,就能控制是对LCD写入的是命令还是数据。(什么数据都可以吗?)
回复 支持 反对

使用道具 举报

42

主题

358

帖子

0

精华

高级会员

Rank: 4

积分
889
金钱
889
注册时间
2014-8-16
在线时间
193 小时
 楼主| 发表于 2017-7-17 11:37:30 | 显示全部楼层
engine 发表于 2017-7-16 16:04
通过这个结构体对不同地址写入数据,就能控制是对LCD写入的是命令还是数据。(什么数据都可以吗?)

可以,但是如果写入无效数据,对LCD也是没有意义的。
回复 支持 反对

使用道具 举报

4

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
191
金钱
191
注册时间
2016-1-12
在线时间
42 小时
发表于 2017-7-17 16:48:51 | 显示全部楼层
9341的ID有4个,为什么是读去ID4?而不是其他的ID
回复 支持 反对

使用道具 举报

42

主题

358

帖子

0

精华

高级会员

Rank: 4

积分
889
金钱
889
注册时间
2014-8-16
在线时间
193 小时
 楼主| 发表于 2017-7-17 18:45:01 | 显示全部楼层
二十一画生 发表于 2017-7-17 16:48
9341的ID有4个,为什么是读去ID4?而不是其他的ID

好好看看规格书咯、
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

初级会员

Rank: 2

积分
124
金钱
124
注册时间
2017-11-16
在线时间
11 小时
发表于 2017-11-16 21:53:22 | 显示全部楼层
lz我有个疑问,地址中的某一位,如上述第8位(右移后位第7位)是如何影响一个引脚(A6)的电平高低呢,小弟不才,望不吝赐教。
回复 支持 反对

使用道具 举报

42

主题

358

帖子

0

精华

高级会员

Rank: 4

积分
889
金钱
889
注册时间
2014-8-16
在线时间
193 小时
 楼主| 发表于 2017-12-5 18:23:05 | 显示全部楼层
uniqueqspb 发表于 2017-11-16 21:53
lz我有个疑问,地址中的某一位,如上述第8位(右移后位第7位)是如何影响一个引脚(A6)的电平高低呢,小弟 ...

同理你改变gpio的odr寄存器会影响到io的输出电平
回复 支持 反对

使用道具 举报

2

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
144
金钱
144
注册时间
2016-8-3
在线时间
51 小时
发表于 2018-3-13 14:48:18 | 显示全部楼层
请教下,“这是因为宽度为16位的时候每写入一个数据,即为两个字节,那么地址就应该加2.”为什么写入一个数据,地址是加2不是加1?   最近在学FSMC这部分,看原子的例程也是在地址这里搞不懂
回复 支持 反对

使用道具 举报

1

主题

14

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1454
金钱
1454
注册时间
2015-8-18
在线时间
115 小时
发表于 2018-3-13 19:52:53 | 显示全部楼层
楼主讲得太好了,赞!
回复 支持 反对

使用道具 举报

39

主题

535

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1065
金钱
1065
注册时间
2018-3-27
在线时间
378 小时
发表于 2018-4-4 11:18:09 | 显示全部楼层
写命令只要保证A6为低电平就可以吗?
回复 支持 反对

使用道具 举报

1

主题

25

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
347
金钱
347
注册时间
2015-4-7
在线时间
94 小时
发表于 2018-4-4 15:14:42 | 显示全部楼层
没毛病    顶起
回复 支持 反对

使用道具 举报

4

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
148
金钱
148
注册时间
2018-10-23
在线时间
30 小时
发表于 2019-1-3 21:53:11 | 显示全部楼层
讲的很好!
回复 支持 反对

使用道具 举报

2

主题

7

帖子

0

精华

新手入门

积分
17
金钱
17
注册时间
2019-9-20
在线时间
3 小时
发表于 2019-10-2 19:20:10 | 显示全部楼层
谢谢指点
回复 支持 反对

使用道具 举报

79

主题

396

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1788
金钱
1788
注册时间
2015-9-21
在线时间
551 小时
发表于 2019-10-3 00:04:24 | 显示全部楼层
那么就应该是1000 0000b 把这个数减2   请问为什么要减2呢?
回复 支持 反对

使用道具 举报

79

主题

396

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1788
金钱
1788
注册时间
2015-9-21
在线时间
551 小时
发表于 2019-10-3 00:05:28 | 显示全部楼层

那么就应该是1000 0000b 把这个数减2
请问这个减2怎么理解。
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2019-10-4
在线时间
8 小时
发表于 2019-11-1 15:31:01 | 显示全部楼层
这样理解对不对:FSMC是绝对寻址,I/O口被复用为地址线,而这个结构体两个成员的地址为LCD的D/C区分线,只要调用了其中一个成员,FSMC就会启动I/O口(地址线)寻址,这样相应的I/O口(A6)的电平就根据调用哪个成员达到高电平还是低电平的效果。
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2020-3-10
在线时间
13 小时
发表于 2020-4-6 17:03:52 | 显示全部楼层
谢谢
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2019-9-20
在线时间
7 小时
发表于 2020-12-24 23:19:15 | 显示全部楼层
Thank!!!
回复 支持 反对

使用道具 举报

33

主题

114

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2019-7-8
在线时间
176 小时
发表于 2021-6-1 11:48:20 | 显示全部楼层
感谢分享,学习了
回复 支持 反对

使用道具 举报

1

主题

3

帖子

0

精华

初级会员

Rank: 2

积分
55
金钱
55
注册时间
2022-1-13
在线时间
7 小时
发表于 2022-2-12 18:01:55 | 显示全部楼层
感谢作者
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-25 23:55

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表