STM32片内FLASH特定地址写入数据不被擦除方法_第1页
STM32片内FLASH特定地址写入数据不被擦除方法_第2页
STM32片内FLASH特定地址写入数据不被擦除方法_第3页
STM32片内FLASH特定地址写入数据不被擦除方法_第4页
STM32片内FLASH特定地址写入数据不被擦除方法_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、STM32中存储区分为:随机存取存储器RAM和只读存储器ROM。 其中:RAM为常说的内存,比如手机的2G内存4G内存等,就是程序跑起来的时候所占用的存储空间,特点是掉电数据丢失。ROM为常说的硬盘,比如手机的64G和128G等,可以简单的理解为硬盘的存储空间,特点是掉电数据不丢失,所以又叫“非易失性存储器件”。 ROM又包含:EEPROM和flash。作为ROM的一份子,flash的特点自然是掉电数据不丢失。但是,flash在STM32中比较重要,程序也是保存在这个地方,所以轻易不让用户进行随意的读写,以避免不必要的问题。1、STM32 FLASH操作流程Flash操作已经属于嵌入式设备中很

2、底层的操作了,直接对地址进行存取,简单描述,Flash操作大致需要以下流程:1、确定要写入Flash的首地址(稍后介绍确定地址的方法)2、解锁Flash3、对Flash进行操作(写入数据)4、对Flash重新上锁1.1 如何查找并选定要写入Flash十六进制地址值的方法要想选定安全的Flash地址进行读写,可以根据自己的STM32 MCU型号,查找数据手册,确定FLASH的地址区段,因为起始段会存储代码,所以一定要避开起始段,以避免数据错误。(我一般是根据Flash大小计算Flash的最末尾地址,往前推一段地址空间,在这里一般不会对代码中的数据产生覆盖等影响)我此次操作Flash使用的MCU是

3、STM32103C8T6,所以以该型号MCU为例进行描述:在数据手册中,可以看到STM32103C8T6的flash起始地址是0x0800 0000(如下图所示),而STM32103C8T6的Flash大小为64K,可以计算出STM32103C8T6的Flash地址范围是:0x0800 00000x0800 FFFF(计算方法参考另一篇博客:STM32内存大小与地址的对应关系以及计算方法)。这里选取0x0800 F000作为读写操作的起始地址,对于C8T6这款MCU,操作这个起始地址应该算是很安全的范围了。 主存储器,该部分用来存放代码和数据常数(如 const 类型的数据)。对于大容量产品,

4、其被划分为 256 页,每页 2K 字节。注意,小容量和中容量产品则每页只有 1K 字节。从上图可以看出主存储器的起始地址就是 0X08000000, B0、B1 都接 GND 的时候,就是从 0X08000000开始运行代码的2、Flash基本知识点2.1 Flash容量Flash根据容量大小可以分为以下三种:1、小容量产品:Flash大小为1-32KB(STM32F10X_LD)2、中容量产品:Flash大小为64-128KB(STM32F10X_MD)3、大容量产品:Flash大小为256KB以上(STM32F10X_HD)2.2 ST库对Flash操作的支持ST库中对Flash操作主要

5、提供了以下几类操作API函数:1、Flash解锁、锁定函数 void FLASH_Unlock(void);/解锁函数:在对Flash操作之前必须解锁void FLASH_Lock(void);/锁定函数:同理,操作完Flash之后必须重新上锁2、Flash写操作函数 FLASH_Status FLASH_ProgramWord(uint32_t Address, uint32_t Data);/32位字写入函数FLASH_Status FLASH_ProgramHalfWord(uint32_t Address, uint16_t Data);/16位半字写入函数FLASH_Status F

6、LASH_ProgramOptionByteData(uint32_t Address, uint8_t Data);/用户选择字节写入函数 注:这里需要说明,32 位字节写入实际上是写入的两次 16 位数据,写完第一次后地址+2,这与我们前面讲解的 STM32 闪存的编程每次必须写入 16 位并不矛盾。写入 8位实际也是占用的两个地址了,跟写入 16 位基本上没啥区别。3、Flash擦除函数 FLASH_Status FLASH_ErasePage(uint32_t Page_Address);FLASH_Status FLASH_EraseAllPages(void);FLASH_Stat

7、us FLASH_EraseOptionBytes(void);4、获取Flash状态 FLASH_Status FLASH_GetStatus(void); 获取Flash状态函数,主要是为了获取Flash的状态,以便于根据状态对Flash进行操作。该函数返回值是通过枚举类型定义的,在代码中可以看到FLASH_Status类型定义如下(具体含义看注释即可):                    

8、;                             typedef enum                   

9、0;                                                  

10、60;                              FLASH_BUSY = 1,        /忙           &

11、#160;                                       FLASH_ERROR_PG,      /编程错误   &#

12、160;                                               FLASH_ERROR_WRP,

13、60;  /写保护错误                                                &

14、#160;  FLASH_COMPLETE,      /操作完成                                        &#

15、160;          FLASH_TIMEOUT         /操作超时                              

16、;                     FLASH_Status;5、等待操作完成函数 FLASH_Status FLASH_WaitForLastOperation(uint32_t Timeout); 注:在执行闪存写操作时,任何对闪存的读操作都会锁住总线,在写操作完成后读操作才能正确地进行;既在进行写或擦除操作时,不能进行代码或数据的读取操作。所以在每次操作之前,我们都要等待上一次操作完

17、成这次操作才能开始。根据ST库提供的上述函数,我们可以自己编写Flash的读写操作代码如下:3.1 先定义一个Flash操作的起始地址宏定义和Flash状态指示标志位#define STARTADDR 0x0800F000 /STM32F103C8T6适用volatile FLASH_Status FLASHStatus = FLASH_BUSY; /Flash操作状态变量3.2 编写各个读写函数/ Name: WriteFlashOneWord/ Function: 向内部Flash写入32位数据/ Input: WriteAddress:数据要写入的目标地址(偏移地址)/ WriteDat

18、a: 写入的数据/void WriteFlashOneWord(uint32_t WriteAddress, uint32_t WriteData) FLASH_UnlockBank1(); FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR); FLASHStatus = 1; /清空状态指示标志位 FLASHStatus = FLASH_ErasePage(STARTADDR); if(FLASHStatus = FLASH_COMPLETE) FLASHStatus = 1; /清空状态指示标志位

19、 FLASHStatus = FLASH_ProgramWord(STARTADDR+WriteAddress, WriteData); /flash.c 中API函数 FLASHStatus = 1; /清空状态指示标志位 FLASH_LockBank1(); / Name: WriteFlashData/ Function: 向内部Flash写入数据/ Input: WriteAddress:数据要写入的目标地址(偏移地址)/ data: 写入的数据首地址/ num: 写入数据的个数/void WriteFlashData(uint32_t WriteAddress, uint8_t da

20、ta, uint32_t num) uint32_t i = 0; uint16_t temp = 0; FLASH_UnlockBank1(); /解锁flash FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR); FLASHStatus = 1; /清空状态指示标志位 FLASHStatus = FLASH_ErasePage(STARTADDR);/擦除整页 if(FLASHStatus = FLASH_COMPLETE)/flash操作完成 FLASHStatus = 1; /清空状态指示标

21、志位 for(i=0; i<num; i+) temp = (uint16_t)datai; FLASHStatus = FLASH_ProgramHalfWord(STARTADDR+WriteAddress+i*2, temp);/写入数据 FLASHStatus = 1; /清空状态指示标志位 FLASH_LockBank1(); /锁定flash / Name: ReadFlashNBtye/ Function: 从内部Flash读取N字节数据/ Input: ReadAddress:数据地址(偏移地址)/ ReadBuf:读取到的数据存放位置指针/ ReadNum:读取字节个数/ Output: 读取的字节数/int

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论