OpenEdv-开源电子网

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

请教探索者“实验34 FLASH模拟EEPROM实验”

[复制链接]

8

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2017-2-20
在线时间
9 小时
发表于 2017-8-24 17:09:45 | 显示全部楼层 |阅读模式
1金钱
对使用stm32的flash作为数据储存的方式有如下疑问:1.手册中如是描述:
在对 STM32F4xx 的 Flash 执行写入或擦除操作期间,任何读取 Flash 的尝试都会导致总线
阻塞。只有在完成编程操作后,才能正确处理读操作。这意味着,写/擦除操作进行期间不能
从 Flash 中执行代码或数据获取操作


2.代码中是这么写的
                FLASH->CR|=1<<16;        //开始擦除                  
                res=STMFLASH_WaitDone(200000);//等待操作结束,最大2s  

其中函数在不断查询状态
u8 STMFLASH_WaitDone(u32 time)
{
        u8 res;
        do
        {
                res=STMFLASH_GetStatus();
                if(res!=1)break;//非忙,无需等待了,直接退出.
                delay_us(10);
                time--;
         }while(time);
         if(time==0)res=0xff;//TIMEOUT
         return res;
}



3. 那么问题来了
首先,这个例程中应该是在flash中运行代码的
那么在执行过
FLASH->CR|=1<<16;        //开始擦除       
之后,继续要执行
res=STMFLASH_WaitDone(200000);//等待操作结束,最大2s  
那么此时取命令、执行代码,不都是在flash中进行的吗?
那岂不是违反了不能从 Flash 中执行代码或数据获取操作。这个要求?




实在是不懂,请指教!谢谢!

最佳答案

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

我在网上找了下,觉得这个帖子说的有道理 http://www.stmcu.org/module/forum/thread-613119-1-1.html “ 简单说,写/擦除的时候,CPU会“停摆”。 一般情况下,程序的运行是CPU从FLASH中读取指令,然后执行。在执行写/擦除操作时,从Flash读指令就要等待,知道写/擦除完成。 擦除是按页/扇区操作的,时间比较长。写是按字节、半字或者字操作的,时间很短。 如果是连续进行n次页擦除操作,则在擦除操作直接是可以响应 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

8

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2017-2-20
在线时间
9 小时
 楼主| 发表于 2017-8-24 17:09:46 | 显示全部楼层
我在网上找了下,觉得这个帖子说的有道理
http://www.stmcu.org/module/forum/thread-613119-1-1.html


简单说,写/擦除的时候,CPU会“停摆”。

一般情况下,程序的运行是CPU从FLASH中读取指令,然后执行。在执行写/擦除操作时,从Flash读指令就要等待,知道写/擦除完成。

擦除是按页/扇区操作的,时间比较长。写是按字节、半字或者字操作的,时间很短。
如果是连续进行n次页擦除操作,则在擦除操作直接是可以响应中断的。
比如,某个函数要分别擦除page1 page3 page5,在擦除page1的过程中,触发了中断,则该中断不能立即得到响应,而要等到page1擦除完成,在执行page3擦除之前,该中断得到响应。写操作类似。”
回复

使用道具 举报

8

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2017-2-20
在线时间
9 小时
 楼主| 发表于 2017-8-24 17:14:26 | 显示全部楼层
在例程的map文件中,可以明确看到:
    i.STMFLASH_WaitDone                      0x080050d4   Section        0  stmflash.o(i.STMFLASH_WaitDone)

也就是说,STMFLASH_WaitDone  这个函数是存放在flash中的。
在向flash执行完擦除工作后,程序需要访问flash,读取STMFLASH_WaitDone  这个函数,然后执行,
回复

使用道具 举报

8

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2017-2-20
在线时间
9 小时
 楼主| 发表于 2017-8-25 17:20:27 | 显示全部楼层
请教各位高手
回复

使用道具 举报

16

主题

216

帖子

1

精华

高级会员

Rank: 4

积分
970
金钱
970
注册时间
2016-11-24
在线时间
156 小时
发表于 2017-8-25 19:30:56 | 显示全部楼层
把FLASH用来做EEPROM的基本上都是用最后一个扇区,而程序运行所用的FLASH还不至于会用到最后一个扇区,所以这个解释其实没毛病
回复

使用道具 举报

16

主题

339

帖子

0

精华

高级会员

Rank: 4

积分
849
金钱
849
注册时间
2017-6-18
在线时间
166 小时
发表于 2017-8-26 05:19:18 来自手机 | 显示全部楼层
错,暂停程序是,阻塞内存是不存在的,是为了简化处理过程而产生的,可通过某些方式,让中断等,不暂停工作,不过改起来非常麻烦,没人那样用,有那工夫,直接加个SPI  FLASH不好多啦
回复

使用道具 举报

8

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2017-2-20
在线时间
9 小时
 楼主| 发表于 2017-8-28 11:01:54 | 显示全部楼层
wlq19911021 发表于 2017-8-26 05:19
错,暂停程序是,阻塞内存是不存在的,是为了简化处理过程而产生的,可通过某些方式,让中断等,不暂停工作 ...

哥们你的语言太简练了,看不懂啊
回复

使用道具 举报

8

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2017-2-20
在线时间
9 小时
 楼主| 发表于 2017-8-28 11:07:28 | 显示全部楼层
lzq12 发表于 2017-8-25 19:30
把FLASH用来做EEPROM的基本上都是用最后一个扇区,而程序运行所用的FLASH还不至于会用到最后一个扇区,所以 ...

“这意味着,写/擦除操作进行期间不能从 Flash 中执行代码或数据获取操作。”
既然上面没限定是正在进行写/擦除的扇区,那么我认为还是应该理解为整个flash。
我看了英文的手册,翻译的没有问题。


你的解释我是否可以理解为:手册写的有歧义?
其实我也是这么认为的,既然已经好多人这么用了,应该就是“对某一个扇区进行写/擦除操作进行期间,不能从该扇区执行代码或数据获取操作”
回复

使用道具 举报

16

主题

216

帖子

1

精华

高级会员

Rank: 4

积分
970
金钱
970
注册时间
2016-11-24
在线时间
156 小时
发表于 2017-8-29 08:55:28 | 显示全部楼层
qd0090 发表于 2017-8-28 11:07
“这意味着,写/擦除操作进行期间不能从 Flash 中执行代码或数据获取操作。”
既然上面没限定是正在进行 ...

如果说对某个扇区的操作会影响到整个FLASH的程序运行,那么这个所谓的把FLASH当EEPROM根本不可能实现的啊,而且很多时候都是用bootloader+APP的方式运行,所以说肯定不可能是对所有扇区都有影响的,不然何必分扇区,直接一整片设计不更合理
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-18 11:33

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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