您的位置 首页 电路

关于STM32的FLASH操作

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

提到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。小空量产品、中容量产品的BootLoader与大容量产品相同。

关于ISP与IAP

ISP(InSystemProgramming)在体系编程,是指直接在方针电路板上对芯片进行编程,一般需求一个自举程序(BootLoader)来履行。ISP也有叫ICP(InCircuitProgramming)、在电路编程、在线编程。

IAP(InApplicationProgramming)在运用中编程,是指终究产品出厂后,由终究用户在运用中对用户程序部分进行编程,完结在线晋级。IAP要求将程序分红两部分:引导程序、用户程序。引导程序总是不变的。IAP也有叫在程序中编程。

ISP与IAP的差异在于,ISP一般是对芯片整片从头编程,用的是芯片厂的自举程序。而IAP仅仅更新程序的一部分,用的是电器厂开发的IAP引导程序。归纳来看,ISP遭到的约束更多,而IAP由所以自己开发的程序,替换程序的时分更简单操作。

FPEC

FPEC(FLASHProgram/Erasecontroller闪存编程/擦除操控器),STM32经过FPEC来擦除和编程FLASH。FPEC运用7个寄存器来操作闪存:

FPEC键寄存器(FLASH_KEYR)写入键值解锁。

选项字节键寄存器(FLASH_OPTKEYR)写入键值解锁选项字节操作。

闪存操控寄存器(FLASH_CR)挑选并发动闪存操作。

闪存状况寄存器(FLASH_SR)查询闪存操作状况。

闪存地址寄存器(FLASH_AR)存储闪存操作地址。

选项字节寄存器(FLASH_OBR)选项字节中首要数据的映象。

写维护寄存器(FLASH_WRPR)选项字节中写维护字节的映象。

键值

为了增强安全性,进行某项操作时,需要向某个方位写入特定的数值,来验证是否为安全的操作,这些数值称为键值。STM32的FLASH共有三个键值:

RDPRT键=0x000000A5用于免除读维护

KEY1=0x45670123用于免除闪存锁

KEY2=0xCDEF89AB用于免除闪存锁

闪存锁

在FLASH_CR中,有一个LOCK位,该位为1时,不能写FLASH_CR寄存器,然后也就不能擦除和编程FLASH,这称为闪存锁。

当LOCK位为1时,闪存锁有用,只需向FLASH_KEYR顺次写入KEY1、KEY2后,LOCK位才会被硬件清零,然后免除闪存锁。当LOCK位为1时,对FLASH_KEYR的任何过错写操作(榜首次不是KEY1,或第2次不是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默许是开的,只需你不为了低功耗去自动封闭它,则用什么时钟都能够进行闪存操作的。我所编的程序也验证了这一点。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/fangan/dianlu/258374.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部