您的位置首页  散文小品

erase app data是什么意思(erase flash是什么意思)全程干货

MCU Flash 采用 32 位数据总线读写,充分利用 32 位 ARM CPU 性能优势,同时它的 512 字节小扇区结构,管理操作也更加灵

erase app data是什么意思(erase flash是什么意思)全程干货

 

学习笔记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

免责声明:本站所有信息均搜集自互联网,并不代表本站观点,本站不对其真实合法性负责。如有信息侵犯了您的权益,请告知,本站将立刻处理。联系QQ:1640731186