STM32内部FLASH读写操作详解

合集下载

STM32内部FLASH读写操作详解

STM32内部FLASH读写操作详解

STM32内部FLASH读写操作详解
在STM32中,FLASH存储器被分为多个扇区。

每个扇区的大小根据芯
片型号而定,可以是16KB、32KB、64KB等大小。

每个扇区又被分为若干
个页,每个页的大小为2KB、4KB、8KB等。

读取FLASH数据的操作相对简单,可以通过读取内存地址的方式来实现。

由于FLASH时序特殊,读取速度相对较慢,所以在使用FLASH存储数
据时需要考虑读取的效率。

写入FLASH数据时,需要注意以下几点:
1.写入数据必须按照页的大小进行,即每次写入的数据不能超过页的
大小。

2.写入数据时,必须将FLASH模块解锁,否则写入操作将被禁止。


入完成后,需要将FLASH模块重新锁定。

3.写入FLASH数据时,如果写入的数据与指定地址处的数据不相同,
会导致页擦除。

所以在写入之前,需要将指定地址处的数据保存下来,并
进行适当的处理。

4.写入FLASH数据后,需要等待写入操作完成,然后进行擦除操作。

擦除操作可以是扇区擦除或页擦除。

除了普通的读写操作,STM32内部FLASH还提供了一些高级的功能,
如扇区擦除、页擦除、半页擦除、字节擦除等。

这些功能可以根据实际需
求进行选择和应用。

总结起来,对于STM32内部FLASH的读写操作,需要注意解锁和锁定FLASH模块、按页写入数据、写入完整性的保证、擦除操作的执行等细节。

通过合理的使用这些操作,可以实现对STM32内部FLASH的有效管理和利用。

STM32学习笔记:读写内部Flash(介绍+附代码)

STM32学习笔记:读写内部Flash(介绍+附代码)

STM32学习笔记:读写内部Flash(介绍+附代码)⼀、介绍⾸先我们需要了解⼀个内存映射:stm32的flash地址起始于0x0800 0000,结束地址是0x0800 0000加上芯⽚实际的flash⼤⼩,不同的芯⽚flash⼤⼩不同。

RAM起始地址是0x2000 0000,结束地址是0x2000 0000加上芯⽚的RAM⼤⼩。

不同的芯⽚RAM也不同。

Flash中的内容⼀般⽤来存储代码和⼀些定义为const的数据,断电不丢失,RAM可以理解为内存,⽤来存储代码运⾏时的数据,变量等等。

掉电数据丢失。

STM32将外设等都映射为地址的形式,对地址的操作就是对外设的操作。

stm32的外设地址从0x4000 0000开始,可以看到在库⽂件中,是通过基于0x4000 0000地址的偏移量来操作寄存器以及外设的。

⼀般情况下,程序⽂件是从 0x0800 0000 地址写⼊,这个是STM32开始执⾏的地⽅,0x0800 0004是STM32的中断向量表的起始地址。

在使⽤keil进⾏编写程序时,其编程地址的设置⼀般是这样的:程序的写⼊地址从0x08000000(数好零的个数)开始的,其⼤⼩为0x80000也就是512K的空间,换句话说就是告诉编译器flash的空间是从0x08000000-0x08080000,RAM的地址从0x20000000开始,⼤⼩为0x10000也就是64K的RAM。

这与STM32的内存地址映射关系是对应的。

M3复位后,从0x08000004取出复位中断的地址,并且跳转到复位中断程序,中断执⾏完之后会跳到我们的main函数,main函数⾥边⼀般是⼀个死循环,进去后就不会再退出,当有中断发⽣的时候,M3将PC指针强制跳转回中断向量表,然后根据中断源进⼊对应的中断函数,执⾏完中断函数之后,再次返回main函数中。

⼤致的流程就是这样。

1.1、内部Flash的构成:STM32F429 的内部 FLASH 包含主存储器、系统存储器、 OTP 区域以及选项字节区域,它们的地址分布及⼤⼩如下:STM32F103的中容量内部 FLASH 包含主存储器、系统存储器、 OTP 区域以及选项字节区域,它们的地址分布及⼤⼩如下:注意STM32F105VC的是有64K或128页x2K=256k字节的内置闪存存储器,⽤于存放程序和数据。

STM32 FLASH操作

STM32 FLASH操作

STM32 flash操作对芯片内部flash进行操作的函数,包括读取,状态,擦除,写入等等,可以允许程序去操作flash上的数据。

一、存储器映射1、统一编址,程序存储器、数据存储器、外设寄存器组织在一个4GB 的地址空间。

2、小端格式3、映像(stm32f107,256KB产品)可以看到,所谓的256KB闪存,是指主存储,片上FLASH如下图所示:介绍了片上的资源后,来看他们的地址映像。

芯片将4GB的空间,划分为8个512MB的块(block),这些块有些是整块不用的,芯片对地址的安排可以参考数据手册,memory mapping章节中的那个图。

只有block1、2、3、7是使用的。

地址中block7是核内的外设对应的地址,block2是其他外设对应的地址。

block1的低地址64KB是片上SRAM,block0则如下图option bytes即是选项字节;system memory就是系统存储,也即片上ROM;这两部分就是所谓信息块。

Flash就是指主存储,有256KB。

再往下看alias to flash or system memory.....这个区域256KB就是启动开始的区域。

这个区域并没有一个自己的存储器,只是根据BOOT0、BOOT1的接法来选择哪个存储器映射到这个地址上。

如下图选择用户闪存启动,是典型的做法;选择系统存储器,则在ST烧写进去的自举程序引导下,通过USART1下载程序;选择从SRAM执行代码则方便调试,比较快。

二、复位CM3将复位视作异常,优先级最高的异常。

stm32f1有三种复位:系统复位、电源复位、备份区复位。

前两种是真正的复位,对他的响应由硬件完成,这个响应对软件流的影响是这样的:程序指针指向0x0000 0004,这个单元存储的是复位服务子程序(或者汇编叫子过程),同时从0x0000 0000获取堆栈顶的地址。

不同的复位类型还有对其他寄存的不同复位方式,这就完成了复位。

STM32的FLASH操作

STM32的FLASH操作

关于STM32的FLASH操作说到STM32的FLSAH,我们的第一反应是用来装程序的,实际上,STM32的片内FLASH不仅用来装程序,还用来装芯片配置、芯片ID、自举程序等等。

当然,FLASH还可以用来装数据。

FLASH分类根据用途,STM32片内的FLASH分成两部分:主存储块、信息块。

主存储块用于存储程序,我们写的程序一般存储在这里。

信息块又分成两部分:系统存储器、选项字节。

系统存储器存储用于存放在系统存储器自举模式下的启动程序(BootLoader),当使用ISP方式加载程序时,就是由这个程序执行。

这个区域由芯片厂写入BootLoader,然后锁死,用户是无法改变这个区域的。

选项字节存储芯片的配置信息及对主存储块的保护信息。

FLASH的页面STM32的FLASH主存储块按页组织,有的产品每页1KB,有的产品每页2KB。

页面典型的用途就是用于按页擦除FLASH。

从这点来看,页面有点像通用FLASH的扇区。

STM32产品的分类STM32根据FLASH主存储块容量、页面的不同,系统存储器的不同,分为小容量、中容量、大容量、互联型,共四类产品。

小容量产品主存储块1-32KB,每页1KB。

系统存储器2KB。

中容量产品主存储块64-128KB,每页1KB。

系统存储器2KB。

大容量产品主存储块256KB以上,每页2KB。

系统存储器2KB。

互联型产品主存储块256KB以上,每页2KB。

系统存储器18KB。

对于具体一个产品属于哪类,可以查数据手册,或根据以下简单的规则进行区分:STM32F101xx、STM32F102xx 、STM32F103xx产品,根据其主存储块容量,一定是小容量、中容量、大容量产品中的一种,STM32F105xx、STM32F107xx 是互联型产品。

互联型产品与其它三类的不同之处就是BootLoader的不同,小中大容量产品的BootLoader只有2KB,只能通过USART1进行ISP,而互联型产品的BootLoader 有18KB,能通过USAT1、4、CAN等多种方式进行ISP。

STM32实现内部Flash的读写(HAL库版)

STM32实现内部Flash的读写(HAL库版)

STM32实现内部Flash的读写(HAL库版) Flash 中⽂名字叫闪存,是⼀种长寿命的⾮易失性(断电数据不丢失)的存储器。

可以对称为块的存储器单元块进⾏擦写和再编程,在进⾏写⼊操作之前必须先执⾏擦除。

⼀个Nand Flash由多个块(Block)组成,每个块⾥⾯⼜包含很多页(page)。

每个页对应⼀个空闲区域/冗余区域(spare area),这个区域不是⽤来存储数据的,⽤于放置数据的校验值检测和纠错的。

块,是Nand Flash的擦除操作的基本/最⼩单位。

页,是Nand Flash的写⼊操作的基本/最⼩的单位。

⾸先简要写⼀下FLASH的读写流程: 对FLASH写⼊数据 解锁FLASH 擦除FLASH 写⼊数据到FLASH 锁住FLASH FLASH读取数据(直接读取相应的FLASH地址即可) 操作MCU⾥的Flash,还有⼏个注意事项: 1、往Flash写⼊数据的时候,要先对要写⼊的页进⾏擦除,如果要写的页⾥有数据,要先读出来在缓存区,再把页擦除,再写⼊数据;在擦除页之后,只要这次你写的数据⼤⼩不够⼀页,可以连续写⼊。

2、要计算好程序的内存,因为你的程序也是保存在MCU的Flash⾥的,如果你操作到保存着程序的内存,程序就会死掉,⾄于程序内存怎么看,你可以⽣成bin⽂件,bin⽂件的⼤⼩就是你程序所占内存的⼤⼩了,⽣成bin⽂件可以参考博客:;程序内存基本都是从Flash内存⼀开始存起的,这⾥以STM32Fo72c8t6举例,如下图。

看图可以看出,这个芯⽚的Flash内存范围是0x0800 0000 ~ 0x0802 0000 ,假设我要烧录进去的bin⽂件为10K,那我们操作Flash的时候,地址就要从0x0800 0000 + (0x400*11) 开始,避开程序的存储位置,Flash地址偏移1位就是1个字节。

3、要注意MCU⼀页的⼤⼩,⼀些MCU⼀页是1KB,⼀些MCU⼀页是2KB 下⾯举个例⼦写⼊数据0x0001到Flash中uint16_t my_add = 0x0001; uint32_t Robot_Num_Flash_Add = 0x08005000;FLASH_EraseInitTypeDef My_Flash; //声明 FLASH_EraseInitTypeDef 结构体为 My_FlashHAL_FLASH_Unlock();//解锁FlashMy_Flash.TypeErase = FLASH_TYPEERASE_PAGES; //标明Flash执⾏页⾯只做擦除操作My_Flash.PageAddress = Robot_Num_Flash_Add; //声明要擦除的地址My_Flash.NbPages = 1; //说明要擦除的页数,此参数必须是Min_Data = 1和Max_Data =(最⼤页数-初始页的值)之间的值uint32_t PageError = 0; //设置PageError,如果出现错误这个变量会被设置为出错的FLASH地址HAL_FLASHEx_Erase(&My_Flash, &PageError); //调⽤擦除函数擦除uint16_t Write_Flash_Data = my_add; //对Flash进⾏烧写,FLASH_TYPEPROGRAM_HALFWORD 声明操作的Flash地址的16位的,此外还有32位跟64位的操作,⾃⾏翻查HAL库的定义即可 HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, Robot_Num_Flash_Add, Write_Flash_Data);HAL_FLASH_Lock(); //锁住Flash 写完之后,接着就到读了,Flash写有次数限制,写的次数在1W次还是10W次(忘了)就不可写⼊了,⽽读是没有次数限制的,读多少次都可以,下⾯就把写⼊到Flash⾥的数据0x0001读出来uint32_t Robot_Num_Flash_Add = 0x08005000; ID_Num = *(__IO uint16_t*)( Robot_Num_Flash_Add ); //*(__IO uint16_t *)是读取该地址的参数值,其值为16位数据,⼀次读取两个字节,*(__IO uint32_t *)就⼀次读4个字节 printf("ID_num:0x%x\r\n", ID_Num); 经过上⾯的程序就可以实现 STM32 中 Flash 数据的读写了,具体怎么读写,每个案⼦不同,各位就可以根据需求去修改,只要注意好注意事项即可,代码已经实测可⽤。

关于STM32的flash读写数据和HardFault

关于STM32的flash读写数据和HardFault

关于STM32的flash读写数据和HardFault今天调试程序的时候需要把掉电前的数据存储到flash中之后等待下次初始化的时候把数据读进来。

刚刚开始的时候去找了一些stm32的flash的操作,真的是废话连篇的真正能用到的没几句话,这里我把自己调试好的flash读写数据的子函数跟大家分享一下。

void FLASH_WriteByte(u32 addr ,u16 flashdata1){FLASH_Status FLASHstatus = FLASH_COMPLETE;FLASH_Unlock();//解锁FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR);FLASHstatus=FLASH_ErasePage(addr);//擦除整页FLASHstatus=FLASH_ProgramHalfWord(addr, flashdata1);//写入数据FLASH_Lock();//锁定}这个子函数就是将数据flashdata1写到地址addr中去。

数据的长度是可变的。

当需要读入数据的时候可以直接访问地址,如:rdata=*(u16 *)0x08014000; //读flash中默认数据0x08014000是存储的地址。

这样大家应该很清楚了吧。

flash读写数据还是比较简单的,这里希望能帮到大家。

但是在写入数据的时候,又遇到了另一个问题,就是程序运行的时候进入到这个HardFault_Handler函数中死循环了,不知道大家有没有遇到过这个问题,后来我查了一些资料,发现可能是存储器的分配有问题。

然后把地址改到更大的地方,又试了试,发现已经可以了。

建议大家这样试一试。

下面是我找的关于防止误擦除有用程序代码的方法方法一:首先要计算程序代码有多少,把FLASH存取地址设置在程序代码以外的地方,这样就不会破坏用户程序。

STM32库开发实战指南-M4:50-读写内部FLASH

STM32库开发实战指南-M4:50-读写内部FLASH

第50章读写内部FLASH本章参考资料:《STM32F4xx参考手册》、《STM32F4xx规格书》、库说明文档《stm32f4xx_dsp_stdperiph_lib_um.chm》。

50.1STM32的内部FLASH简介在STM32芯片内部有一个FLASH存储器,它主要用于存储代码,我们在电脑上编写好应用程序后,使用下载器把编译后的代码文件烧录到该内部FLASH中,由于FLASH存储器的内容在掉电后不会丢失,芯片重新上电复位后,内核可从内部FLASH中加载代码并运行,见图50-1。

图50-1STM32的内部框架图除了使用外部的工具(如下载器)读写内部FLASH外,STM32芯片在运行的时候,也能对自身的内部FLASH进行读写,因此,若内部FLASH存储了应用程序后还有剩余的空间,我们可以把它像外部SPI-FLASH那样利用起来,存储一些程序运行时产生的需要掉电保存的数据。

由于访问内部FLASH的速度要比外部的SPI-FLASH快得多,所以在紧急状态下常常会使用内部FLASH存储关键记录;为了防止应用程序被抄袭,有的应用会禁止读写内部FLASH中的内容,或者在第一次运行时计算加密信息并记录到某些区域,然后删除自身的部分加密代码,这些应用都涉及到内部FLASH的操作。

1.内部FLASH的构成STM32的内部FLASH包含主存储器、系统存储器、OTP区域以及选项字节区域,它们的地址分布及大小见表50-1。

表50-1STM32内部FLASH的构成区域块名称块地址大小主存储器块1扇区00x08000000-0x08003FFF16Kbytes扇区10x08004000-0x08007FFF16Kbytes扇区20x08008000-0x0800BFFF16Kbytes扇区30x0800C000-0x0800FFFF16Kbyte扇区40x08010000-0x0801FFFF64Kbytes扇区50x08020000-0x0803FFFF128Kbytes扇区60x08040000-0x0805FFFF128Kbytes扇区70x08060000-0x0807FFFF128Kbytes扇区80x08080000-0x0809FFFF128Kbytes扇区90x080A0000-0x080B FFFF128Kbytes扇区100x080C0000-0x080D FFFF128Kbytes扇区110x080E0000-0x080F FFFF128Kbytes 块2扇区120x08100000-0x08103FFF16Kbytes扇区130x08104000-0x08107FFF16Kbytes扇区140x08108000-0x0810BFFF16Kbytes扇区150x0810C000-0x0810FFFF16Kbyte扇区160x08110000-0x0811FFFF64Kbytes扇区170x08120000-0x0813FFFF128Kbytes扇区180x08140000-0x0815FFFF128Kbytes扇区190x08160000-0x0817FFFF128Kbytes扇区200x08180000-0x0819FFFF128Kbytes扇区210x081A0000-0x081B FFFF128Kbytes扇区220x081C0000-0x081D FFFF128Kbytes扇区230x081E0000-0x081F FFFF128Kbytes系统存储区0x1FFF0000-0x1FFF77FF30Kbytes OTP区域0x1FFF7800-0x1FFF7A0F528bytes选项字节块10x1FFF C000-0x1FFF C00F16bytes 块20x1FFE C000-0x1FFE C00F16bytes各个存储区域的说明如下:主存储器一般我们说STM32内部FLASH的时候,都是指这个主存储器区域,它是存储用户应用程序的空间,芯片型号说明中的1M FLASH、2M FLASH都是指这个区域的大小。

STM32-FLASH读写

STM32-FLASH读写

最近在学STM32,要用到内部flash存点数据,一开始在网上看了很多例程,自己写了一个,当到单片机中,一点反应没有,于是又到网上看了又看,找啊找,发现这样的读写内部flash 的软件不多,而且说的也不是很明确(个人观点),特地总结了一下,希望对刚学STM32的小伙伴有帮助。

注意:写数据的地址(红色字),如果你的boot1=x,boot0=0,那么你的启动模式是用户闪存存储器,而这个用户闪存存储器的地址就是0x08000000。

这个很重要!!!!!我用的是STM32F103VET6,下面是写内部flash的子程序:#include "flash.h"#define STARTADDR 0x0807F800 //主存储器第255页首地址volatile FLASH_Status FLASHStatus = FLASH_COMPLETE;/*读内部flash的指定地址的N个字节;ReadAddress:指定地址。

ReadBuf:数据存储指针。

ReadNum:读取字节数。

*/void ReadFlashNBtye(uint32_t ReadAddress, uint8_t *ReadBuf, int32_t ReadNum){int DataNum = 0;ReadAddress = (uint32_t)STARTADDR + ReadAddress;while(DataNum < ReadNum){*(ReadBuf + DataNum) = *(__IO uint8_t*) ReadAddress++;DataNum++;}// return DataNum;}/*向内部flash写入数据WriteAddress:写数据地址偏移量。

WriteData:写入的数据。

*/void WriteFlashOneWord(uint32_t WriteAddress,uint32_t WriteData){FLASH_Unlock();FLASH_ClearFlag(FLASH_FLAG_BSY | FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR);FLASHStatus = FLASH_ErasePage(STARTADDR);//擦除一页FLASH_EraseAllPages():擦除全// 部FLASH 页面if(FLASHStatus == FLASH_COMPLETE){FLASHStatus = FLASH_ProgramWord(STARTADDR + WriteAddress, WriteData);}FLASH_Lock();}函数调用:例:u8 Temp_Data[4] = { 0 };WriteFlashOneWord( 0 , 0x12345678 );delay_ms(10);ReadFlashNBtye( 0 , Temp_Data , 4 );delay_ms(10);这样数据就写入了内部flash,读出时就放在了Temp_Data[4]中。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

STM32 芯片内部的 FLASH 存储器,主要用于存储我们代码。

如果内部FLASH存储完我们的代码还有剩余的空间,那么这些剩余的空间我们就可以利用起来,存储一些需要掉电保存的数据。

本文以STM32103ZET6为例。

STM32103ZET6属于大容量产品,其闪存模块组织如下:其主存储器大小为512KB,分为256页,每页大小都为2KB。

我们的程序一般默认烧写到第0页的起始地址(0x08000000)处。

当BOOT0引脚和BOOT1引脚都接GND时,就是从这个地址开始运行代码的。

这个地址在keil中可以看到:假如我们要下载的程序大小为4.05KB,则第0、1、2页用于保存我们的程序,我们需要掉电保存的数据只能保存在第3~第255页这一部分空间内。

我们最终要下载的程序大小可在工程对应的.map文件中看到。

.map文件可以双击工程的Target的名字快速打开,如:下面对STM32内部FLASH进行简单的读写测试:内部FLASH读写测试流程图如下:本流程图省略异常情况,只考虑成功的情况:示例代码:本例的关键代码如下(以读写第255页为例):/******************************************************************** ************************************------------------------------------------STM32 Demo---------------------------------------------------** 工程说明:STM32内部FLASH实验* 作者:ZhengNian* 博客:zhengnianli.github.io* 公众号:嵌入式大杂烩********************************************************************** ***********************************/#define MAIN_CONFIG#include "config.h"/* STM32F103ZET6有256页,每一页的大小都为2KB */#define ADDR_FLASH_PAGE_255 ((uint32_t)0x0807F800) /* Page255 2KB *//* FLASH读写测试结果 */#define TEST_ERROR -1 /* 错误(擦除、写入错误) */#define TEST_SUCCESS 0 /* 成功 */#define TEST_FAILED 1 /* 失败 *//* Flash读写测试buf */#define BufferSize 6uint16_t usFlashWriteBuf[BufferSize] ={0x0101,0x0202,0x0303,0x0404,0x0505,0x0606};uint16_t usFlashReadBuf[BufferSize] = {0};/* 供本文件调用的函数声明 */static int FlashReadWriteTest(void);/******************************************************************** ************************************* 函数: main**------------------------------------------------------------------------------------------------------** 参数: void** 返回: 无** 说明: 主函数********************************************************************* ***********************************/int main(void){/* 上电初始化 */SysInit();/* 内部Flash读写测试 */if (TEST_SUCCESS == FlashReadWriteTest()){printf("Flash test success!\n");}else{printf("Flash test failed!\n");}while (1){}}/******************************************************************** ************************************* 函数: FlashReadWriteTest, 内部Flash读写测试函数**------------------------------------------------------------------------------------------------------** 参数: void** 返回: TEST_ERROR:错误(擦除、写入错误) TEST_SUCCESS:成功TEST_FAILED:失败** 说明: 无********************************************************************* ***********************************/static int FlashReadWriteTest(void){uint32_t ucStartAddr;/* 解锁 */FLASH_Unlock();/* 擦除操作 */ucStartAddr = ADDR_FLASH_PAGE_255;if (FLASH_COMPLETE != FLASH_ErasePage(ucStartAddr)){printf("Erase Error!\n");return TEST_ERROR;}else{ucStartAddr = ADDR_FLASH_PAGE_255;printf("擦除成功,此时FLASH中值为:\n");for (int i = 0; i < BufferSize; i++){usFlashReadBuf[i] = *(uint32_t*)ucStartAddr;printf("ucFlashReadBuf[%d] = 0x%.4x\n", i, usFlashReadBuf[i]);ucStartAddr += 2;}}/* 写入操作 */ucStartAddr = ADDR_FLASH_PAGE_255;printf("\n往FLASH中写入的数据为:\n");for (int i = 0; i < BufferSize; i++){if (FLASH_COMPLETE != FLASH_ProgramHalfWord(ucStartAddr, usFlashWriteBuf[i])){printf("Write Error!\n");return TEST_ERROR;}printf("ucFlashWriteBuf[%d] = 0x%.4x\n", i, usFlashWriteBuf[i]);ucStartAddr += 2;}/* 上锁 */FLASH_Lock();/* 读取操作 */ucStartAddr = ADDR_FLASH_PAGE_255;printf("\n从FLASH中读出的数据为:\n");for (int i = 0; i < BufferSize; i++){usFlashReadBuf[i] = *(__IO uint16_t*)ucStartAddr;printf("ucFlashReadBuf[%d] = 0x%.4x\n", i, usFlashReadBuf[i]);ucStartAddr += 2;}/* 读出的数据与写入的数据做比较 */for (int i = 0; i < BufferSize; i++){if (usFlashReadBuf[i] != usFlashWriteBuf[i]){return TEST_FAILED;}}return TEST_SUCCESS;}/******************************************************************** *************************************** End Of File********************************************************************* ***********************************/(1)进行解锁操作STM32 的闪存编程是由内嵌的闪存编程/擦除控制器(FPEC)管理,这个模块包含的寄存器如下:STM32 复位后, FPEC 模块是被保护的,不能写入 FLASH_CR 寄存器;通过写入特定的序列到 FLASH_KEYR 寄存器可以打开 FPEC 模块(即写入 KEY1和KEY2),只有在写保护被解除后,我们才能操作相关寄存器。

固件库中的函数为:/* 解锁 */void FLASH_Unlock(void);(2)擦除将要写的页STM32 的 FLASH 在编程的时候,也必须要求其写入地址的 FLASH 是被擦除了的(也就是其值必须是 0XFFFF),否则无法写入,在 FLASH_SR 寄存器的PGERR 位将得到一个警告。

STM32 的闪存擦除分为两种:页擦除和整片擦除。

也就是其最小擦除单位为1页,尽管你只需往某页里写10个字节数据或者更少的数据,你也必须先擦除该页(2*1024个字节)。

我们这里使用按页擦除,固件库中按页擦除的函数为:/* 按页擦除 */FLASH_Status FLASH_ErasePage(uint32_t Page_Address);其返回值为枚举:typedef enum{FLASH_BUSY = 1, /* 忙 */FLASH_ERROR_PG, /* 编程错误 */FLASH_ERROR_WRP, /* 写保护错误 */FLASH_COMPLETE, /* 操作完成 */FLASH_TIMEOUT /* 操作超时 */}FLASH_Status;(3)往上一步擦写成功的页写入数据STM32 闪存的编程每次必须写入16 位。

相关文档
最新文档