为什么用FSMC进行对外部器件的访问?直接用IO口操作不行

2019-07-20 12:54发布

FSMC作为存储控制器,每一次只能控制一个外部器件,跟直接IO驱动有什么区别?这有什么用?还有说是FSMC可以对存储器地址进行随机访问,但是这个不是已经能通过寄存器实现了吗?
小白很不懂,有没有大佬帮忙解答下,不胜感激!!!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
3条回答
mack13013
2019-07-20 19:33
本帖最后由 mack13013 于 2017-8-2 22:37 编辑

FSMC是MCU的一个外设(速度是否比GPIO快还不是很确定,不知道有没有人做这方面的测试),地址固定,而且编译器对其有特殊设置.

比如,使用GPIO,在C语言编程上,读片外RAM大概要这样:
u16 uwRamValue = 0;
/*..
此处设置GPIOD、GPIOE为推挽输出,GPIOC为浮空输入,过程省略
..*/
GPIOE ->ODR &= 0xFFFFFBFF;//RAM读使能
GPIOE ->ODR &= 0xFFFFFEFF;//RAM片选使能
GPIOD ->ODR = XX;//(假设XX是地址)
uwRamValue = GPIOC ->IDR;//读出RAM上XX地址处的数值,有的RAM比较慢,前面还要加一定的延时,或者同步信号读出的数值才不会有误。


而使用FSMC的话,同样的片外RAM读过程,使用C语言大概是这样:
u16 uwRamValue = *((*u16)XX);//当然,这样用的前提是FSMC已经完成初始化。而且对于比较慢的外界RAM,FSMC初始化时好像可以设置固定的延时,不需要在当前步骤再额外设置,至于同步信号什么的,可能也是在FSMC初始化时设置的,或者没有。其实没用过FSMC,我只知道x86的内存读取是有同步信号的,而且是交给内存控制器管理的,CPU只要做个饭来张口衣来伸手的大爷就可以了。



好像例程上,这里的读过程是封装成函数了的,大概是这样的:
u16 RamRead(u16 pAddr)
{
      return *((*u16)XX);//
}


这是程序上的设置,具体到汇编代码的读过程,FSMC的话,就是一两句汇编代码,GPIO的话,比FSMC稍微多一点,不是太多,大家可以调试的时候看下汇编窗口而且的区别。


至于实际速度上或者其他硬件上的区别,我没做测试,等做过测试的人发个测试结果吧。

一周热门 更多>