专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
STM32
为什么用FSMC进行对外部器件的访问?直接用IO口操作不行
2019-07-20 12:54
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
STM32/STM8
7451
3
910
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稍微多一点,不是太多,大家可以调试的时候看下汇编窗口而且的区别。
至于实际速度上或者其他硬件上的区别,我没做测试,等做过测试的人发个测试结果吧。
加载中...
查看其它3个回答
一周热门
更多
>
相关问题
STM32F4上I2C(在PROTEUS中模拟)调试不通的问题
6 个回答
芯片供应紧张,准备换个MCU,MM32L系列替换STM32L系列的怎么样?
7 个回答
STM32同时使用两个串口进行数据收发时数据丢包的问题
5 个回答
STM32F103串口通信死机问题
4 个回答
STM32WLE5CC连接SX1268在LoRa模式下能与 SX1278互通吗?
2 个回答
相关文章
ST公司第一款无线低功耗单片机模块有效提高物联网设计生产效率
0个评论
如何实现对单片机寄存器的访问
0个评论
通过USB用STM32片内自带Bootloader下载程序及注意事项
0个评论
欲练此功必先自宫之STM32汇编启动,放慢是为了更好的前行
0个评论
×
关闭
采纳回答
向帮助了您的知道网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
STM32
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
×
付费偷看金额在0.1-10元之间
确定
×
关闭
您已邀请
0
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
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稍微多一点,不是太多,大家可以调试的时候看下汇编窗口而且的区别。
至于实际速度上或者其他硬件上的区别,我没做测试,等做过测试的人发个测试结果吧。
一周热门 更多>