提到STM32的FLSAH,咱们的榜首反应是用来装程序的,实际上,STM32的片内FLASH不只用来装程序,还用来装芯片装备、芯片ID、自举程序等等。当然,
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
互联型产品与其它三类的不同之处便是BootLoader的不同,小中大容量产品的BootLoader只需2KB,只能经过USART1进行ISP,而互联型产品的BootLoader有18KB,能经过USAT1、4、CAN等多种方法进行ISP。小空量产品、中容量产品的BootLoader与大容量产品相同。
关于ISP与IAP
ISP(In
IAP(In
ISP与IAP的差异在于,ISP一般是对芯片整片从头编程,用的是芯片厂的自举程序。而IAP仅仅更新程序的一部分,用的是电器厂开发的IAP引导程序。归纳来看,ISP遭到的约束更多,而IAP由所以自己开发的程序,替换程序的时分更简单操作。
FPEC
FPEC(FLASH
FPEC键寄存器(FLASH_KEYR)
选项字节键寄存器(FLASH_OPTKEYR)
闪存操控寄存器(FLASH_CR)
闪存状况寄存器(FLASH_SR)
闪存地址寄存器(FLASH_AR)
选项字节寄存器(FLASH_OBR)
写维护寄存器(FLASH_WRPR)
键值
为了增强安全性,进行某项操作时,需要向某个方位写入特定的数值,来验证是否为安全的操作,这些数值称为键值。STM32的FLASH共有三个键值:
RDPRT键
KEY1
KEY2
闪存锁
在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位为1时,不能对任何FPEC寄存器履行写操作,所以有必要要等BSY位为0时,才干履行闪存操作。
2.
STM32在履行编程操作前,会先查看要编程的地址是否被擦除,假如没有,则不进行编程,并置FLASH_SR寄存器的PGERR位为1。仅有破例的是,当要编程的数据为0X0000时,即便未擦除,也会进行编程,由于0X0000即便擦除也能够正确编程。
3.
STM32在某些特殊情况下(例如FPEC被锁住),或许根本就没有履行所要的操作,仅经过寄存器无法判别操作是否成功。所以,稳妥起见,操作后都要读出一切数据查看。
4.
请参阅STM32固件库中的数据。
5.
关于这点,我的了解是,进行闪存操作时,有必要要确保HIS没有被封闭,可是操作时的体系依然能够是HSE时钟。STM32复位后,HIS默许是开的,只需你不为了低功耗去自动封闭它,则用什么时钟都能够进行闪存操作的。我所编的程序也验证了这一点。