MCU FLASH读写的简单分析
文章目录
- 前言
- 一、flash数据手册
- 二、自定义FLASH API简介
- 1.初始化
- 2.写数据
- 读数据
- 总结
前言
使用MH2101的芯片,flash是内置在MCU里面的,所以是操控MCU的寄存器进行擦除、读、写操作。
注意:flash需要先擦除才可以写,不能覆盖写
一、flash数据手册
使用MH2101的这个数据手册没有太大的意义,这个flash的读写初始化操作应该是被封装在ROM里了,具体见如下
所以,只能使用IC供应商的API
二、自定义FLASH API简介
1.初始化使用与DEMO一致
2.写接口:因为flash的需要先擦除后写入,擦除都是以页为单位因此,数据存储单位也只能以页为单位。
如果flash容量不够,再将多个数据合并到一页,对某个数据进行操作时,需要先读取该数据所在的整页,再对该个数据进行修改,再将该数据的页进行擦除,最后将修改好的页写入。
3.读接口:直接传地址,同写一样,以页为单位。
如果flash容量不够,地址也是随写一样。
1.初始化
这部分的初始化与DEMO保持一致,如果需要修改,再去看
intem_flash_init(){QSPI_Init(NULL);SYSCTRL_PLLConfig(SYSCTRL_PLL_192MHz);SYSCTRL_PLLDivConfig(SYSCTRL_PLL_Div_None);SYSCTRL_HCLKConfig(SYSCTRL_HCLK_Div2);SYSCTRL_PCLKConfig(SYSCTRL_PCLK_Div2);QSPI_SetLatency(0);SYSCTRL_AHBPeriphClockCmd(SYSCTRL_AHBPeriph_DMA,ENABLE);SYSCTRL_AHBPeriphResetCmd(SYSCTRL_AHBPeriph_DMA,ENABLE);return0;}2.写数据
intem_flash_write(inttype,uint8_t*buf,intsize){//FLASH_PAGE_SIZE大小为0x100,不够就扩展到0x1000(一页大小)uint32_twrite_Buf[FLASH_PAGE_SIZE/4]={0};//FLASH_DATA_START_ADDR为存储数据的起始地址uint32_tprogram_addr=FLASH_DATA_START_ADDR;//做个判断,防止数据越界if(size>FLASH_PAGE_SIZE){printf("%s size = %d over limit \n",__func__,size);return-1;}else{printf("%s size = %d memcpy \n",__func__,size);memcpy(write_Buf,buf,size);}/* * 计算写入的地址 * type 是 数据类型为0~13 * FLASH_SECTOR_SIZE是一页的大小(0x1000) */program_addr=FLASH_DATA_START_ADDR+type*FLASH_SECTOR_SIZE;//一次擦除一页数据FLASH_EraseSector(program_addr);//擦除检查EraseCheck(program_addr,1);printf("%s will write 1\n",__func__);//写入数据,FLASH_ProgramPage是MH提供的flash写APIFLASH_ProgramPage(program_addr,sizeof(write_Buf),(uint8_t*)(write_Buf));printf("%s will write 2\n",__func__);CACHE_CleanAll(CACHE);printf("%s will check 3\n",__func__);//DataCheck这个是检测是否写入成功(使用memcmp去对地址上的数据进行检测)if(-1==DataCheck(write_Buf,(uint8_t*)(program_addr),sizeof(write_Buf))){printf("Addr %#x data[Cache] check error!\n",program_addr);}else{printf("Addr %#x data[Cache] check succeed !\n",program_addr);}printf("%s type = %d flash write succeed \n",__func__,type);return0;}读数据
intem_flash_read(inttype,uint8_t*buf,intsize){uint32_tprogram_addr=FLASH_DATA_START_ADDR;uint8_t*pSrc;//计算读取的地址,地址的计算要与写的同步program_addr=FLASH_DATA_START_ADDR+type*FLASH_SECTOR_SIZE;pSrc=(uint8_t*)(program_addr);if(size>FLASH_PAGE_SIZE){printf("%s size = %d over limit \n",__func__,size);return-1;}else{memcpy(buf,pSrc,size);}return0;}总结
这个就是flash的简单使用,主要是POS机中一些出厂数据(硬件版本、序列号等)需要固化在 app 外的分区,同时,在POS机安装时,一些信息也需要固化在 app 外的分区,所以,就需要这个接口。
