打印
[APM32F1]

FLASH篇_RWW是FLASH的福音吗2

[复制链接]
18|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
#申请原创#[url=home.php?mod=space&uid=760190]@21小跑堂 [/url]

“RWW”功能,指的是“Read-While-Write”(读写同时进行)功能。
0、测试现象
同事使用F103xE芯片调试,程序中进行flash擦或写动作。在等待busy过程中,获取的flash_SR有时出错(SR值变成栈地址),以至于在flash_SR状态判断时出错,误判为写保护错误,实际上FLASH_SR状态应是正常。



1、FLASH结构与RWW
在讲具体原因之前,我觉得有必要说明下FLASH结构:单Bank Flash和多Bank Flash。
对于单Bank Flash,由于只有一块Flash,一套接口,CPU去访问Flash时(读/写/擦),只有前一项操作完成后,新的访问才会被Flash控制器接受,即:擦写Flash过程中,如果CPU发起读Flash(无论读指令还是数据)的操作,则这个读Flash操作会自动等到擦写完成后才被Flash控制器接受。因此在擦写过程中CPU是无法从Flash取出指令和数据的,会一直处于等待状态。例如下图这段程序,当CR_STRT_Set后,Flash Erase开始,此时后面的FLASH_WaitForLastBank1Operation函数会等到Flash Erase完成之后才被执行。


对于多Bank Flash,由于每块Flash具有独立的接口,因此CPU可以并行对不同Bank的Flash进行操作,也就是说在擦写Bank2过程中,CPU可以从Bank1取指令和取数据,即RWW(Read While Write)。同样对于上面这段程序:
1)如果这段程序在Bank1里运行,Erase的区域也在Bank1里,此时情况和单Bank Flash一样,FLASH_WaitForLastBank1Operation函数会等到Flash Erase完成之后才被执行;
2)如果这段程序在Bank1里运行,Erase的区域在Bank2里,FLASH_WaitForLastBank1Operation函数在Flash Erase的过程中就会被执行。

2、原因分析
F103xE FLASH有512K字节,分4个Bank,支持RWW功能,这个代表什么?
1)如果程序在bank1执行(0~128K),擦写其它bank时,bank1里面的程序会一直执行,不会被阻塞住;
2)当擦写128K之后的地址时,由于code是在bank1里面的,所以CPU一直在轮询FLASH->SR的状态,导致出错。

3、规避方法
想了2个办法进行规避风险,验证都可行。
1)FLASH_SR读出错时,值为栈顶地址(例如0x20000410),与原来的正常值(0x00000000)相差较大,故根据这个特性,可在FLASH读状态时加入是否是地址值的判断作为临时解决方案。等到FLASH_SR正常时再继续运行。
添加代码:while( (FLASH->SR >>29) ==1);
2)在判断FLASH_SR之前先等待BUSY标志位为0
添加代码:while( (FLASH->SR & FLASH_FLAG_BANK1_BSY) ==FLASH_FLASH_BSY);

4、后话
上面我们讨论的其实是同事遇到的第一种情况:程序顺序执行。如果在中断的情况下又会如何呢?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

16

主题

75

帖子

0

粉丝