×
单片机 > 单片机程序设计 > 详情

STM32学习笔记-FLASH读写

发布时间:2020-06-01 发布时间:
|

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


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

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

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


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


可以算出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个。如果所有的页,数据都不正确,那么就使用程序原代码内值.同时产品要报出参数读取错误状态。


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
单片机中高阻态的实质及意义