OpenEdv-开源电子网

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

由FSMC想到的一点疑问,我知道肯定是我单片机基础没学好,空中楼阁了,特来请教。

[复制链接]

33

主题

159

帖子

0

精华

高级会员

Rank: 4

积分
527
金钱
527
注册时间
2017-1-21
在线时间
192 小时
发表于 2017-3-29 23:11:57 | 显示全部楼层 |阅读模式
5金钱
本帖最后由 oyixi001 于 2017-3-29 23:13 编辑

我一直都是跟着开发边学边用,所以单片机基础学的差了点吧,都是建立在能用就行的基础上。玩儿STM32也有一两年了,用原子哥的板子很顺手啊。
最近比较闲开始琢磨一些基础性的问题,可能很傻哈。

我理解的,这个FSMC就是把定义在寻址范围内的变量在读或写的时候同样的通过IO的时序把数据写到对应的器件里去,可以是外挂的SRAM、LCD啥的。
比如,原子哥用的lcd  定义WR_REG 0X000007FE; WR_data 0x00000800; 当对这两个地址的变量进行读或写时就会相应地操作FSMC。

然后我就很奇怪,这个变量被强制定义在这个地址,这个地址是什么呢?
我想:1、直接对应片内的RAM某个word? 2、还是直接对应片内的FLASH某个word?3、或者是片内的RAM的一个word然后被强制赋予了一个0x000007fe的地址?
如果是1、2、感觉不可能,毕竟片内RAM没有这么多空间啦。感觉可能是3吧,或者都不对。
还是那句话,单片机原理学的差,东西一多就搅合了,再加上平时还做点汇编的8位垃圾单片机程序,感觉好乱。
求原子哥或哪位大神帮忙理理!@正点原子  。

最佳答案

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

这不是变量,既然你懂汇编,这么说吧,我猜测这是个用于ldr 或者 mov的一个常数,是直接写在代码里的。这个数可以直接用机器代码给求出来的,并不是变量,也不会存在ram里
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

69

主题

978

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3761
金钱
3761
注册时间
2015-4-26
在线时间
761 小时
发表于 2017-3-29 23:11:58 | 显示全部楼层
oyixi001 发表于 2017-3-30 09:25
这个东西我能明白,也都能正常用fsmc。
我只是没明白一点,我们把某一个变量地址强制定义为bank1.4的某 ...

这不是变量,既然你懂汇编,这么说吧,我猜测这是个用于ldr 或者 mov的一个常数,是直接写在代码里的。这个数可以直接用机器代码给求出来的,并不是变量,也不会存在ram里
我有故事,你有酒吗
回复

使用道具 举报

11

主题

1042

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3699
金钱
3699
注册时间
2011-5-23
在线时间
2009 小时
发表于 2017-3-29 23:32:24 | 显示全部楼层
定义成 0 就没那么绕了

关于STM32F103偏移地址问题
RT-Thread RTOS 音频,WIFI,蓝牙
回复

使用道具 举报

9

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
100
金钱
100
注册时间
2016-6-5
在线时间
27 小时
发表于 2017-3-30 09:00:43 | 显示全部楼层
本帖最后由 Tekmarine 于 2017-3-30 09:05 编辑

那两个值应该对应的是LCD的CD线在外部总线(FSMC)上的位置,楼主应该知道分别对这两个地址写数据时,外部总线上的A11号地址线的输出电平是是不一样的吧?相当于是选择给LCD写数据或是指令。把那两个值加上FSMC本身的地址,就可以理解为是LCD的数据寄存器和指令寄存器在单片机中的物理地址。
回复

使用道具 举报

33

主题

159

帖子

0

精华

高级会员

Rank: 4

积分
527
金钱
527
注册时间
2017-1-21
在线时间
192 小时
 楼主| 发表于 2017-3-30 09:25:14 | 显示全部楼层
aozima 发表于 2017-3-29 23:32
定义成 0 就没那么绕了

关于STM32F103偏移地址问题

这个东西我能明白,也都能正常用fsmc。
我只是没明白一点,我们把某一个变量地址强制定义为bank1.4的某个寻址地址,然后这个变量肯定是存在RAM里的嘛,如果这个变量是定义的全局变量,这个RAM就不够用好么,毕竟bank1.4的寻址范围比片内RAM大好多,主要我就是纠结这个。
如果每一个FSMC的寻址地址都需要对应一个变量的地址,RAM不是完全不够用么?还是说C语言编译时处理了RAM资源。
回复

使用道具 举报

33

主题

159

帖子

0

精华

高级会员

Rank: 4

积分
527
金钱
527
注册时间
2017-1-21
在线时间
192 小时
 楼主| 发表于 2017-3-30 10:02:40 | 显示全部楼层
来俩不甜的 发表于 2017-3-30 09:39
这不是变量,既然你懂汇编,这么说吧,我猜测这是个用于ldr 或者 mov的一个常数,是直接写在代码里的。这 ...

恩,我已经反应过来了。这个地址其实就是寻址地址,然后就是强制转换成这个地址就是相当于把这个变量存在了外部的空间里,而不是在片内RAM里了,这样对吧?
哈哈,就是不住在自己家的大楼里了,去边上的另外一栋楼住了。
回复

使用道具 举报

1

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1183
金钱
1183
注册时间
2015-5-28
在线时间
149 小时
发表于 2017-3-30 17:33:09 | 显示全部楼层
32bit处理器可以寻址4G地址空间,ST在设计的时候会把对应的地址映射到不同的外设或者存储设备上面去,液晶的时序和NOR Flash的时序可以兼容,所以可以直接配置FSMC的NOR Flash的地址读写方式来读写液晶控制器的寄存器~
回复

使用道具 举报

1

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1183
金钱
1183
注册时间
2015-5-28
在线时间
149 小时
发表于 2017-3-30 17:34:35 | 显示全部楼层
RAM的地址寻址区间也都是ST设计好了的,你只能在他设计好的区间里面挂RAM或者操作RAM
回复

使用道具 举报

5

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2017-4-4
在线时间
11 小时
发表于 2017-4-4 20:26:59 | 显示全部楼层
虽然看了前面的回答,但是对于如何理解LCD读写数据/命令相关函数还是存在疑问。
以LCD_WR_REG()函数
其定义如下:
void LCD_WR_REG(u16 regval)
{   
        LCD->LCD_REG=regval;//写入要写的寄存器序号         
}
    如上所述,这个函数体就一个赋值语句,就是往Block 1的Sector 4的地址为0X6C0007FE的存储单元赋值regval。当然,我们这里是把LCD相当于sram看待,实质是不存在这个存储单元。个人理解这个语句会让STM32的FSMC执行两个动作:1,地址总线的信号为0X6C0007FE,如前所述,右移一位A10为0,意味着RS=0,意味着数据线上为命令信号;2,数据线的信号为regval。又由于CS、WR等其他信号FSMC自动控制,这样就完成了regval往LCD的写入,相当于OLED模块对应函数功能,如下所示。
void OLED_WR_Byte(u8 dat,u8 cmd)
{
        DATAOUT(dat);            
        OLED_RS=cmd;  //RS即为数据命令标志位
        OLED_CS=0;          
        OLED_WR=0;         //注意在WR的上升沿数据才能写入;然后保持高不变,
        OLED_WR=1;
        OLED_CS=1;          //写完CS拉高,RS默认为高。
        OLED_RS=1;         
}                      

不过仍然有问题:   为什么这样普通的赋值语句就会让FSMC认为是给地址信号为0X6C0007FE 的sram存储单元赋值,或者说为什么就认为0X6C0007FE是sram地址信号?虽然开启了FSMC中断服务,但是还有类似的u8 t=3等赋值语句FSMC应该不能区分与以上赋值语句的区别吧?而结构体只是在stm32内存开辟一些存储空间,与sram完全没有关系啊。难道就是因为0X6C0007FE处于Block 1 Sector 4的地址范围STM32就认为这是sram的地址?

      或者以上这么多疑问可用一个问题代替:对于一个赋值语句 t=0x0023怎么知道这是给stm内存单元赋值还是外存(如sram)赋值?
      也不晓得问题问对没有
回复

使用道具 举报

69

主题

978

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3761
金钱
3761
注册时间
2015-4-26
在线时间
761 小时
发表于 2017-4-4 21:21:13 | 显示全部楼层
本帖最后由 来俩不甜的 于 2017-4-4 21:22 编辑
TeeTown 发表于 2017-4-4 20:26
虽然看了前面的回答,但是对于如何理解LCD读写数据/命令相关函数还是存在疑问。
以LCD_WR_REG()函数
其定 ...

GPIOE -> ODR |= 1 << 5;  你仔细想想这句话是什么意思,看看 GPIOE  ODR  分别是什么,不要看手册,就在keil里 看这俩的定义,看懂了就是你要的答案
我有故事,你有酒吗
回复

使用道具 举报

5

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2017-4-4
在线时间
11 小时
发表于 2017-4-5 10:35:22 | 显示全部楼层

GPIOE -> ODR |= 1 << 5就是GPIOE -> ODR =( GPIOE -> ODR | (1 << 5)),ODR不就是输出控制寄存器吗,与我的问题好像没什么关系哦
回复

使用道具 举报

69

主题

978

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3761
金钱
3761
注册时间
2015-4-26
在线时间
761 小时
发表于 2017-4-5 12:56:23 | 显示全部楼层
TeeTown 发表于 2017-4-5 10:35
GPIOE -> ODR |= 1  ODR =( GPIOE -> ODR | (1

那为什么操作 这个GPIOE -> ODR你能懂,操作LCD -> LCD_REG你却不明白呢,这俩其实是一回事啊
我有故事,你有酒吗
回复

使用道具 举报

33

主题

159

帖子

0

精华

高级会员

Rank: 4

积分
527
金钱
527
注册时间
2017-1-21
在线时间
192 小时
 楼主| 发表于 2017-4-5 21:23:28 | 显示全部楼层
TeeTown 发表于 2017-4-4 20:26
虽然看了前面的回答,但是对于如何理解LCD读写数据/命令相关函数还是存在疑问。
以LCD_WR_REG()函数
其定 ...

你没理解我在6楼的回复。
我给你打一个比喻你就明白了。
STM32片内是有RAM的,好比是有一栋大楼,大楼叫A栋,平时我们定义变量时都是在这个大楼里,比如让小明去A栋302开了个房。然后给变量赋值时就相当于快递员吧快递送给A栋302的小明。
这里我们定义了一个变量,强制定义在0X6C0007FE这个地址,这个地址不在片内的范围里,就相当于A楼住满了,我们另外建了一个B楼,我们就让新的变量小王去住B楼7FE房,然后又给这个变量赋值,就相当于快递员一看地址是B楼7FE于是就很自然地送去了B楼,对于单片机来说就是操作外挂的这个LCD了。
不知道这个比喻是否形象。
回复

使用道具 举报

26

主题

1548

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6444
金钱
6444
注册时间
2015-8-25
在线时间
1010 小时
发表于 2017-4-6 09:14:20 | 显示全部楼层
oyixi001 发表于 2017-4-5 21:23
你没理解我在6楼的回复。
我给你打一个比喻你就明白了。
STM32片内是有RAM的,好比是有一栋大楼,大楼 ...

说的很形象啊,这个不是很清楚的完全可以去看DSP(TMS320F2812或者是TMS320F28335)的XINTF,DSP外扩RAM\FLASH\ADC\DAC等的时候也是这样子的
He who fights with monsters should look to it that he himself does not become a monster, when you gaze long into the abyss, the abyss also gazes into you.
过于执着就会陷入其中,迷失自己,困住自己。
回复

使用道具 举报

5

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2017-4-4
在线时间
11 小时
发表于 2017-4-10 23:33:25 | 显示全部楼层
oyixi001 发表于 2017-4-5 21:23
你没理解我在6楼的回复。
我给你打一个比喻你就明白了。
STM32片内是有RAM的,好比是有一栋大楼,大楼 ...

谢谢,比较形象,暂时不知道怎么问了哈。
回复

使用道具 举报

4

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
191
金钱
191
注册时间
2016-1-12
在线时间
42 小时
发表于 2017-7-13 22:20:48 | 显示全部楼层
TeeTown 发表于 2017-4-4 20:26
虽然看了前面的回答,但是对于如何理解LCD读写数据/命令相关函数还是存在疑问。
以LCD_WR_REG()函数
其定 ...

stm32f4xx系列内存的地址范围是比较小的,不会到达6000 0000H(几百兆大小了)这个位置,所以LCD->LCD_REG这个地址很明显是外部地址,这样往这个地址写数据,cpu就会明白是外部存储(LCD的显存),继而告知FSMC发出读写时序电平信号。所以在原子的开发指南里面写了是fsmc自动控制。也就是说,往这个地址写数据,会根据RS的偏移量,分辨是命令还是数据。
个人愚见,如有不对之处,请批评指正。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-12-18 18:41

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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