网站备案链接地址,阳江网站建设,网站降权查询工具,打开网站是iis7简介
STM32F1系列的FLASH包含程序存储器、系统存储器和选项字节三个部分#xff0c;通过闪存存储器接口#xff08;外设#xff09;可以对程序存储器和选项字节进行擦除和编程。
读写Flash的用途
1.利用程序存储器的剩余空间来保存掉电不丢失的用户数据。
2.通过在程序中…简介
STM32F1系列的FLASH包含程序存储器、系统存储器和选项字节三个部分通过闪存存储器接口外设可以对程序存储器和选项字节进行擦除和编程。
读写Flash的用途
1.利用程序存储器的剩余空间来保存掉电不丢失的用户数据。
2.通过在程序中变成IPA实现程序的自我更新。
在线编程ICP用于更新程序存储器的全部内容通过JTAG、SWD协议或系统加载程序Bootloader下载程序例如ST-LINK使用SWD协议进行下载程序每次下载都是将整个程序都覆盖掉。
在程序中编程IAP可以使用微控制器支持的任意一种通信接口下载程序。自己写一个Bootloader放在程序更新时不会覆盖的地方需要更新程序时控制程序跳转到自己写的Bootloader中再进行接收任意一种通信接口传过来的数据就是待更新的程序再控制Flash读写把收到的程序写到程序正常运行的地方写完后控制程序跳转回去或者直接复位。
闪存只能1写0不能0写1写入前必须擦除必须以最小单位进行擦除擦除后数据全为1擦除后需要等待忙
存储器映像 闪存模块组织
每页大小为1k Flash基本结构 Flash解锁
FPEC共有三个键值 RDPRT键0x000000A5 KEY10x45670123 KEY20xCDEF89AB
解锁 复位后FPEC被保护不能写入FLASH_CR 在FLASH_KEYR先写入KEY1再写入KEY2解锁 错误的操作序列会在下次复位前锁死FPEC和FLASH_CR
加锁 设置FLASH_CR中的LOCK位锁住FPEC和FLASH_CR
使用指针访问存储器
先指定地址地址可进行加减。然后进行强制类型转换再解引用。
__IO 对应C语言关键字 volatile防止编译器优化。或者防止缓存数据不同步问题。
读取不需要解锁。
写数据需要提前解锁。 程序存储器页编程流程图
写入
注对主闪存编程每次可以写入16位。当FLASH_CR寄存器的PG位为’1’时在一个闪存地址写入 一个半字将启动一次编程写入任何非半字的数据 FPEC都会产生总线错误。在编程过程中 (BSY位为’1’)任何读写闪存的操作都会使CPU暂停直到此次闪存编程结束。 STM32的闪存在写入之前会检查指定地址有没有擦除如果没有擦除就写入STM32不执行写入操作除非写入的数据全是0。 页擦除 闪存全擦除 解锁过程在KEYR寄存器先写入KEY1,在写入KEY2。
选项字节 RDP:写入RDPRT键0x000000A5后解除读保护。
USER:选择看门狗事件和进入停机/待机模式是否产生复位。
Data0/1:用户可自定义。
WRP0/1/2/3: 配置写保护每一个位对应保护4个存储页中容量。
n字母开头为对应数据的反码。
选项字节擦除
检查FLASH_SR的BSY位以确认没有其他正在进行的编程操作解锁FLASH_CR的OPTWRE位设置FLASH_CR的OPTPG位为1写入要编程的半字到指定的地址等待BSY位变为0读出写入的地址并验证数据
选项字节编程
检查FLASH_SR的BSY位以确认没有其他正在进行的编程操作解锁FLASH_CR的OPTWRE位设置FLASH_CR的OPTPG位为1写入要编程的半字到指定的地址等待BSY位变为0读出写入的地址并验证数据
器件电子签名 flash代码
//FLASH读取一个32位的字
uint32_t MyFLASH_ReadWord(uint32_t Address)
{return *((__IO uint32_t *)(Address)); //使用指针访问指定地址下的数据并返回
}//函 数FLASH读取一个16位的半字
uint16_t MyFLASH_ReadHalfWord(uint32_t Address)
{return *((__IO uint16_t *)(Address)); //使用指针访问指定地址下的数据并返回
}// 函 数FLASH读取一个8位的字节
uint8_t MyFLASH_ReadByte(uint32_t Address)
{return *((__IO uint8_t *)(Address)); //使用指针访问指定地址下的数据并返回
}//FLASH全擦除
void MyFLASH_EraseAllPages(void)
{FLASH_Unlock(); //解锁FLASH_EraseAllPages(); //全擦除FLASH_Lock(); //加锁
}//FLASH页擦除
void MyFLASH_ErasePage(uint32_t PageAddress)
{FLASH_Unlock(); //解锁FLASH_ErasePage(PageAddress); //页擦除FLASH_Lock(); //加锁
}//FLASH编程字
void MyFLASH_ProgramWord(uint32_t Address, uint32_t Data)
{FLASH_Unlock(); //解锁FLASH_ProgramWord(Address, Data); //编程字FLASH_Lock(); //加锁
}//FLASH编程半字
void MyFLASH_ProgramHalfWord(uint32_t Address, uint16_t Data)
{FLASH_Unlock(); //解锁FLASH_ProgramHalfWord(Address, Data); //编程半字FLASH_Lock(); //加锁
}