OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
12
返回列表 发新帖
楼主: PCA

TFT的RS端地址偏移量请教

[复制链接]

69

主题

336

帖子

0

精华

高级会员

Rank: 4

积分
632
金钱
632
注册时间
2013-12-11
在线时间
0 小时
发表于 2014-2-14 15:26:14 | 显示全部楼层
回复【50楼】正点原子:
---------------------------------
原子哥你就简单介绍一下就好了,每一次移位,每一次加1,每一次减1,都是干什么的?没事的时候回我就行
正点原子逻辑分析仪DL16劲爆上市
回复 支持 反对

使用道具 举报

46

主题

1579

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1970
金钱
1970
注册时间
2011-7-17
在线时间
4 小时
发表于 2014-2-17 10:31:51 | 显示全部楼层
回复【48楼】雪雪:
---------------------------------
其实你可以这么理解,就是STM32内部的FSMC,它操作起来,是右移一位操作的,也就是说,假如地址是二进制10,那么到了STM32内部,它会识别称二进制的1,所以,你在写地址的时候,要事先给地址左移以为,这样子到了STM32内部,这个地址才是正确的,否则,被STM32一弄,你的地址本来是9位的,就变了8位操作,最后的结果就是错误的了。
Time?And?Relative?Dimension?In?Space.
回复 支持 反对

使用道具 举报

69

主题

336

帖子

0

精华

高级会员

Rank: 4

积分
632
金钱
632
注册时间
2013-12-11
在线时间
0 小时
发表于 2014-2-17 11:16:11 | 显示全部楼层
回复【52楼】Tardis:
---------------------------------
有道理,谢了谢了
回复 支持 反对

使用道具 举报

1

主题

12

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2013-9-6
在线时间
0 小时
发表于 2014-2-21 15:41:29 | 显示全部楼层
回复【6楼】Tardis:
---------------------------------
回复【33楼】Tardis:

回复【30楼】北溟鱼:
---------------------------------
很简单,就是A0就是0,你得把0这个数左移一位当作FSMC地址,所以也就0了,A1是1,左移一位就是2,减去1作为地址,二进制是1,也就是0x00000001. 
A10二进制是10000000000,也就是0x400,减去1,也就是01111111111,也就是0x3FF,然后STM32是右移一位操作的,所以写程序的时候,你得把地址预先左移一位,0x3FF左移以为也就是二进制011111111110,也就是0x7FE,同理A16就是1FFFE了

---------------------------------
大神,这个回答上下文有点矛盾,对于A1,应该是先-1再左移,因为A10也是先-1再左移的
回复 支持 反对

使用道具 举报

8

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
93
金钱
93
注册时间
2013-12-6
在线时间
0 小时
发表于 2014-2-23 10:41:17 | 显示全部楼层
回复【54楼】猫先生:
---------------------------------
同问
回复 支持 反对

使用道具 举报

46

主题

1579

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1970
金钱
1970
注册时间
2011-7-17
在线时间
4 小时
发表于 2014-2-23 14:50:56 | 显示全部楼层
回复【54楼】猫先生:
---------------------------------
对于A1,你要当A2写地址,因为,在STM32内部,会右移一位操作,会变成A1的。
Time?And?Relative?Dimension?In?Space.
回复 支持 反对

使用道具 举报

31

主题

106

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
421
金钱
421
注册时间
2014-3-11
在线时间
15 小时
发表于 2014-7-5 09:37:28 | 显示全部楼层
回复【11楼】Tardis:
---------------------------------
换个头像吧,看着有点恶心。这个FSMC我不太懂,就认真的看看你回复的东西,可是在看的过程中,总是被你的动态头像影响,别扭,换个吧。
回复 支持 反对

使用道具 举报

31

主题

106

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
421
金钱
421
注册时间
2014-3-11
在线时间
15 小时
发表于 2014-7-5 11:11:03 | 显示全部楼层
回复【33楼】Tardis:
---------------------------------
很简单,就是A0就是0,你得把0这个数左移一位当作FSMC地址,所以也就0了,A1是1,左移一位就是2,减去1作为地址,二进制是1,也就是0x00000001. 
A10二进制是10000000000,也就是0x400,减去1,也就是01111111111,也就是0x3FF,然后STM32是右移一位操作的,所以写程序的时候,你得把地址预先左移一位,0x3FF左移以为也就是二进制011111111110,也就是0x7FE,同理A16就是1FFFE了


对于这个我有一个疑问。既然STM32是右移一位操作的,那么0111,1111,1110=7FE和0111,1111,1111=7FF这两个数,右移之后的结果都是011,1111,1111.那么A10的偏移地址为什么是7FE而不是7FF呢。

0X7FE=0111,1111,1110右移一位之后  011,1111,1111 

0X7FF=0111,1111,1111右移一位之后也是011,1111,1111. 

对应到引脚上都是FSMC_A[240]=011,1111,1111.此时A10=RS=0

然后如果地址加2

0X7FE+2=1000,0000,0000右移一位之后是100,0000,0000

0X7FF+2=1000,0000,0001右移一位之后是100,0000,0000

对应到引脚上都是FSMC_A[24:0]=100,0000,0000此时A10=RS=1
这么分析的话,两个都是满足要求的,但是,问了原子个之后,他说最低位不能给1,给1会出错误,具体因为什么,他也不知道。
回复 支持 反对

使用道具 举报

46

主题

1579

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1970
金钱
1970
注册时间
2011-7-17
在线时间
4 小时
发表于 2014-7-25 20:00:46 | 显示全部楼层
回复【58楼】cumtchw:
---------------------------------
关于这个,具体是什么原因,我也不清楚。
Time?And?Relative?Dimension?In?Space.
回复 支持 反对

使用道具 举报

2

主题

10

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2014-3-18
在线时间
0 小时
发表于 2014-8-11 15:24:24 | 显示全部楼层
回复【40楼】北溟鱼:
---------------------------------
我的问题和你的一模一样,请问下你是怎么做出来的?还修改了哪里呢
回复 支持 反对

使用道具 举报

34

主题

388

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
4090
金钱
4090
注册时间
2012-10-21
在线时间
642 小时
 楼主| 发表于 2014-8-12 16:01:03 | 显示全部楼层
重新回顾帖子,发现也好多人对FSMC这个问题有困扰,重新看一遍,又对FSMC一些东西理解了一些
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
21
金钱
21
注册时间
2014-4-10
在线时间
0 小时
发表于 2014-9-12 09:59:00 | 显示全部楼层
挺好的一个帖子
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
21
金钱
21
注册时间
2014-10-15
在线时间
0 小时
发表于 2014-10-15 21:04:02 | 显示全部楼层
这个帖子太好了,看了这个帖子对FSMC的学习又前进了一大步
回复 支持 反对

使用道具 举报

68

主题

136

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
428
金钱
428
注册时间
2014-6-27
在线时间
8 小时
发表于 2015-1-26 14:32:39 | 显示全部楼层
回复【59楼】Tardis:
---------------------------------
我知道回复【58楼】cumtchw:
---------------------------------
我知道为什么,因为它是16位方式宽度时,地址线只用了高25位,也就是最低一位没有用到,所以它只能偶地址寻址,0x7ff还是偶地址吗?明显不是
回复 支持 反对

使用道具 举报

15

主题

181

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
389
金钱
389
注册时间
2014-11-8
在线时间
40 小时
发表于 2015-3-10 15:58:23 | 显示全部楼层
mark...
回复 支持 反对

使用道具 举报

1

主题

4

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2015-12-23
在线时间
8 小时
发表于 2016-1-9 17:27:50 | 显示全部楼层
Tardis 发表于 2013-11-8 13:40
回复【14楼】chun307:
---------------------------------
1.写指令你知道什么时候FSMC发么?有时候FSMC静 ...

我也有一个问题要问,,,我看了一下这个地址只是定义了RS是读/写数据,那命令呢?
学无止尽
回复 支持 反对

使用道具 举报

2

主题

14

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2016-3-6
在线时间
11 小时
发表于 2016-3-19 19:09:14 | 显示全部楼层
Tardis 发表于 2013-12-18 11:15
回复【41楼】charly:
---------------------------------
减一的目的就是,你在减一的这个地址操作,A0会低 ...

A0是高电平有什么影响吗?我RS是接在A10上面的,并不关A0什么事啊?
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
24
金钱
24
注册时间
2016-5-9
在线时间
4 小时
发表于 2016-5-9 11:35:46 | 显示全部楼层
本帖最后由 tianxian 于 2016-5-9 11:39 编辑

也纠结于 0X000007FE 是A10 偏移量,看了老半天帖子 和 STM32手册 没看懂 还是得靠猜。 LCD_REG 地址 = 0x6C000000;  LCD_RAM 地址= 0X6C000800;  这由STM32手册理解到的,相信大家看多了就能理解。0X000007FE 是A10 偏移量和STM32手册根本就没关系。原来重点不在于什么FSMC,而在于原子的结构体。
-----------------------------------------------------------
typedef struct
{
        vu16 LCD_REG;
        vu16 LCD_RAM;
} LCD_TypeDef;
   
#define LCD_BASE        ((u32)(0x6C000000 | 0x000007FE))
#define LCD             ((LCD_TypeDef *) LCD_BASE)

------------------------------------------------------------
上面代码的意思是:
LCD.LCD_REG的地址=0X6C0007FE     // 这是被 “#define LCD   ((LCD_TypeDef *) LCD_BASE)” 这句设定的。
LCD.LCD_RAM的地址=0X6C000800    // 结构体成员存储地址的增加,上一个元素是u16类型的,占两个字节,到了这成员偏移量加了2;0X6C0007FE+2=0X6C000800。
这里是对C语言结构体储存方式的理解。


由于 FSMC_A[9:0]是没有接线的, [9:0] 是什么值对电路来说都无所谓,所以:
LCD.LCD_REG的地址 等效于 (0X6C0007FE & 0xFFFFF800) = 0x6C000000
LCD.LCD_RAM的地址 等效于 (0X6C000800 & 0xFFFFF800) = 0x6C000800




回复 支持 反对

使用道具 举报

106

主题

418

帖子

0

精华

高级会员

Rank: 4

积分
764
金钱
764
注册时间
2016-7-26
在线时间
123 小时
发表于 2016-10-4 23:42:41 | 显示全部楼层
Tardis 发表于 2012-10-22 08:30
FSMC其实很简单,STM32的FSMC中的SRAM部分分了4个区,每个区64M的,区里面的地址就对应FSMC的A系列引脚,例 ...

@Tardis 还在吗?能否说一下“这里用FSMC的地址引脚驱动TFT,就相当于你把TFT当作是一个4个字节(两个u16,一个寄存器,一个数据,也就是4个字节)的SRAM”,为什么是4个字节?
回复 支持 反对

使用道具 举报

106

主题

418

帖子

0

精华

高级会员

Rank: 4

积分
764
金钱
764
注册时间
2016-7-26
在线时间
123 小时
发表于 2016-10-5 02:16:38 | 显示全部楼层
Tardis 发表于 2013-12-18 11:15
回复【41楼】charly:
---------------------------------
减一的目的就是,你在减一的这个地址操作,A0会低 ...

话说还是不太明白为什么要减1。。。。。。。。
回复 支持 反对

使用道具 举报

1

主题

24

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
415
金钱
415
注册时间
2015-1-16
在线时间
82 小时
发表于 2017-3-4 21:37:33 | 显示全部楼层
慕名兰 发表于 2016-10-5 02:16
话说还是不太明白为什么要减1。。。。。。。。

1、首先要知道原子哥的地址偏移量是针对原子哥的结构体定义的
2、硬件连接是决定因素,原子哥的板子硬件上是 :A10接液晶的RS脚,A10的电平状态,决定对LCD的写命令操作(A10=0),还是写数据操作(A10=1)。
3、要明确程序中的地址,在内部FSMC的操作下是把程序中的地址右移一位后的地址才是     
LCD的地址;所以程序中的地址偏移量是要  预先左移一位的;;
  程序中的0x7FE(0x3FF左移一位)----->>对应写命令
  0x7FE+2 = 0x800(0x400左移一位)----->>对应写数据               
4、减1 的目的就是原子哥的结构体内:第一个成员地址是写命令(FSMC的要实现写操作,RS=0)
个人理解,有错误望指正
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-10 16:43

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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