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

华大flash EFM使用(一)

1,嵌入式 Flash 具有三个主接口:
· 64 ITCM 接口:
该接口连接 Cortex-M7 ITCM 总线,用于指令执行以及数据读访问。
– ITCM 接口不支持写访问。
支持 64 个标准化缓存行, 256 位宽( ART 加速器)。
· 64 AHB 接口:
该接口通过 AHB 总线矩阵连接 Cortex-M7 AXI 总线,用于代码执行以及读写
访问。
无论寻址的 Flash 接口是 TCM 还是 AHBFlash 上的 DMA 和外设 DMA 数据传输
均通过 AHB 接口完成。
· 32 AHB 寄存器接口:
用于访问控制寄存器和状态寄存器。 

 2,Flash 中断
如果将 FLASH_CR 寄存器中的操作结束中断使能位 (EOPIE) 1,则在擦除或编程操作结
束时,即 FLASH_SR 寄存器中的繁忙位 (BSY) 清零(操作成功完成或未成功完成)时,将
产生中断。此时, FLASH_SR 寄存器中的操作结束 (EOP) 位置 1
如果在请求编程、擦除或读操作期间出现错误,则 FLASH_SR 寄存器中的以下错误标志位之
一将置 1
· PGAERRPGPERRERSERR(编程错误标志)
· WRPERR(保护错误标志)
这种情况下, FLASH_CR 寄存器中的错误中断使能位 (ERRIE) 1,并且如果 FLASH_SR
寄存器中的操作错误位 (OPERR) 1,则将产生一个中断。

3,FLASH 具有以下主要特性:
容量高达 2Mbytes,由两块 1Mbytes 的 FLASH 构成,共 256 个扇区,每个扇区为
8Kbytes。 块 0 中扇区 0~扇区 15 为可配置为 OTP 区域。
OTP(One Time Program)区域共 134KBytes, 其中 128Kbytes 配置在块 0 地址
0x0000_0000~0x0001_FFFF, 6Kbytes 配置在地址 0x0300_0000~0x0300_17FF。地址
0x0300_1800~0x0300_1AD7 为 OTP 数据锁存区。
 128 位宽数据读取,读缓存 128 位宽缓冲,加速代码执行。
编程单位为 4bytes,擦除单位为 8Kbytes。

 4,flash编程常用接口举例读写说明:
单次编程无回读功能
单编程无回读模式设定步骤如下:
1) 解除 FLASH 的寄存器写保护。 (EFM_FAPRT 先写 0x0123, 再写 0x3210)
2) 解除 EFM_KEY1 锁定。 (EFM_KEY1 先写 0x01234567, 再写 0xFEDCBA98)
3) 设定单次编程模式。 (EFM_FWMC.PEMODE[2:0]=001)
4) 解除写保护。 (EFM_ F0/1NWPRTx(x=0~3)对应位设定为 1)
5) 对编程地址写入 32 位数据
6) 等待 FLASH 处于空闲状态。 (EFM_FSR.RDY0/1=1)
7) 判断编程自读取结果标志位。 (EFM_FSR.MISMTCH0/1)
如为 0,则表示编程成功;为 1 表示该 FLASH 地址已遭破坏,永久废弃。
8) 清除编程结束标志位。 (EFM_FSR.OPTEND0/1)
对 已 锁 存 的 OTP 地 址 发 行 单 编 程 回 读 写 操 作 , 编 程 不 成 功 , 标 志 位
EFM_FSR.OTPWERR0 置位。

a,解除 FLASH 的寄存器写保护

__STATIC_INLINE void EFM_REG_Lock(void);

 b,解除 EFM_KEY1 锁定

void EFM_FWMC_Cmd(en_functional_state_t enNewState)
{
    DDL_ASSERT(IS_FUNCTIONAL_STATE(enNewState));

    if (ENABLE == enNewState) {
        WRITE_REG32(CM_EFM->KEY1, 0x01234567UL);
        WRITE_REG32(CM_EFM->KEY1, 0xFEDCBA98UL);
    } else {
        SET_REG32_BIT(CM_EFM->FWMC, EFM_FWMC_KEY1LOCK);
    }
}

调用:EFM_FWMC_Cmd(ENABLE);

c,解除写保护

void EFM_SequenceSectorOperateCmd(uint32_t u32StartSectorNum, uint16_t u16Count, en_functional_state_t enNewState)

解除从u32StartSectorNum开始的u16Count个sector的写保护锁。

调用:EFM_SequenceSectorOperateCmd(0, 256U, ENABLE);

也有单个的解保护锁:

void EFM_SingleSectorOperateCmd(uint8_t u8SectorNum, en_functional_state_t enNewState) 

d,单个数据的写入

int32_t EFM_SingleProgram(uint32_t u32Addr, uint32_t u32Data)

批量数据的写入:

int32_t EFM_Program(uint32_t u32Addr, uint8_t *pu8Buf, uint32_t u32Len)

int32_t EFM_SequenceProgram(uint32_t  u32Addr,  uint32_t  u32Len,   const uint32_t *  pu32Buf)

e,写完后带回读校验,看返回值推测校验结果

不带校验的读:

int32_t EFM_ReadByte(uint32_t u32Addr, uint8_t *pu8ReadBuf, uint32_t u32ByteLen)

待校验的读:

int32_t EFM_ProgramWordReadBack(uint32_t u32Addr, uint32_t u32Data)

 f, 等待 FLASH 处于空闲状态

#define SET 1 

do {
        flag1 = EFM_GetStatus(EFM_FLAG_RDY);
        flag2 = EFM_GetStatus(EFM_FLAG_RDY1);
    } while ((SET != flag1) || (SET != flag2));

g, 清除编程结束标志位

EFM_SequenceSectorOperateCmd(0, 256U, DISABLE);

EFM_FWMC_Cmd(DISABLE);

__STATIC_INLINE void EFM_REG_UNLock(void);

 单编程回读功能:判断编程自读取结果标志位。 (EFM_FSR.MISMTCH0/1)
如为 0,则表示编程成功;为 1 表示该 FLASH 地址已遭破坏,永久废弃

5,擦除功能
对 FLASH 进行扇区擦除操作后,该扇区内地址(8KBytes 空间)数据刷新为全 1。扇区擦
除操作设定步骤如下:
1) 解除 FLASH 的寄存器写保护(EFM_FAPRT 先写 0x0123, 再写 0x3210)。
2) 解除 EFM_KEY1 锁定。 (EFM_KEY1 先写 0x01234567, 再写 0xFEDCBA98)
3) 设定擦除模式(EFM_FWMC.PEMOD[2:0]=100)。
4) 解除写保护。 (EFM_ F0/1NWPRTx(x=0~3)对应位设定为 1)
5) 对需要擦除扇区内的任意地址(地址需以 4 对齐)写入 32 位任意值。
6) 等待 FLASH 处于空闲状态。 (EFM_FSR.RDY0/1=1)
7) 清除擦除结束标志位。 (EFM_FSR.OPTEND0/1)
对已锁存的 OTP 地址发行擦除操作,擦除不成功, OTP 区域数据保留,标志位
EFM_FSR.OTPWERR0 置位。

获取块的基地址:
#define SECTOR_SIZE (0x2000UL)
#define SECTOR_ADDR(X)  (uint32_t)(SECTOR_SIZE *(x))

en_result_t EFM_SectorErase(uint32_t u32Addr);

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 《重温JavaScript五子棋小游戏》
  • ArcGIS热点分析 (Getis-Ord Gi*)——基于地级市尺度的七普人口普查数据的热点与冷点分析
  • Leetcode-day28-贪心算法
  • 打印样式的艺术:用CSS @media 规则优化页面输出
  • 网络udp及ipc内存共享
  • FPGA工程师成长路线(持续更新ing,欢迎补充)
  • Python3.11二进制AI项目程序打包为苹果Mac App(DMG)-应用程序pyinstaller制作流程(AppleSilicon)
  • 从PDF到图片:四款工具助你玩转文档转换!
  • [云计算] 虚拟化笔记
  • 【数据结构3】哈希表、哈希表的应用(集合与字典、md5算法和文件的哈希值)
  • MyBatis框架搭建与代码解读
  • 分形比特币(Fractal Bitcoin)
  • 基于Open Cv的数字图像手势识别系统,Python编程实现,可以识别以下6种手势,含代码和报告
  • Excel 中找出每列第一个和最后一个非空格对应的行--Excel难题#87
  • MySQL中处理JSON数据:大数据分析的新方向
  • [Vue CLI 3] 配置解析之 css.extract
  • 【从零开始安装kubernetes-1.7.3】2.flannel、docker以及Harbor的配置以及作用
  • 345-反转字符串中的元音字母
  • Angular js 常用指令ng-if、ng-class、ng-option、ng-value、ng-click是如何使用的?
  • CentOS7简单部署NFS
  • CentOS学习笔记 - 12. Nginx搭建Centos7.5远程repo
  • CSS3 聊天气泡框以及 inherit、currentColor 关键字
  • in typeof instanceof ===这些运算符有什么作用
  • Laravel Telescope:优雅的应用调试工具
  • Python3爬取英雄联盟英雄皮肤大图
  • SwizzleMethod 黑魔法
  • 干货 | 以太坊Mist负责人教你建立无服务器应用
  • 基于 Ueditor 的现代化编辑器 Neditor 1.5.4 发布
  • 吐槽Javascript系列二:数组中的splice和slice方法
  • 终端用户监控:真实用户监控还是模拟监控?
  • 走向全栈之MongoDB的使用
  • MiKTeX could not find the script engine ‘perl.exe‘ which is required to execute ‘latexmk‘.
  • 【干货分享】dos命令大全
  • Redis4.x新特性 -- 萌萌的MEMORY DOCTOR
  • ​​​【收录 Hello 算法】10.4 哈希优化策略
  • ‌U盘闪一下就没了?‌如何有效恢复数据
  • (1)(1.11) SiK Radio v2(一)
  • (14)学习笔记:动手深度学习(Pytorch神经网络基础)
  • (4)通过调用hadoop的java api实现本地文件上传到hadoop文件系统上
  • (AngularJS)Angular 控制器之间通信初探
  • (Charles)如何抓取手机http的报文
  • (day6) 319. 灯泡开关
  • (ZT) 理解系统底层的概念是多么重要(by趋势科技邹飞)
  • (板子)A* astar算法,AcWing第k短路+八数码 带注释
  • (补)B+树一些思想
  • (附源码)springboot家庭装修管理系统 毕业设计 613205
  • (过滤器)Filter和(监听器)listener
  • (每日一问)设计模式:设计模式的原则与分类——如何提升代码质量?
  • (全部习题答案)研究生英语读写教程基础级教师用书PDF|| 研究生英语读写教程提高级教师用书PDF
  • (三分钟了解debug)SLAM研究方向-Debug总结
  • (转)nsfocus-绿盟科技笔试题目
  • ***原理与防范
  • *setTimeout实现text输入在用户停顿时才调用事件!*
  • . Flume面试题
  • .net core webapi 部署iis_一键部署VS插件:让.NET开发者更幸福