erase app data是什么意思(erase flash是什么意思)全程干货
MCU Flash 采用 32 位数据总线读写,充分利用 32 位 ARM CPU 性能优势,同时它的 512 字节小扇区结构,管理操作也更加灵
学习笔记1、FLASH存储器简介ME32F030采用高可靠的嵌入式Flash 技术,64K用户区间,支持 IAP/ISP Flash 擦写技术MCU Flash 采用 32 位数据总线读写,充分利用 32 位 ARM CPU 性能优势,同时它的 512 字节小扇区结构,管理操作也更加灵活。
Flash 存储器支持的操作如下: 读操作:ARM CPU 可以通过读指令直接从嵌入式 Flash 读取数据,最高支持达 30MHz 的读取速度当 CPU 时钟超过 Flash 的最大读取速度时,需要插入延迟时钟,延迟时钟由 RDCYC 寄存器控制。
FLASH 擦写操作:Flash 擦写采用扇区擦除,字(WORD)写入模式,并通过一寄存器组实现擦写地址必须是 32 位对齐擦除扇区流程如下:①、向地址寄存器写入要操作的FLASH地址②、发FLASH扇区擦除指令0x04。
③、判断FLASH是否处于忙状态,不处于忙状态则流程结束字(WORD)编程的流程如下:①、向地址寄存器写入要操作的FLASH地址②、向数据寄存器写入要编程的数据③、发FLASH扇区擦除指令0x02④、判断FLASH是否处于忙状态,不处于忙状态则流程结束。
这里要注意的是如果要编程数据,一定要先进行擦除步骤,然后再向FLASH进行编程操作。否则直接执行编程流程是无效的。2、FLASH寄存器ME32F030的FLASH造作十分简便。相对应的寄存器也较少。
图1 FLASH寄存器列表2-1 FLASH操作命令寄存器该寄存器用来发 Flash 操作命令和读 Flash 状态。
图2 FLASH操作命令寄存器2-2 FLASH操作编程数据寄存器该寄存器用于存储对 Flash 编程的数据,这里有一点需要注意的要求,就是该数据必须在 Flash 操作命令发出之前准备好并且编写的数据是32位对齐的。
图3 FALSH操作编程数据寄存器2-3 FLASH操作地址寄存器该寄存器存储 Flash 操作地址。
图4 FALSH操作地址寄存器2-4 FLASH访问周期寄存器根据系统时钟频率不同,Flash 访问速度可以配置 FLASH_RDCYC 寄存器来实现(该功能目前禁止使用) 3、FLASH操作函数3-1 FLASH擦除函数。
该函数用于擦除指定地址段所在扇区的FLASH数据,从起始地址startaddr所在扇区开始擦除,直到结束地址endaddr所在扇区void EraseMCUDataMemory(uint32_t startaddr, uint32_t endaddr) { //判断是否到达结束地址 while(startaddrADDR = startaddr; //FLASH擦除指令 FMC->CMD = 0x04; //等待FLASH完成操作 while ((FMC->CMD & 0x100)!=0); //地址偏移,开始下个地址的擦除 startaddr+=512; } }。
3-2 FLASH数据编程这个函数用于向指定的地址,写入指定长度的数据Dataadd:要写入的地址 Size:要写入的数据长度 Suradd:要写入的数据内容 void SaveDatatoMCU(uint32_t dataadd, uint32_t size, uint32_t suradd) { uint32_t n,temp0,temp1,temp2,*dataptr; temp1=size>>2; temp2=dataadd; dataptr=(uint32_t *)suradd; for (n=0;nADDR = temp2; //写入编程数据 FMC->DATA = *dataptr++; //FLASH编程指令 FMC->CMD = 0x02; //等待FLASH完成操作 while ((FMC->CMD & 0x100)!=0); //地址偏移,开始下个地址的编程 temp2 +=4; } }。
3-3 FLASH读取数据这个函数用于从指定的地址,读出指定长度的数据Dataadd:要读取的地址 Size:要读取的数据长度 Suradd:要读取的数据内容 void ReadDataFromMCU(uint32_t dataadd, uint32_t size, uint32_t* suradd) { uint32_t n,temp1,*dataptr; uint32_t a = 0; temp1=size>>2; dataptr=(uint32_t *)suradd; for (n=0;n
4、FLASH例程接下来做个小实验来测试下FLASH的擦写和数据编程,我们向0x0000FC80地址写入一组数据,随后读出校验是否正确编程FLASHint main(void) { uint32_t WriteData[4] = {0x12121212,0x34343434,0x56565656,0x78787878}; uint32_t ReadData[4] = {0x00000000,0x00000000,0x00000000,0x00000000}; uint32_t DataAddr = 0x0000FC80; uint32_t EndAddr = 0x0000FFFF; WDT->MOD=0; PB_9_INIT(PB_9_GPIO); GPIO_ConfigPinsAsOutput(PB, IO_PIN9); //擦除FLASH EraseMCUDataMemory(DataAddr,EndAddr); //向Data Addr写入数据WriteData SaveDatatoMCU(DataAddr, 16, WriteData); //读出的数据存放到ReadData ReadDataFromMCU(DataAddr, 16, ReadData); while (1) { PB->NOT_b.NOT9=1;//小灯闪烁,提示程序运行 SYS_DelaymS(500); } }。
程序编译无误后,便可以下载仿真测试。首先在如图所示的位置打上断点,然后全速运行。
图5 实例运行1运行到断点处后,我们把WriteData和ReadData添加的WATCH1中观察下,结果如图所示,此时ReadData的数据全部都是0x000000000,与写入的数据不一致,这是因为还没有开始从FLASH中读取。
接下来按快捷键F10单步执行下读取FLASH函数
图6 实例运行2单步执行后的效果如图所示,这时候数据已经从FLASH中读取出来并存放到ReadData中,此时的数据已经和写入的WriteData一致了。
图7 实例运行3
- 标签:
- 编辑:李松一
- 相关文章
-
三星s4root(三星s4如何恢复出厂设置)速看
一条纯文字短信,足以将三星S5和S4手机恢复出厂设置,很可能连着用户数据也一起冲走了。而且,因为该攻击利用了安卓系统漏洞,其他厂商也…
-
包包阿紫近况(包包与阿紫现状)学到了吗
(点击可查看详情......)
- 包包阿紫近况(包包与阿紫现状)干货满满
- 南湖职校熊姐(南湖职校熊姐群架)速看
- 聚美优品怎么进不去(聚美优品化妆品)这样也行?
- 聚美优品怎么进不去(聚美优品化妆品)怎么可以错过
- sk trip(sktrip冲锋衣价格)速看