文档详情

关于STM32的FLASH操作

s9****2
实名认证
店铺
DOC
97.50KB
约7页
文档ID:442280819
关于STM32的FLASH操作_第1页
1/7

关于STM32的FLASH操作说到STM32的FLSAH,我们的第一反应是用来装程序的,实际上,STM32的片内FLASH不仅用来装程序,还用来装芯片配置、芯片ID、自举程序等等当然,FLASH还可以用来装数据FLASH分类根据用途,STM32片内的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小空量产品、中容量产品的BootLoader与大容量产品相同关于ISP与IAPISP(InSystemProgramming)在系统编程,是指直接在目标电路板上对芯片进行编程,一般需要一个自举程序(BootLoader)来执行ISP也有叫ICP(InCircuitProgramming)、在电路编程、编程IAP(InApplicationProgramming)在应用中编程,是指最终产品出厂后,由最终用户在使用中对用户程序部分进行编程,实现升级。

IAP要求将程序分成两部分:引导程序、用户程序引导程序总是不变的IAP也有叫在程序中编程ISP与IAP的区别在于,ISP—般是对芯片整片重新编程,用的是芯片厂的自举程序而IAP只是更新程序的一部分,用的是电器厂开发的IAP引导程序综合来看,ISP受到的限制更多,而IAP由于是自己开发的程序,更换程序的时候更容易操作FPECFPEC(FLASHProgram/Erasecontroller闪存编程/擦除控制器),通过来擦除和编程使用7个寄存器来操作闪存:FPEC键寄存器(FLASH_KEYR)选项字节键寄存器(FLASH_OPTKEYR)闪存控制寄存器(FLASH_CR)闪存状态寄存器(FLASH_SR)闪存地址寄存器(FLASH_AR)选项字节寄存器(FLASH_OBR)写保护寄存器(flash_Wrpr)写入键值解锁写入键值解锁选项字节操作选择并启动闪存操作查询闪存操作状态存储闪存操作地址选项字节中主要数据的映象选项字节中写保护字节的映象键值为了增强安全性,进行某项操作时,须要向某个位置写入特定的数值,来验证是否为安全的操作,这些数值称为键值STM32的FLASH共有三个键值:RDPRT键=0X000000A5KEY1=0x45670123KEY2=0XCDEF89AB用于解除读保护用于解除闪存锁用于解除闪存锁闪存锁在FLASH_CR中,有一个LOCK位,该位为1时,不能写FLASH_CR寄存器,从而也就不能擦除和编程FLASH,这称为闪存锁。

当LOCK位为1时,闪存锁有效,只有向FLASH_KEYR依次写入KEY1、KEY2后,LOCK位才会被硬件清零,从而解除闪存锁当LOCK位为1时,对FLASH_KEYR的任何错误写操作(第一次不是KEY1,或第二次不是KEY2),都将会导致闪存锁的彻底锁死,一旦闪存锁彻底锁死,在下一次复位前,都无法解锁,只有复位后,闪存锁才恢复为一般锁住状态复位后,LOCK位默认为1,闪存锁有效,此时,可以进行解锁解锁后,可进行FLASH的擦除编程工作任何时候,都可以通过对LOCK位置1来软件加锁,软件加锁与复位加锁是一样的,都可以解锁主存储块的擦除主存储块可以按页擦除,也可以整片擦除页擦除主存储块的任何一页都可以通过FPEC的页擦除功能擦除建议使用以下步骤进行页擦除:1. 检查FLASH_SR寄存器的BSY位以确认没有其他正在进行的闪存操作必须等待BSY位为0,才能继续操作2. 设置FLASH_CR寄存器的PER位为1选择页擦除操作3. 设置FLASH_AR寄存器为要擦除页所在地址,选择要擦除的页FLASH_AR的值在哪一页范围内,就表示要擦除哪一页4. 设置FLASH_CR寄存器的STRT位为1,启动擦除操作。

5. 等待FLASH_SR寄存器的BSY位变为0,表示操作完成6. 查询FLASH_SR寄存器的EOP位,EOP为1时,表示操作成功7. 读出被擦除的页并做验证擦完后所有数据位都为1整片擦除整片擦除功能擦除整个主存储块,信息块不受此操作影响建议使用以下步骤进行整片擦除:1. 检查FLASH_SR寄存器的BSY位,以确认没有其他正在进行的闪存操作2. 设置FLASH_CR寄存器的MER位为1选择整片擦除操作3. 设置FLASH_CR寄存器的STRT位为1启动整片擦除操作4. 等待FLASH_SR寄存器的BSY位变为0,表示操作完成5. 查询FLASH_SR寄存器的EOP位,EOP为1时,表示操作成功6. 读出所有页并做验证擦完后所有数据位都为1主存储块的编程对主存储块编程每次可以写入16位当FLASH_CR寄存器的PG位为1时,在一个闪存地址写入一个半字(16位)将启动一次编程;写入任何非半字的数据,FPEC都会产生总线错误在编程过程中(BSY位为1时),任何读写闪存的操作都会使CPU暂停,直到此次闪存编程结束建议使用如下步骤对主存储块进行编:1. 检查FLASH_SR寄存器的BSY位,以确认没有其他正在进行的编程操作。

2. 设置FLASH_CR寄存器的PG位为1选择编程操作3. 在指定的地址写入要编程的半字直接用指针写4. 等待FLASH_SR寄存器的BSY位变为0,表示操作完成5. 查询FLASH_SR寄存器的EOP位,EOP为1时,表示操作成功6. 读出写入的地址并验证数据关于主存储块擦除编程操作的一些疑问1. 为什么每次都要检查BSY位是否为0?因为BSY位为1时,不能对任何FPEC寄存器执行写操作,所以必须要等BSY位为0时,才能执行闪存操作2. 如果没有擦除就进行编程,会出现什么结果?STM32在执行编程操作前,会先检查要编程的地址是否被擦除,如果没有,则不进行编程,并置FLASH_SR寄存器的PGERR位为1唯一例外的是,当要编程的数据为0X0000时,即使未擦除,也会进行编程,因为0X0000即使擦除也可以正确编程3. 为什么操作后要读出数据并验证?STM32在某些特殊情况下(例如FPEC被锁住),可能根本就没有执行所要的操作,仅通过寄存器无法判断操作是否成功所以,保险起见,操作后都要读出所有数据检查4. 等待BSY位为1的时间以多少为合适?请参考STM32固件库中的数据5. FLASH编程手册上说进行闪存操作(擦除或编程)时,必须打开内部的RC振荡器(HSI),是不是一定要用HIS进行闪存的擦除及编程操作?对于这点,我的理解是,进行闪存操作时,必须要保证HIS没有被关闭,但是操作时的系统仍然可以是HSE时钟。

STM32复位后,HIS默认是开的,只要你不为了低功耗去主动关闭它,则用什么时钟都可以进行闪存操作的我所编的程序也验证了这一点选项字节选项字节用于存储芯片使用者对芯片的配置信息目前,所有的STM32101xx、STM32102xx、STM32103xx、STM32105xx、STM32107xx产品,选项字节都是16字节但是这16字节,每两个字节组成一个正反对,即,字节1是字节0的反码,字节3是字节2的反码,...,字节15是字节14的反码,所以,芯片使用者只要设置8个字节就行了,另外8个字节系统自动填充为反码因此,有时候,也说STM32的选项字节是8个字节,但是占了16字节的空间选项字节的8字节正码概述如下:RDP字节0读保护字节,存储对主存储块的读保护设置USER字节2用户字节,配置看门狗、停机、待机Data0字节4数据字节0,由芯片使用者自由使用Data1字节6数据字节1,由芯片使用者自由使用WRP0字节8写保护字节0,存储对主存储块的写保护设置WRP1字节10写保护字节1,存储对主存储块的写保护设置WRP2字节12写保护字节2,存储对主存储块的写保护设置WRP3字节14写保护字节3,存储对主存储块的写保护设置。

3选项字节写使能在FLASH_CR中,有一个OPTWRE位,该位为0时,不允许进行选项字节操作(擦除、编程)这称为选项字节写使能只有该位为1时,才能进行选项字节操作该位不能软件置1,但可以软件清零只有向FLASH_OPTKEYR依次写入KEY1和KEY2后,硬件会自动对该位置1,此时,才允许选项字节操作这称为解锁(打开)选项字节写使能该位为1后,可以由软件清零,关闭写使能复位后,该位为0错误操作不会永远关闭写使能,只要写入正确的键序列,则又可以打开写使能写使能已打开时,再次打开,不会出错,并且依然是打开的很显然,进行选项字节操作前,先要解开闪存锁,然后打开选项字节写使能,之后,才能进行选项字节操作选项字节擦除建议使用如下步骤对选项字节进行擦除:1. 检查FLASH_SR寄存器的BSY位,以确认没有其他正在进行的闪存操作2. 解锁FLASH_CR寄存器的OPTWRE位即,打开写使能3. 设置FLASH_CR寄存器的OPTER位为1选择选项字节擦除操作4. 设置FLASH_CR寄存器的STRT位为15. 等待FLASH_SR寄存器的BSY位变为0,表示操作完成6. 查询FLASH_SR寄存器的EOP位,EOP为1时,表示操作成功。

7.读出选项字节并验证数据由于选项字节只有16字节,因此,擦除时是整个选项字节都被擦除了选项字节编程建议使用如下步骤对选项字节进行编程:1. 检查FLASH_SR寄存器的BSY位,以确认没有其他正在进行的编程操作2. 解锁FLASH_CR寄存器的OPTWRE位即,打开写使能3. 设置FLASH_CR寄存器的OPTPG位为1选择编程操作4. 写入要编程的半字到指定的地址启动编程操作5. 等待FLASH_SR寄存器的BSY位变为0,表示操作完成6. 查询FLASH_SR寄存器的EOP位,EOP为1时,表示操作成功7. 读出写入的选项字节并验证数据对选项字节编程时,FPEC使用半字中的低字节并自动地计算出高字节(高字节为低字节的反码),并。

下载提示
相似文档
正为您匹配相似的精品文档
相关文档