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_addrFLASH_DATA_START_ADDR;//做个判断防止数据越界if(sizeFLASH_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_addrFLASH_DATA_START_ADDRtype*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(-1DataCheck(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_addrFLASH_DATA_START_ADDR;uint8_t*pSrc;//计算读取的地址地址的计算要与写的同步program_addrFLASH_DATA_START_ADDRtype*FLASH_SECTOR_SIZE;pSrc(uint8_t*)(program_addr);if(sizeFLASH_PAGE_SIZE){printf(%s size %d over limit \n,__func__,size);return-1;}else{memcpy(buf,pSrc,size);}return0;}总结这个就是flash的简单使用主要是POS机中一些出厂数据硬件版本、序列号等需要固化在 app 外的分区同时在POS机安装时一些信息也需要固化在 app 外的分区所以就需要这个接口。