STM32学习笔记-FLASH读写

     STM32的FLASH除了可以烧写如程序外,还可以供给用户做存储器,存储参数用,但是要注意的是,FLSAH的擦写次数是有限制的,10万次。

STM32F1系列单片机内核是Cortext-M3系列的,其存储器的映射是按照Cortext-M3的标准设计的,如下图。

STM32学习笔记-FLASH读写_第1张图片

从上图可看出最下main的512M是分配给Code 即程序存储区. 其内部分配如下图。

STM32学习笔记-FLASH读写_第2张图片

从上图可以看到FLASH的起始地址是:0x0800 0000 到 0x0807 FFFF ,126M的FLASH空间。STM32按页来编程擦写FLASH,如我的 STM32F103RCT6 SRAM为48KB,FLASH有256K. 分页是2Kb一页来设计的,而又的小容量的单片机是1Kb一页。

下列图片均是从芯片的参考文档(RM0008)上截图的.

STM32学习笔记-FLASH读写_第3张图片

STM32学习笔记-FLASH读写_第4张图片

可以算出127+1=128*2KB=256KB。

//flash读写代码如下 写之前要擦除一整页的数据。写入数据要传入一个32位的地址,一次写入1个16位的数据(半字)。

//u32 addr - flash地址

//u16 dat  - 写入数据

//有关STM32F103RCT6的FLASH详细情况学习,请看我的笔记。

void FLASH_Write(u32 addr, u16 dat){

FLASH_Unlock(); //解锁FLASH编程擦除控制器

FLASH_ClearFlag(FLASH_FLAG_BSY|FLASH_FLAG_EOP|FLASH_FLAG_PGERR|FLASH_FLAG_WRPRTERR);

FLASH_ErasePage(addr);  //写之前要先擦除页。

FLASH_ProgramHalfWord(addr,dat); //从指定也的addr地址开始写。

FLASH_ClearFlag(FLASH_FLAG_BSY|FLASH_FLAG_EOP|FLASH_FLAG_PGERR|FLASH_FLAG_WRPRTERR);

FLASH_Lock();

}

 

//从FLASH读取半个字

u16 FLASH_Read_HalfWord(u32 addr){

u16 data;

data = *(u16*)(addr); //从指定的地址读取数据。

return data;

}

 

有关数据存储读取的可靠性思考。一直以来,见过我司好多仪表的参数保存,都是直接一次写入到EEPROM或者FLASH中。 在设计时不考虑到,当程序正在写入参数断电时或上电抖动造成参数的存储和读取失效。这种失效后的保护机制如何设计?

拿STM32来说,如果FLASH充裕,可以将数据存储在3个页。(最好3个不连续的位置)。

1:存数据逻辑。对要写入的数据按模块或整体做校验,校验码作为存入参数的一部分,要写入FLASH。

存入第1个页,存好后,立刻读取,判断是否存好。然后依此操作存后面2页数据。

2:读数据逻辑。读取第1页数据后,做校验,看数据是否正确,如果不正确读后面2个。如果所有的页,数据都不正确,那么就使用程序原代码内值.同时产品要报出参数读取错误状态。

你可能感兴趣的:(STM32学习笔记)