当前位置: 首页 > news >正文

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 外的分区,所以,就需要这个接口。

http://www.jsqmd.com/news/1249519/

相关文章:

  • DSP/BIOS内存优化实战:模块化裁剪与配置策略详解
  • 专科生论文写作AI工具对比:千笔与Checkjie实测分析
  • FlexRay通信控制器中断寄存器配置与应用实战指南
  • 全球首创!Seedacn2.5首款支持专业3D工作流的AI视频工具 - 企业新闻快传
  • 开放式耳机我们应该怎么选?2026年公认值得选购的开放式耳机推荐
  • 天津离婚律所怎么选?看懂大额财产、抚养权、出轨维权、简易家事的适配方案 - 商讯
  • CNN-LSTM-Attention混合模型在电力负荷预测中的实践
  • Hercules微控制器ECC安全机制:从原理到实战的嵌入式数据保护
  • 2026年广州及全国涂料回收服务挑选攻略 康凯再生资源等企业服务盘点 - 浩了个浩
  • GPT-5.6常见问题排查:API调用错误、参数配置与解决方案
  • Codex免手机验证登录【精简教程】
  • 计算机毕业设计之在线选课系统
  • 2026成都金牛区管道疏通避坑指南:邻里帮真实测评 - 余生黄金回收
  • 2026 最新常州金条首饰回收实测,合扬覆盖五大辖区 55 家门店结算快捷 - 生活商业速报
  • 品牌提及监控全指南:Reddit与X最佳实践与工具解析
  • 泛程序新手入门超轻松!不用背规则直接上手
  • 【Rust自学】12.8. 将错误信息写入到标准错误
  • 技术落地复盘:物联网智能锁如何解决网约房民宿合规安防与高运维成本痛点
  • 视频下载神器,现在新的版本支持3000多平台,非常好用,推荐给大家
  • 亨得利服务项目及价格查询|维修地址与服务电话权威信息通告(2026年7月更新) - 亨得利官方
  • LLM Agent工具链:从基础到高级开发实践
  • 【JAVA毕设源码分享】基于springboot大学生就业招聘系统的设计与实现(程序+文档+代码讲解+一条龙定制)
  • 中国叠层母线排市场运行数据分析及未来需求预测报告2026年版
  • V100 32G 全参数训练完整说明
  • 2026年成都双流汽车贴膜综合实力榜:追光车膜成都旗舰店为什么被众多车主推荐 - zhouzhou12321
  • 试了一下 qData 开源版:更像是给数据中台做一次“低成本试跑”
  • 【Rust自学】12.7. 使用环境变量
  • 【Rust自学】2.2. 猜数游戏Pt.2 生成随机数
  • 非接触式激光雪深监测站,气象积雪观测新方案
  • 【爱马仕】新手友好|Hermes Agent 轻量化部署方案,轻松搭建桌面数字助手(含安装包)