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

2019-08-17 00:49发布

本帖最后由 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位垃圾单片机程序,感觉好乱。
求原子哥或哪位大神帮忙理理!@正点原子  。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
15条回答
小陀螺爱炒蛋
1楼-- · 2019-08-18 05:10
RAM的地址寻址区间也都是ST设计好了的,你只能在他设计好的区间里面挂RAM或者操作RAM
TeeTown
2楼-- · 2019-08-18 09:34
虽然看了前面的回答,但是对于如何理解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)赋值?
      也不晓得问题问对没有
来俩不甜的
3楼-- · 2019-08-18 14:58
本帖最后由 来俩不甜的 于 2017-4-4 21:22 编辑
TeeTown 发表于 2017-4-4 20:26
虽然看了前面的回答,但是对于如何理解LCD读写数据/命令相关函数还是存在疑问。
以LCD_WR_REG()函数
其定 ...

GPIOE -> ODR |= 1 << 5;  你仔细想想这句话是什么意思,看看 GPIOE  ODR  分别是什么,不要看手册,就在keil里 看这俩的定义,看懂了就是你要的答案
TeeTown
4楼-- · 2019-08-18 17:52
 精彩回答 2  元偷偷看……
来俩不甜的
5楼-- · 2019-08-18 21:10
TeeTown 发表于 2017-4-5 10:35
GPIOE -> ODR |= 1  ODR =( GPIOE -> ODR | (1

那为什么操作 这个GPIOE -> ODR你能懂,操作LCD -> LCD_REG你却不明白呢,这俩其实是一回事啊
oyixi001
6楼-- · 2019-08-18 22:23
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了。
不知道这个比喻是否形象。

一周热门 更多>