搜索
查看: 10141|回复: 5

[已解决] 使用stm32f4片上flash存储数据

[复制链接]

该用户从未签到

2

主题

6

帖子

0

蝴蝶豆

新手上路

最后登录
2017-8-30
发表于 2017-8-25 17:45:04 | 显示全部楼层 |阅读模式
大家好:
   使用stm32f407,希望使用flash的剩余空间来存放数据。希望片上flash可以像片外flash一样任意读写。
   看了参考手册,上面如是描述:
   “在对 STM32F4xx 的 Flash 执行写入或擦除操作期间,任何读取 Flash 的尝试都会导致总线
阻塞。只有在完成编程操作后,才能正确处理读操作。这意味着,写/擦除操作进行期间不能
从 Flash 中执行代码或数据获取操作

    我有很大疑惑,
   1.我使用片上flash作为代码存储空间,
   2.stm32执行代码,是需要从flash上取指令,然后分析指令,进行操作
   3.当我执行完擦除/写操作的时候,无论是查询flash状态寄存器,或是执行中断,都是需要从flash读取代码的
   那么按照手册的说法,岂不是不能执行代码???

回复

使用道具 举报

该用户从未签到

12

主题

280

帖子

0

蝴蝶豆

金牌会员

最后登录
2018-10-15
发表于 2017-8-25 18:40:07 | 显示全部楼层
没问题的,代码是先塞到内存中执行
回复 支持 0 反对 1

使用道具 举报

该用户从未签到

47

主题

1683

帖子

7

蝴蝶豆

论坛元老

最后登录
2022-4-9
发表于 2017-8-25 18:38:50 | 显示全部楼层
本帖最后由 moyanming2013 于 2017-8-25 20:50 编辑

你也看到了,是在写/擦除(不是读)期间不能从flash读,执行完写/擦除以及平时代码执行时都是在读flash,所以没问题。
QQ截图20170825203413.jpg
当正在执行写/擦除过程时,尝试对flash的读(比如中断来了CPU想尝试通过NVIC执行ISR时)会被阻塞,此时对代码的读取会阻塞,如果阻塞明显你会感觉到“卡”。除非把代码复制到RAM(编译前配置代码的位置到RAM空间)。但一般不会配置代码从RAM执行,此时代码的执行是在CPU内部,跟RAM无关。
如下图是典型的STM32 MCU系统架构内的flash接口连接图,指令总线直接从flash读取指令,一般不会把指令从flash搬到RAM,再从RAM搬到CPU进而再执行的(多此一举)。
QQ截图20170825204539.jpg
楼主,你每次写内部flash数据量都很大(也就是时间会比较长)吗?如果比较大,比如好几个扇区,或许此时会对中断等产生影响。比如可以尝试在写之前暂时关闭中断。


评分

参与人数 1ST金币 +5 收起 理由
zero99 + 5

查看全部评分

回复 支持 反对

使用道具 举报

该用户从未签到

37

主题

2167

帖子

32

蝴蝶豆

论坛元老

最后登录
2023-2-9
发表于 2017-8-25 22:40:57 | 显示全部楼层
擦除和写片内flash期间不能执行代码,操作完了就可以继续执行代码了。

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

回复 支持 反对

使用道具 举报

该用户从未签到

27

主题

382

帖子

8

蝴蝶豆

论坛元老

最后登录
2021-4-1
发表于 2017-8-26 11:59:32 | 显示全部楼层
本帖最后由 adlu 于 2017-9-29 16:10 编辑

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

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

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

评分

参与人数 1ST金币 +3 收起 理由
zero99 + 3

查看全部评分

回复 支持 反对

使用道具 举报

该用户从未签到

2

主题

6

帖子

0

蝴蝶豆

新手上路

最后登录
2017-8-30
 楼主| 发表于 2017-8-28 11:34:36 | 显示全部楼层
谢谢楼上各位的帮助,我有些理解了。
我之前理解是“总线阻塞”是不能接受的,arm会挂掉,按照诸位的解释,“总线阻塞”仅仅是等待,就像是“堵车”一样,等等就好了,并不是“事故”
那么正确的理解是不是这样:
在写/擦除完成之前,如果有程序需要执行(事实上我认为一定有程序需要执行,因为即使是等待,或是查询flash的寄存器,也是需要执行代码的),那么会造成flash总线阻塞,此时所有的代码都无法执行,直到“阻塞”结束,arm再去执行下一条指令。

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|论坛-意法半导体STM32/STM8技术社区

GMT+8, 2024-4-29 07:58 , Processed in 1.180238 second(s), 43 queries .

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

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