OpenEdv-开源电子网

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

FSMC设置LCD结构体地址与操作LCD读写、求回复

[复制链接]

5

主题

90

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
282
金钱
282
注册时间
2016-8-5
在线时间
158 小时
发表于 2016-8-20 14:22:09 | 显示全部楼层 |阅读模式
1金钱
//LCD地址结构体
typedef struct
{
        vu16 LCD_REG;
        vu16 LCD_RAM;
} LCD_TypeDef;
//使用NOR/SRAM的 Bank1.sector4,地址位HADDR[27,26]=11 A10作为数据命令区分线
//注意设置时STM32内部会右移一位对其!      
#defineLCD_BASE        ((u32)(0x6C000000 | 0x000007FE))

#defineLCD             ((LCD_TypeDef *)LCD_BASE)

LCD_BASE,须根据外部电路的连接来确定,如Bank1.sector4就是从地址0X6C000000开
始,而0X000007FE,则是A10的偏移量。以A10为例,7FE换成二进制为:1111111 1110
,而16位数据时,地址右移一位对齐,对应到地址引脚,就是:A10:A0=0111111 1111,
此时A10是0,但是如果16位地址再加1(对应到8位地址是加2,即7FE+0X02),那么:
A10:A0=1000000 0000,此时A10就是1了,即实现了对RS的0和1的控制

LCD_TypeDef结构体地址,那么可以得到LCD->LCD_REG的
地址就是0X6C00,07FE,对应A10的状态为0(即RS=0),而LCD->LCD_RAM的地址就是
0X6C00,0800(结构体地址自增),对应A10的状态为1(即RS=1),从而实现对RS的控

制。

//写寄存器函数
//regval:寄存器值
void LCD_WR_REG(u16 regval)
{   
        LCD->LCD_REG=regval;//写入要写的寄存器序号         
}
//写LCD数据
//data:要写入的值
void LCD_WR_DATA(u16 data)
{         
        LCD->LCD_RAM=data;                 

}

不理解的地方、
一、A10与LCD_RAM和LCD_REG的关系、。上面写着、LCD->LCD_REG的地址对应A10为0、、16位对齐时、
要向右移一位、如果是0x000007FE>>1后再和0x6C000000 |    结果就是  6C0003FF、、但和A10是什么关系呢?
16位地址加1时 是0X00000800,再与0x6C000000 |   结果就是  6C000800  与A10又是什么关系呢?
没有一个正确的说明。让人难以理解

二、FSMC_D0到FSMC_D15 与 LCD->LCD_RAM 是什么关系呢、 LCD->LCD_RAM=data;说是写入数据、、
是不是。把data数据赋值给 LCD->LCD_RAM 这个寄存器地址时,A10为1,,然后寄存器地址上的值映射到FSMC_D0-FSMC_D15上??

初学STM32、、竟然卡在这里了、、




最佳答案

查看完整内容[请看2#楼]

1、LCD->LCD_REG地址就是0X6C0007FE。LCD->LCD_RAM的地址就是0X6C000800。把这两个改为二进制就是:1101100000000000000011111111110和1101100000000000000100000000000。红色的数字就是对应的A10地址线的!访问LCD_REG这个地址的时候A10不就是0了,访问LCD_RAM的时候A10不就是1了!这样不就对应起来了。 2、D0~D15是数据线,不是地址线!和LCD->LCD_REG、LCD->LCD_RAM没有任何关系。 3、好好百度一下,地址线和数据线的作用和区 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2016-8-20 14:22:10 | 显示全部楼层
本帖最后由 zuozhongkai 于 2016-8-20 14:52 编辑

1、LCD->LCD_REG地址就是0X6C0007FE。LCD->LCD_RAM的地址就是0X6C000800。把这两个改为二进制就是:1101100000000000000011111111110和1101100000000000000100000000000。红色的数字就是对应的A10地址线的!访问LCD_REG这个地址的时候A10不就是0了,访问LCD_RAM的时候A10不就是1了!这样不就对应起来了。
2、D0~D15是数据线,不是地址线!和LCD->LCD_REG、LCD->LCD_RAM没有任何关系。
3、好好百度一下,地址线和数据线的作用和区别。


开往春天的手扶拖拉机
回复

使用道具 举报

5

主题

90

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
282
金钱
282
注册时间
2016-8-5
在线时间
158 小时
 楼主| 发表于 2016-8-20 14:53:55 | 显示全部楼层
zuozhongkai 发表于 2016-8-20 14:47
1、LCD->LCD_REG地址就是0X6C0007FE。LCD->LCD_RAM的地址就是0X6C000800。把这两个改为二进制就是:11011000 ...

红色的数字就是对应的A10地址线?哪里有讲解这的?
回复

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2016-8-20 14:56:12 | 显示全部楼层
他说他不在 发表于 2016-8-20 14:53
红色的数字就是对应的A10地址线?哪里有讲解这的?

右移一位以后,地址线从bit0开始对应的A0,然后一直往上加!
开往春天的手扶拖拉机
回复

使用道具 举报

5

主题

90

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
282
金钱
282
注册时间
2016-8-5
在线时间
158 小时
 楼主| 发表于 2016-8-20 15:02:08 | 显示全部楼层
zuozhongkai 发表于 2016-8-20 14:56
右移一位以后,地址线从bit0开始对应的A0,然后一直往上加!

地址线明白了、FSMC的数据线与这两个寄存器又是怎么关系?
回复

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2016-8-20 15:10:28 | 显示全部楼层
他说他不在 发表于 2016-8-20 15:02
地址线明白了、FSMC的数据线与这两个寄存器又是怎么关系?

数据线是用来干嘛的?是用来传数据的,如果使用的SRAM的话那么你要往某个地址写数据,肯定要先确定地址,比如LCD_REG就是一个地址,然后要写的数据就通过数据线来传输!但是现在接的是LCD,并不是SRAM,不需要地址线!唯一需要的是通过一根地址线来确认发送的是LCD的数据还是指令,这里就是通过A10来确定发送的是指令还是数据!如果访问地址LCD_REG说明发送的指令,如果访问的LCD_RAM就说明发送的是数据!
开往春天的手扶拖拉机
回复

使用道具 举报

5

主题

90

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
282
金钱
282
注册时间
2016-8-5
在线时间
158 小时
 楼主| 发表于 2016-8-20 15:15:33 | 显示全部楼层
zuozhongkai 发表于 2016-8-20 15:10
数据线是用来干嘛的?是用来传数据的,如果使用的SRAM的话那么你要往某个地址写数据,肯定要先确定地址, ...

明白了。。谢谢、、
回复

使用道具 举报

14

主题

63

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
224
金钱
224
注册时间
2016-4-16
在线时间
62 小时
发表于 2016-9-2 16:20:01 | 显示全部楼层
zuozhongkai 发表于 2016-8-20 15:10
数据线是用来干嘛的?是用来传数据的,如果使用的SRAM的话那么你要往某个地址写数据,肯定要先确定地址, ...

既然访问地址LCD_REG说明发送的指令,那么怎么能将指令直接发给LCD_REG呢?还有数据不应该通过数据线发送吗?发给LCD_RAM干嘛,他不是只是标识你发的是数据吗

LCD->LCD_REG=regval;
LCD->LCD_RAM=data;   
回复

使用道具 举报

7

主题

41

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
244
金钱
244
注册时间
2016-7-12
在线时间
38 小时
发表于 2016-9-7 10:31:04 | 显示全部楼层
zuozhongkai 发表于 2016-8-20 14:22
1、LCD->LCD_REG地址就是0X6C0007FE。LCD->LCD_RAM的地址就是0X6C000800。把这两个改为二进制就是:11011000 ...

你画横线的那两位好像都是A11的位置,难道是转换完了还要右移一下吗?
回复

使用道具 举报

6

主题

110

帖子

0

精华

高级会员

Rank: 4

积分
553
金钱
553
注册时间
2014-10-23
在线时间
195 小时
发表于 2016-9-7 11:36:11 | 显示全部楼层
cccsssc 发表于 2016-9-7 10:31
你画横线的那两位好像都是A11的位置,难道是转换完了还要右移一下吗?

要的,他列出来的是HADDR[27:0]的地址,要右移一位,才会对应上FSMC_A。
回复

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2016-9-7 11:39:22 | 显示全部楼层
cccsssc 发表于 2016-9-7 10:31
你画横线的那两位好像都是A11的位置,难道是转换完了还要右移一下吗?

看资料和教程,要右移一位的。
开往春天的手扶拖拉机
回复

使用道具 举报

24

主题

695

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1666
金钱
1666
注册时间
2016-4-29
在线时间
266 小时
发表于 2016-9-7 12:21:57 | 显示全部楼层
对于LCD来说,可以看成是2个16位的存储空间,数据线是16位的,那么地址线只要1根就够了,而原理图中用到的地址线是FSMC的A10。
换成传统的思维来讲,RS 是LCD的寄存器与RAM选择脚,只要RS能呈现1和0的状态就行了,而FSMC的A10接的就是RS,想要让A10呈现1和0的变化,用了一个取巧的办法而已。
回复

使用道具 举报

1

主题

6

帖子

0

精华

初级会员

Rank: 2

积分
66
金钱
66
注册时间
2018-3-13
在线时间
11 小时
发表于 2018-8-16 15:48:49 | 显示全部楼层
这个问题我也看了好久,我感觉他们还是没有讲清楚,实际上要分开看,
1.我们在传输数据时候,同时传输的是数据,以及数据需要被存储的位置地址,虽然LCD不需要地址总线,因为它是递增的,所以我们没有接地址总线,
2.但是实际上FMC它的地址总线确实工作的,我们在传输LCD_REG的值的时候,值在LCD_D[31:0]上,LCD_REG的地址也传输到了数据总线FMC_A[25:0]上,这两类信号线都有信号,所以FMC_A[25:0]相应管脚就可以作为控制管脚啦。
回复

使用道具 举报

6

主题

105

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
368
金钱
368
注册时间
2018-8-31
在线时间
115 小时
发表于 2018-9-1 08:17:34 | 显示全部楼层
zuozhongkai 发表于 2016-8-20 15:10
数据线是用来干嘛的?是用来传数据的,如果使用的SRAM的话那么你要往某个地址写数据,肯定要先确定地址, ...

“但是现在接的是LCD,并不是SRAM,不需要地址线!”
请问没有地址,怎么确定是把数据写在LCD的哪个位置呢?
我能明白A10控制RS进行D0-D15的数据、命令复用,但是不清楚为啥不需要地址?而且采用的异步突发模式,这个时钟是怎么对应的呢??
回复

使用道具 举报

6

主题

105

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
368
金钱
368
注册时间
2018-8-31
在线时间
115 小时
发表于 2018-9-1 08:36:40 | 显示全部楼层
d1z1y2 发表于 2016-9-7 12:21
对于LCD来说,可以看成是2个16位的存储空间,数据线是16位的,那么地址线只要1根就够了,而原理图中用到的 ...

“对于LCD来说,可以看成是2个16位的存储空间”一个地址对应2个8位的存储空间吧?
回复

使用道具 举报

6

主题

105

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
368
金钱
368
注册时间
2018-8-31
在线时间
115 小时
发表于 2018-9-1 08:42:31 | 显示全部楼层
zuozhongkai 发表于 2016-8-20 15:10
数据线是用来干嘛的?是用来传数据的,如果使用的SRAM的话那么你要往某个地址写数据,肯定要先确定地址, ...

大佬解释的很明白了,我只是不明白在写数据的时候,数据所对应的地址自增的对不,不需要使用程序来控制,可是我们怎么知道他把数据写到哪里了,是不是我们写数据之前,指定了写数据首地址,然后就挨个把数据一个个发送??谢谢
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-20 16:26

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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