STM32自身没有自带EEPROM,可是STM32具有IAP(在运用编程)功用,所以咱们能够把它的FLASH当成EEPROM来运用,一起,开发者为了维护后期的版别晋级,应该考虑到晋级的或许和可行性,总不能让用户拿着仿真器在线晋级或现场调试吧很为难的,其次主张串口晋级是现在较为被群众承受的方法,stm32的串口晋级时BOOT0在上啦的情况下晋级只需求硬件规划时考虑到就ok。程序一般烧写在flash里边,地址0x8000000开端,晋级的原理便是便是有一个写好的bootloader引导程序,它占用必定的空间比方0x800000-0x80002000这是这段代码的空间,那么用户程序便是完结功用的程序就要从0x80002001k开端履行了,在这儿设置的时分还要留心嵌套中止的NVIC是有差异的。
在bootloader里NVIC_configuration()
是这样的
void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
#ifdefVECT_TAB_RAM
/* Set the Vector Table base location at 0x20000000 */
NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
#else/* VECT_TAB_FLASH*/
/* Set the Vector Table base location at 0x08000000 */
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0);
#endif
/* Configure one bit for preemption priority */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
}
在功用程序里边就要将0X8000000改成0x8000001l了。在keil编译软件里要设置一下。在general options里。那么FLASH能够寄存程序,当然也能够当EEROM用了便是这个道理。
STM32FLASH简介
不同类型的STM32,其FLASH容量也有所不同,最小的只需16K字节,最大的则达到了1024K字节。战舰STM32开发板挑选的STM32F103ZET6的FLASH容量为512K字节,归于大容量产品(别的还有中容量和小容量产品),
STM32的闪存模块由:主存储器、信息块和闪存存储器接口寄存器等3部分组成。
主存储器,该部分用来寄存代码和数据常数(如const类型的数据)。关于大容量产品,其被划分为256页,每页2K字节。留心,小容量和中容量产品则每页只需1K字节。从上图能够看出主存储器的开端地址便是0X08000000,B0、B1都接GND的时分,便是从0X08000000开端运转代码的。
信息块,该部分分为2个小部分,其间发动程序代码,是用来存储ST自带的发动程序,用于串口下载代码,当B0接V3.3,B1接GND的时分,运转的便是这部分代码。另一部分用户挑选字节,则一般用于装备写维护、读维护等功用,
闪存存储器接口寄存器,该部分用于操控闪存读写等,是整个闪存模块的操控组织。
闪存的读取
内置闪存模块能够在通用地址空间直接寻址,任何32位数据的读操作都能拜访闪存模块的内容并得到相应的数据。读接口在闪存端包括一个读操控器,还包括一个AHB接口与CPU联接。这个接口的首要作业是发生读闪存的操控信号并预取CPU要求的指令块,预取指令块仅用于在I-Code总线上的取指操作,数据常量是经过D-Code总线拜访的。这两条总线的拜访方针是相同的闪存模块,拜访D-Code将比预取指令优先级高
这儿要特别留心一个闪存等候时间,由于CPU运转速度比FLASH快得多,STM32F103的FLASH最快拜访速度≤24Mhz,假如CPU频率超越这个速度,那么有必要参加等候时间,比方咱们一般运用72Mhz的主频,那么FLASH等候周期就有必要设置为2,该设置经过FLASH_ACR寄存器设置,详细代码体现在RCC_Configuration()内部这句话
/*设置FLASH延时周期数为2 */
FLASH_SetLatency(FLASH_Latency_2);。
运用STM32的官方固件库操作FLASH的几个常用函数。这些函数和界说散布在文件stm32f10x_flash.c以及stm32f10x_flash.h文件中。
1.确定解锁函数
在对FLASH进行写操作前有必要先解锁,解锁操作也便是有必要在FLASH_KEYR寄存器写入特定的序列(KEY1和KEY2),固件库函数完结很简略:
voidFLASH_Unlock(void);
相同的道理,在对FLASH写操作完结之后,咱们要确定FLASH,运用的库函数是:
voidFLASH_Lock(void);
2.写操作函数
固件库供给了三个FLASH写函数:
FLASH_StatusFLASH_ProgramWord(uint32_tAddress,uint32_tData);
FLASH_StatusFLASH_ProgramHalfWord(uint32_tAddress,uint16_tData);
FLASH_StatusFLASH_ProgramOptionByteData(uint32_tAddress,uint8_tData);
望文生义分别为:FLASH_ProgramWord为32位字写入函数,其他分别为16位半字写入和用户挑选字节写入函数。这儿需求阐明,32位字节写入实践上是写入的两次16位数据,写完第一次后地址+2,这与咱们前面解说的STM32闪存的编程每次有必要写入16位并不矛盾。写入8位实践也是占用的两个地址了,跟写入16位根本上没啥差异。
3.擦除函数
固件库供给三个FLASH擦除函数:
FLASH_StatusFLASH_ErasePage(uint32_tPage_Address);
FLASH_StatusFLASH_EraseAllPages(void);
FLASH_StatusFLASH_EraseOptionBytes(void);
这三个函数能够望文生义了,十分简略。
4.获取FLASH状况
首要是用的函数是:
FLASH_StatusFLASH_GetStatus(void);
返回值是经过枚举类型界说的:
typedefenum
{
FLASH_BUSY=1,//忙
FLASH_ERROR_PG,//编程过错
FLASH_ERROR_WRP,//写维护过错
FLASH_COMPLETE,//操作完结
FLASH_TIMEOUT//操作超时
}FLASH_Status;
从这儿面咱们能够看到FLASH操作的5个状况,每个代表的意思咱们在后边注释了。
5.等候操作完结函数
在履行闪存写操作时,任何对闪存的读操作都会锁住总线,在写操作完结后读操作才干正确地进行;既在进行写或擦除操作时,不能进行代码或数据的读取操作。所以在每次操作之前,咱们都要等候上一次操作完结这次操作才干开端。运用的函数是:
FLASH_StatusFLASH_WaitForLastOperation(uint32_tTimeout)
进口参数为等候时间,返回值是FLASH的状况,这个很简略了解,这个函数自身咱们在固件库中运用得不多,可是在固件库函数体中心能够屡次看到。
6.读FLASH特定地址数据函数
有写就必定有读,而读取FLASH指定地址的半字的函数固件库并没有给出来,这儿咱们自己写的一个函数:
u16STMFLASH_ReadHalfWord(u32faddr)
{
return*(vu16*)faddr;
}
而流程便是
触发条件—-àFlashunlockàserialdown–àflashlock
看了半响,本来只需几句就能够处理,当然是不考虑其他功用,仅仅简略的读写操作。
其间写操作如下:
FLASH_Unlock();//解锁FLASH编程擦除操控器
FLASH_ClearFlag(FLASH_FLAG_BSY|FLASH_FLAG_EOP|FLASH_FLAG_PGERR|FLASH_FLAG_WRPRTERR);//铲除标志位
/*********************************************************************************
// FLASH_FLAG_BSY FLASH忙标志位
// FLASH_FLAG_EOP FLASH操作完毕标志位
// FLASH_FLAG_PGERR FLASH编写过错标志位
// FLASH_FLAG_WRPRTERR FLASH页面写维护过错标净
**********************************************************************************/
FLASH_ErasePage(FLASH_START_ADDR); //擦除指定地址页
FLASH_ProgramHalfWord(FLASH_START_ADDR+(addr+i)*2,dat); //从指定页的addr地址开端写
FLASH_ClearFlag(FLASH_FLAG_BSY|FLASH_FLAG_EOP|FLASH_FLAG_PGERR|FLASH_FLAG_WRPRTERR);//铲除标志位
FLASH_Lock(); //确定FLASH编程擦除操控器
从上面能够看出根本次序是:解锁-》铲除标志位(能够不要)-》擦除-》写半字16位-》清楚标志位(也能够不要)-》上锁。其间FLASH_START_ADDR是宏界说的0x8000000+2048*255,0×8000000是Flash的开端地址,2048是由于我用的是大容量芯片,依据上一笔记Flash地址能够看出芯片每页容量2K,即2048字节,255表明芯片的最终一页,这个依据不同芯片而定。之所以从后边页写起能够避免贮存数据损坏用户程序。addr*2是由于每个数据占用2字节(半字),尽管写入的是1字节数据,可是编程是2字节为单位,也便是说一个字节的数据也会占用两个字节地址。
用YMODEM协议(ymodem协议自己脑补)烧写会用到flasheraser,剩余的便是要写的数据地址,数据包巨细处理,怎样写到每一页去,今后更新!