OpenEdv-开源电子网

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

用FMC外扩SDRAM或者SRAM不需要内部时序等待吗?

[复制链接]

68

主题

165

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
388
金钱
388
注册时间
2017-3-2
在线时间
156 小时
发表于 2017-5-15 08:58:13 | 显示全部楼层 |阅读模式
1金钱
这两天看FMC这块,其中关于外扩SRAM或者SDRAM这块有些疑问,比如外扩了SDRAM,SDRAM挂载在1区,在程序里读取SDRAM的数据:

1  uint32_t temp;
2  temp = *(uint32_t *)0xC000 0000;

3  if(temp > 100) temp = 0;

对于第二行代码,可能只需要几个时钟周期就执行完毕了,但是FMC控制时序将外部SDRAM中的数据读取出来并放到数据总线上需要的时间比执行刚才那个语句的时间长,如果没有等待机制的话,很有可能当程序执行到第三行的时候,实际数据还没有读过来,那岂不是会数据出错吗?

想知道这个问题到底是怎么解决的?

最佳答案

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

硬件自动处理,相关时序在你初始化FMC接口的时候,就确定了。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165508
金钱
165508
注册时间
2010-12-1
在线时间
2115 小时
发表于 2017-5-15 08:58:14 | 显示全部楼层
硬件自动处理,相关时序在你初始化FMC接口的时候,就确定了。
回复

使用道具 举报

68

主题

165

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
388
金钱
388
注册时间
2017-3-2
在线时间
156 小时
 楼主| 发表于 2017-5-16 13:11:13 | 显示全部楼层
正点原子 发表于 2017-5-15 08:58
硬件自动处理,相关时序在你初始化FMC接口的时候,就确定了。

我知道是硬件自动处理,我的意思是,FMC硬件处理外部SDRAM的时钟最快就90M,而内核执行一条指令的时钟是 180M,第二行语句对应的汇编应该很快就执行完,但是FMC操作一次读取或者写入操作用的时间应该比执行指令的时间长吧? 如果外部FMC操作SDRAM的时序还没完成,第二行代码就已经执行完了,数据岂不是混乱了? 第三行代码的执行不就出错了吗?  处理器是怎么协调内部代码执行时间 和 FMC操作外部SDRAM时序时间 的?
回复

使用道具 举报

头像被屏蔽

50

主题

178

帖子

0

精华

禁止访问

积分
344
金钱
344
注册时间
2016-12-22
在线时间
19 小时
发表于 2017-6-7 17:35:27 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复

使用道具 举报

52

主题

147

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
316
金钱
316
注册时间
2019-4-1
在线时间
118 小时
发表于 2019-5-8 11:51:10 | 显示全部楼层
kokoromi 发表于 2017-5-16 13:11
我知道是硬件自动处理,我的意思是,FMC硬件处理外部SDRAM的时钟最快就90M,而内核执行一条指令的时钟是  ...

fmc的功能之一,就是匹配内部总线和外设之间的时序,也就是解决你问的那几个问题。好好理解下fmc硬件自动处理的含义
回复

使用道具 举报

5

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
54
金钱
54
注册时间
2019-8-10
在线时间
5 小时
发表于 2019-8-23 14:04:48 | 显示全部楼层
我也不明白。我用的LCD,手册上写入周期是66ns,但是CPU的速度是2.5ns。
我在向LCD循环写入数据时,CPU会自动等待FMC操作完成吗?(例如用了20ns循环一次,LCD周期66ns,所以CPU需要等待)
#define LCD_WRITE_CMD(cmd)  do {*(unsigned short volatile *)0x60000000 = cmd; } while(0)
#define LCD_WRITE_DAT(dat)     do {*(unsigned short volatile *)0x60080000 = dat; } while(0)
void LCD_Clear(int color)
{
        设置坐标……

        LCD_WRITE_CMD(0x2C); //写GRAM
        for (index = 0; index < 320 * 240; index++)
        {
                LCD_WRITE_DAT(color);
        }
}
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-16 02:39

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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