欢迎来到天天文库
浏览记录
ID:52776575
大小:282.05 KB
页数:6页
时间:2020-03-30
《STM32片内FLASH特定地址写入数据不被擦除方法.doc》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、STM32中存储区分为:随机存取存储器RAM和只读存储器ROM。其中:RAM为常说的内存,比如手机的2G内存4G内存等,就是程序跑起来的时候所占用的存储空间,特点是掉电数据丢失。ROM为常说的硬盘,比如手机的64G和128G等,可以简单的理解为硬盘的存储空间,特点是掉电数据不丢失,所以又叫“非易失性存储器件”。ROM又包含:EEPROM和flash。作为ROM的一份子,flash的特点自然是掉电数据不丢失。但是,flash在STM32中比较重要,程序也是保存在这个地方,所以轻易不让用户进行随意的读写,以避免不必要的问题。1、STM32FLASH操作流程Flash操作已
2、经属于嵌入式设备中很底层的操作了,直接对地址进行存取,简单描述,Flash操作大致需要以下流程:1、确定要写入Flash的首地址(稍后介绍确定地址的方法)2、解锁Flash3、对Flash进行操作(写入数据)4、对Flash重新上锁1.1如何查找并选定要写入Flash十六进制地址值的方法要想选定安全的Flash地址进行读写,可以根据自己的STM32MCU型号,查找数据手册,确定FLASH的地址区段,因为起始段会存储代码,所以一定要避开起始段,以避免数据错误。(我一般是根据Flash大小计算Flash的最末尾地址,往前推一段地址空间,在这里一般不会对代码中的数据产生覆盖
3、等影响)我此次操作Flash使用的MCU是STM32103C8T6,所以以该型号MCU为例进行描述:在数据手册中,可以看到STM32103C8T6的flash起始地址是0x08000000(如下图所示),而STM32103C8T6的Flash大小为64K,可以计算出STM32103C8T6的Flash地址范围是:0x08000000——0x0800FFFF(计算方法参考另一篇博客:STM32内存大小与地址的对应关系以及计算方法)。这里选取0x0800F000作为读写操作的起始地址,对于C8T6这款MCU,操作这个起始地址应该算是很安全的范围了。主存储器,该部分用来存放
4、代码和数据常数(如const类型的数据)。对于大容量产品,其被划分为256页,每页2K字节。注意,小容量和中容量产品则每页只有1K字节。从上图可以看出主存储器的起始地址就是0X08000000,B0、B1都接GND的时候,就是从0X08000000开始运行代码的2、Flash基本知识点2.1Flash容量Flash根据容量大小可以分为以下三种:1、小容量产品:Flash大小为1-32KB(STM32F10X_LD)2、中容量产品:Flash大小为64-128KB(STM32F10X_MD)3、大容量产品:Flash大小为256KB以上(STM32F10X_HD)2.2
5、ST库对Flash操作的支持ST库中对Flash操作主要提供了以下几类操作API函数:1、Flash解锁、锁定函数voidFLASH_Unlock(void);//解锁函数:在对Flash操作之前必须解锁voidFLASH_Lock(void);//锁定函数:同理,操作完Flash之后必须重新上锁2、Flash写操作函数FLASH_StatusFLASH_ProgramWord(uint32_tAddress,uint32_tData);//32位字写入函数FLASH_StatusFLASH_ProgramHalfWord(uint32_tAddress,uint16
6、_tData);//16位半字写入函数FLASH_StatusFLASH_ProgramOptionByteData(uint32_tAddress,uint8_tData);//用户选择字节写入函数注:这里需要说明,32位字节写入实际上是写入的两次16位数据,写完第一次后地址+2,这与我们前面讲解的STM32闪存的编程每次必须写入16位并不矛盾。写入8位实际也是占用的两个地址了,跟写入16位基本上没啥区别。3、Flash擦除函数FLASH_StatusFLASH_ErasePage(uint32_tPage_Address);FLASH_StatusFLASH_Er
7、aseAllPages(void);FLASH_StatusFLASH_EraseOptionBytes(void);4、获取Flash状态FLASH_StatusFLASH_GetStatus(void);获取Flash状态函数,主要是为了获取Flash的状态,以便于根据状态对Flash进行操作。该函数返回值是通过枚举类型定义的,在代码中可以看到FLASH_Status类型定义如下(具体含义看注释即可): typedefenum
此文档下载收益归作者所有