问题描述
Flash在IC中用来存放code和const data,对于其中没有用到的Flash部分,可以使Application用来做data storage用。IC一般应用场景下都是会经常断电的,而有些数据需要记录之前的一些状态等内容,因此需要掉电保留的特质,Flash正是这样的设备。
stm32f0308的Flash
64K的Flash用page作为单位来划分,一共64个page,那每个page是1K byte,另外也可以用sector来划分,一个sector有4个page,那64K的Flash可以划分为16个sector。
Flash读
Flash对于MCU而言是Read Only的,因此对于CPU而言,读Flash是很简单的事情,不需要通过Flash接口去读,M0 core直接通过AHB总线直接访问Flash的地址段,读取其中的指令或Read Only数据。有些memory段可能是Execution Only的,这就是由自己在设计程序时通过控制链接来实现的了,估计对Execution Only的Memory读是不能成功的,至于会不会产生什么错误,得尝试下才知道了。M0 core通过AHB访问Flash中Read Only数据,是通过指令fetch和latency来实现,这两个是由FLASH_ACR(Flash访问控制register)来管理。指令fetch的目的是为提高取指效率,通过使用一个prefetch buffer来实现的。latency是用来维持读Flash memory的控制信号,使高速读取Flash数据时不至于出错。
Flash写(编程与擦除)
Flash对于CPU而言Read Only,因此只能通过Flash peripheral接口来写入数据,如果像read操作一样直接写入地址,会导致hardfalt。从程序的宏观角度,stm32f0308的Flash编程分两种方式,ICP和IAP,ICP即是在系统编程,通过SWD和Flash download算法将整个Flash编程,IAP则是在应用编程,通过运行一小段App,实现其余的固件更新。
在对Flash进行编程/擦写时,这时候是不能进行Flash读取的。
Flash寄存器
- Key register (FLASH_KEYR)
- Option byte key regi ster (FLASH_OPTKEYR)
- Flash control register (FLASH_CR)
- Flash status register (FLASH_SR)
- Flash address register (FLASH_AR)
- Option byte register (FLASH_OBR)
- Write protection register (FLASH_WRPR)
解锁Flash
这是编程/擦写需要做的第一步,因为IC reset后,Flash是被锁住不能被write和erase的,需要进行如下的解锁步骤:
编程Flash
对Flash编程,即写入数据到Flash的对应地址,只能以half-word(16 bit)的方式写入,而且对Flash的编程和擦除都必须按照规定的流程执行,否则会导致Flash数据修改不成功,而造成程序的异常。stm32f0308有说明,似乎在编程Flash之前需要先擦除Flash为0x00000000的,否则是没法编程Flash成功的。
编程Flash的标准步骤如下描述:
- 先要确保没有Flash memory相关操作正在进行,因此需要检查FLASH_SR register的BSY bit;
- 将FLASH_CR register的PG bit置1,表明是对Flash编程操作;
- 将half-word(16 bit)数据写入到Flash对应的地址;
- 由于进行了写入Flash的操作,需要等待直到FLASH_SR register的BSY bit被置位;
- 最后检查FLASH_SR register的EOP flag(EOP flag, End Of Procedure, 一次Flash操作成功完成,那该EOP flag就被置位),EOP flag被置位时,就说明这次Flash编程成功啦,需要在软件中将EOP flag清零,不然会影响后面的判断的。
详细的流程图如下:
擦除Flash
Flash擦除是将Flash数据恢复默认值的很快的方式,一般Flash的擦除是将Flash都变成0xFFFFFFFF,而这里stm32f0308好像是都变成0x00000000的,即清零了,这是根据stm32f0308的说明大概判断的,具体的得实验下看看~
stm32f0308的Flash擦除分为两种情况,Page Erase和Mass Erase,即分页擦除,或整个用户Flash区域都擦除。
Page Erase
即擦除Flash的某一页,Flash Page Erase的标准操作步骤如下描述:
1. 先要确保没有Flash memory相关操作正在进行,因此需要检查FLASH_SR register的BSY bit;
2. 将FLASH_CR register的PER bit置1,表明是对Flash的Page Erase操作;
3. 设置FLASH_AR register,选择要erase的page;
4. 将FLASH_CR register的STRT bit置1,开始对Flash的Page Erase操作;
5. 由于进行了写入Flash的操作,需要等待直到FLASH_SR register的BSY bit被置位;
5. 最后检查FLASH_SR register的EOP flag(EOP flag, End Of Procedure, 一次Flash操作成功完成,那该EOP flag就被置位),EOP flag被置位时,就说明这次Flash擦除成功啦,需要在软件中将EOP flag清零,不然会影响后面的判断的。
详细的流程图表示如下:
Mass Erase
将整个用户Flash都擦除掉,当然option byte和system memory部分是不受影响的。其操作步骤如下:
1. 先要确保没有Flash memory相关操作正在进行,因此需要检查FLASH_SR register的BSY bit;
2. 将FLASH_CR register的MER bit置1,表明是对Flash的Mass Erase操作;
3. 将FLASH_CR register的STRT bit置1,开始对Flash的Mass Erase操作;
4. 由于进行了写入Flash的操作,需要等待直到FLASH_SR register的BSY bit被置位;
5. 最后检查FLASH_SR register的EOP flag(EOP flag, End Of Procedure, 一次Flash操作成功完成,那该EOP flag就被置位),EOP flag被置位时,就说明这次Flash擦除成功啦,需要在软件中将EOP flag清零,不然会影响后面的判断的。
详细的流程图跟上:
option byte写
版权声明:本文为博主原创文章,未经博主允许不得转载。