管理多个wordpress博客,wordpress 深度优化,wordpress网盘插件,襄阳网站建设企业FLASH简介
STM32F1系列的FLASH包含程序存储器、系统存储器和选项字节三个部分#xff0c;通过闪存存储器接口#xff08;外设#xff09;可以对程序存储器和选项字节进行擦除和编程读写FLASH的用途#xff1a; 利用程序存储器的剩余空间来保存掉电不丢失的用户数据 通过在…FLASH简介
STM32F1系列的FLASH包含程序存储器、系统存储器和选项字节三个部分通过闪存存储器接口外设可以对程序存储器和选项字节进行擦除和编程读写FLASH的用途 利用程序存储器的剩余空间来保存掉电不丢失的用户数据 通过在程序中编程IAP实现程序的自我更新
在线编程In-Circuit Programming – ICP用于更新程序存储器的全部内容它通过JTAG、SWD协议或系统加载程序Bootloader下载程序在程序中编程In-Application Programming – IAP可以使用微控制器支持的任一种通信接口下载程序
闪存模块组织 FLASH基本结构 FLASH解锁
FPEC共有三个键值
1RDPRT键 0x000000A52KEY1 0x456701233KEY2 0xCDEF89AB解锁的方式 复位后FPEC被保护不能写入FLASH_CR也就是复位后FLASH默认是锁着的然后在FLASH_KEYR先写入KEY1再写入KEY2解锁。错误的操作序列会在下次复位前锁死FPEC和FLASH_CR。 解锁之后如何加锁呢我们操作完成之后要尽快把FLASH重新加锁以防止意外情况。 加锁 设置FLASH_CR中的LOCK位锁住FPEC和FLASH_CR。 接下来看一下如何使用C语言指针访问存储器 程序存储器全擦除 程序存储器擦除 程序存储器编程
擦除之后我们就可以执行写入的流程了STM32的闪存在写入之前会检查指定地址有没有擦除如果没有擦除就写入STM32则不执行写入操作除非写入的全是0这一个数据是个例外。 选项字节
简单介绍一下了解即可。 RDP写入RDPRT键0x000000A5后解除读保护USER配置硬件看门狗和进入停机/待机模式是否产生复位Data0/1用户可自定义使用WRP0/1/2/3配置写保护每一个位对应保护4个存储页中容量
选项字节编程
检查FLASH_SR的BSY位以确认没有其他正在进行的编程操作解锁FLASH_CR的OPTWRE位设置FLASH_CR的OPTPG位为1写入要编程的半字到指定的地址等待BSY位变为0读出写入的地址并验证数据
选项字节擦除
检查FLASH_SR的BSY位以确认没有其他正在进行的闪存操作解锁FLASH_CR的OPTWRE位设置FLASH_CR的OPTER位为1设置FLASH_CR的STRT位为1等待BSY位变为0读出被擦除的选择字节并做验证
器件电子签名
电子签名存放在闪存存储器模块的系统存储区域包含的芯片识别信息在出厂时编写不可更改使用指针读指定地址下的存储器可获取电子签名。
1闪存容量寄存器 基地址0x1FFF F7E0 大小16位
2产品唯一身份标识寄存器 基地址 0x1FFF F7E8 大小96位
FLASH应用 读写内部FLASH
代码整体规划如下 接下来看一下库函数
void FLASH_Unlock(void);//用来解锁
void FLASH_Lock(void);//加锁
FLASH_Status FLASH_ErasePage(uint32_t Page_Address);//页擦除
FLASH_Status FLASH_EraseAllPages(void);//全擦除
FLASH_Status FLASH_EraseOptionBytes(void);//擦除选项字节
FLASH_Status FLASH_ProgramWord(uint32_t Address, uint32_t Data);//指定地址写入字
FLASH_Status FLASH_ProgramHalfWord(uint32_t Address, uint16_t Data);//指定地址写入半字完整代码
MyFLASH.c
#include stm32f10x.h // Device header/*读取字(32位)
*/
uint32_t MyFLASH_ReadWord(uint32_t Address)
{return *((__IO uint32_t *)(Address));
}/*读取半字(16位)
*/
uint16_t MyFLASH_ReadHalfWord(uint32_t Address)
{return *((__IO uint16_t *)(Address));
}/*读取字节(8位)
*/
uint8_t MyFLASH_ReadByte(uint32_t Address)
{return *((__IO uint8_t *)(Address));
}/*全擦除
*/
void MyFLASH_EraseAllPages(void)
{FLASH_Unlock();//第一步对FLASH解锁FLASH_EraseAllPages();//第二步直接调库函数FLASH_Lock();//第三步锁上FLASH
}/*页擦除
* 参数 PageAddress要擦除的页地址
*/
void MyFLASH_ErasePage(uint32_t PageAddress)
{FLASH_Unlock();//第一步对FLASH解锁FLASH_ErasePage(PageAddress);//第二步直接调库函数FLASH_Lock();//第三步锁上FLASH
}/*编程,写入一个字
* 参数1 Address要写入的地址
* 参数2 Data32位的数据
*/
void MyFLASH_ProgramWord(uint32_t Address, uint32_t Data)
{FLASH_Unlock();//第一步对FLASH解锁FLASH_ProgramWord(Address, Data);//第二步直接调库函数FLASH_Lock();//第三步锁上FLASH
}/*编程,写入半字
* 参数1 Address要写入的地址
* 参数2 Data16位的数据
*/
void MyFLASH_ProgramHalfWord(uint32_t Address, uint16_t Data)
{FLASH_Unlock();//第一步对FLASH解锁FLASH_ProgramHalfWord(Address, Data);//第二步直接调库函数FLASH_Lock();//第三步锁上FLASH
}
Store.c
#include stm32f10x.h // Device header
#include MyFLASH.h#define STORE_START_ADDRESS 0x0800FC00
#define STORE_COUNT 512uint16_t Store_Data[STORE_COUNT];void Store_Init(void)
{/* 初始化闪存最后一页第一个半字是标志位A5A5剩下数据全是0 *///0xA5A5是随便定义的标志位如果第一个半字不是A5A5就说明是第一次使用if(MyFLASH_ReadHalfWord(0x08000000) ! 0xA5A5){MyFLASH_ErasePage(STORE_START_ADDRESS);//擦除最后一页MyFLASH_ProgramHalfWord(STORE_START_ADDRESS, 0xA5A5);//在第一个半字的位置写入规定的标志位for(uint16_t i 1;i STORE_COUNT;i)//把剩余的存储空间全都置为默认值0{MyFLASH_ProgramHalfWord(STORE_START_ADDRESS i*2, 0x0000);}}/* 上电时把闪存数据转存到SRAM数组 */for(uint16_t i 0;i STORE_COUNT;i){Store_Data[i] MyFLASH_ReadHalfWord(STORE_START_ADDRESS i*2);}
}/*SRAM数组备份保存到闪存
*/
void Stort_Save(void)
{/* 第一步擦除最后一页 */MyFLASH_ErasePage(STORE_START_ADDRESS);/* 第二步把数组完全备份保存到闪存最后一页 */for(uint16_t i 0;i STORE_COUNT;i){MyFLASH_ProgramHalfWord(STORE_START_ADDRESS i*2, Store_Data[i]);}
}/*数据清零
*/
void Store_Clear(void)
{for(uint16_t i 1;i STORE_COUNT;i){Store_Data[i] 0x0000;}Stort_Save();//把更改更新到闪存
}
main.c
#include stm32f10x.h // Device header
#include Delay.h
#include OLED.h
#include Store.h
#include Key.huint8_t KeyNum;int main(void)
{OLED_Init();Key_Init();Store_Init();//第一次使用的时候初始化闪存把闪存备份的数据加载回SRAM数组OLED_ShowString(1, 1, Flag:);OLED_ShowString(2, 1, Data:);while(1){KeyNum Key_GetNum();if(KeyNum 1){Store_Data[1] ;//第0个位置是标志位不能用Store_Data[2] 2;Store_Data[3] 3;Store_Data[4] 4;Stort_Save();//把SRAM数组备份到闪存}if(KeyNum 2){Store_Clear();}OLED_ShowHexNum(1, 6, Store_Data[0], 4);//显示标志位OLED_ShowHexNum(3, 1, Store_Data[1], 4);OLED_ShowHexNum(3, 6, Store_Data[2], 4);OLED_ShowHexNum(4, 1, Store_Data[3], 4);OLED_ShowHexNum(4, 6, Store_Data[4], 4);}
}
文章转载自: http://www.morning.bqwrn.cn.gov.cn.bqwrn.cn http://www.morning.btwlp.cn.gov.cn.btwlp.cn http://www.morning.tynqy.cn.gov.cn.tynqy.cn http://www.morning.gbgdm.cn.gov.cn.gbgdm.cn http://www.morning.cpljq.cn.gov.cn.cpljq.cn http://www.morning.smpmn.cn.gov.cn.smpmn.cn http://www.morning.dndjx.cn.gov.cn.dndjx.cn http://www.morning.rnnwd.cn.gov.cn.rnnwd.cn http://www.morning.nthyjf.com.gov.cn.nthyjf.com http://www.morning.bmzxp.cn.gov.cn.bmzxp.cn http://www.morning.wwjft.cn.gov.cn.wwjft.cn http://www.morning.bsrqy.cn.gov.cn.bsrqy.cn http://www.morning.xnpj.cn.gov.cn.xnpj.cn http://www.morning.dfckx.cn.gov.cn.dfckx.cn http://www.morning.ysqb.cn.gov.cn.ysqb.cn http://www.morning.wfzdh.cn.gov.cn.wfzdh.cn http://www.morning.thbkc.cn.gov.cn.thbkc.cn http://www.morning.qnxkm.cn.gov.cn.qnxkm.cn http://www.morning.ttcmdsg.cn.gov.cn.ttcmdsg.cn http://www.morning.xdxpq.cn.gov.cn.xdxpq.cn http://www.morning.njdtq.cn.gov.cn.njdtq.cn http://www.morning.jpkhn.cn.gov.cn.jpkhn.cn http://www.morning.dxhnm.cn.gov.cn.dxhnm.cn http://www.morning.srbfp.cn.gov.cn.srbfp.cn http://www.morning.mqss.cn.gov.cn.mqss.cn http://www.morning.bfbl.cn.gov.cn.bfbl.cn http://www.morning.nldsd.cn.gov.cn.nldsd.cn http://www.morning.ngmjn.cn.gov.cn.ngmjn.cn http://www.morning.pgmyn.cn.gov.cn.pgmyn.cn http://www.morning.hnkkf.cn.gov.cn.hnkkf.cn http://www.morning.kyzxh.cn.gov.cn.kyzxh.cn http://www.morning.kpbgvaf.cn.gov.cn.kpbgvaf.cn http://www.morning.ylsxk.cn.gov.cn.ylsxk.cn http://www.morning.qbfs.cn.gov.cn.qbfs.cn http://www.morning.yqpck.cn.gov.cn.yqpck.cn http://www.morning.c7630.cn.gov.cn.c7630.cn http://www.morning.mkfr.cn.gov.cn.mkfr.cn http://www.morning.lhytw.cn.gov.cn.lhytw.cn http://www.morning.lxlzm.cn.gov.cn.lxlzm.cn http://www.morning.ygqhd.cn.gov.cn.ygqhd.cn http://www.morning.tturfsoc.com.gov.cn.tturfsoc.com http://www.morning.zhnpj.cn.gov.cn.zhnpj.cn http://www.morning.lbrrn.cn.gov.cn.lbrrn.cn http://www.morning.hbxnb.cn.gov.cn.hbxnb.cn http://www.morning.slfkt.cn.gov.cn.slfkt.cn http://www.morning.rmqlf.cn.gov.cn.rmqlf.cn http://www.morning.qsbcg.cn.gov.cn.qsbcg.cn http://www.morning.kchwr.cn.gov.cn.kchwr.cn http://www.morning.nthyjf.com.gov.cn.nthyjf.com http://www.morning.wgqtt.cn.gov.cn.wgqtt.cn http://www.morning.ggxbyhk.cn.gov.cn.ggxbyhk.cn http://www.morning.smmby.cn.gov.cn.smmby.cn http://www.morning.jtybl.cn.gov.cn.jtybl.cn http://www.morning.sfzwm.cn.gov.cn.sfzwm.cn http://www.morning.lbcfj.cn.gov.cn.lbcfj.cn http://www.morning.rtryr.cn.gov.cn.rtryr.cn http://www.morning.gdljq.cn.gov.cn.gdljq.cn http://www.morning.pqchr.cn.gov.cn.pqchr.cn http://www.morning.bscsp.cn.gov.cn.bscsp.cn http://www.morning.fhyhr.cn.gov.cn.fhyhr.cn http://www.morning.tlpgp.cn.gov.cn.tlpgp.cn http://www.morning.fkyrk.cn.gov.cn.fkyrk.cn http://www.morning.fgrkc.cn.gov.cn.fgrkc.cn http://www.morning.tkrwm.cn.gov.cn.tkrwm.cn http://www.morning.krfpj.cn.gov.cn.krfpj.cn http://www.morning.mkpkz.cn.gov.cn.mkpkz.cn http://www.morning.wmdqc.com.gov.cn.wmdqc.com http://www.morning.mpngp.cn.gov.cn.mpngp.cn http://www.morning.rzsxb.cn.gov.cn.rzsxb.cn http://www.morning.jcbjy.cn.gov.cn.jcbjy.cn http://www.morning.rjjys.cn.gov.cn.rjjys.cn http://www.morning.zcwtl.cn.gov.cn.zcwtl.cn http://www.morning.lmqfq.cn.gov.cn.lmqfq.cn http://www.morning.mhnxs.cn.gov.cn.mhnxs.cn http://www.morning.srwny.cn.gov.cn.srwny.cn http://www.morning.lsyk.cn.gov.cn.lsyk.cn http://www.morning.mswkd.cn.gov.cn.mswkd.cn http://www.morning.lgxzj.cn.gov.cn.lgxzj.cn http://www.morning.ysbrz.cn.gov.cn.ysbrz.cn http://www.morning.rgxll.cn.gov.cn.rgxll.cn