【原创】i.MXRT J-Flash烧写算法使能eFuse熔丝位写入
临近年底,终于又憋了一篇文章出来,本来年初的时候是有计划把去年总结的一些东西整理下发布出来的,结果还是被工作和生活上各种琐事给耽搁了。哎,今年刚过了自己35岁的生日,眼瞅着这个人生节点过来了,未来该如何走呢,目前还真没想好。回首这不到一年的时间,发生了好多大事情,年初悲痛的东航事件,尴尬的上海疫情封城,全国人民直播观看佩罗西访台,俄乌战争从年初打到现在还没完,到现在刚刚结束的二十大,一年的时间很短,短到等我意识到写第二篇博客时已经快要到年底了,一年时间又很长,长到这么一年的时间里会发生这么多的事情。哎,珍惜身边人,继续提升自己,然后迎接即将到来的2023(咳咳,还有俩月。。。)
好吧,前文还在各种感慨各种装x然后立刻切换到技术上来貌似有点生硬有点突兀,不过看我博客的人都习惯我唠叨了,不影响大家学习知识就好,哈哈。。。下文进入正题。
i.MXRT系列在Internal Boot模式下正常启动时,默认配置会在POR_B复位管脚上升沿的时刻从Boot CFG GPIO管脚获取到电平状态并装载到SRC_SBMR1寄存器,然后BOOT_ROM会以该寄存器的值来决定外部启动设备的类型和相关的启动配置,比如Flexspi接口启动还是SEMC接口启动还是SDHC启动,还有Flexspi是Norflash启动还是Nandflash启动,以及启动时的时钟频率和使用的哪组管脚配置,具体请查询i.MXRT RM手册SystemBoot章节(注意不同RT系列,它的BOOT_CFG对应的IO管脚可能是不一样的,下图是RT1060的)。
不过在实际应用中,有些系统设计对IO利用率要求较高,由于可用IO数量不够而使用到BOOT_CFG相关的IO管脚同时外部电路又没办法保证在刚上电时POR_B上升沿时刻这些管脚的电平状态是可控的,这种情况下如果继续使用Internal Boot模式下的默认配置则可能会由于启动配置装载的IO状态不是预期的进而导致MCU启动失败(可通过dump SRC_SBMR1寄存器看到BOOT_CFG信号不正常非预期)。针对这种情况,i.MXRT在Internal Boot模式下提供了从内部eFuse熔丝位获取启动配置的方式,即MCU上电复位后不再从BOOT_CFG IO管脚电平获取启动配置而是使用内部eFuse的配置,具体见RM手册SystemBoot章节如下图,当内部熔丝位BT_FUSE_SEL写成1之后(出厂默认为0),GPIO状态不再决定启动配置而是由eFuse熔丝内部的BOOT_CFG1和BOOT_CFG2位决定。
从上述解释说明我们知道了通过烧写内部eFuse熔丝位BT_FUSE_SEL和BOOT_CFG1和2可以决定RT的启动配置,那这两个熔丝位的位置具体在哪里以及如何写入。从RT的RM手册里Fusemap章节找到boot fusemap table如下,可以看到BOOT_CFG1和2位于eFuse地址0x450的[15:0]位,BT_FUSE_SEL位于地址0x460的bit4位,这些eFuse位出厂默认均为0,如果用户的外部Flash是我们平时最常用的QSPI Flash的话,则从下图eFuse位说明可以看到BOOT_CFG1和2位不需要再写入(保持0即可),我们只需要把BT_FUSE_SEL写1即可(注意eFuse只能从0写成1,而且只能写一次)。
本项目最新的Flash烧写算法新加入了对eFuse熔丝位的写入支持,一旦使能了该功能后,用户在给RT下载更新程序的同时也会写入eFuse,对用户来说是无感的,最大程度减少用户额外的操作,不过对eFuse的写入大家一定要谨慎,因为eFuse一旦从0写成1就无法再逆向回去了 (这也是叫做熔丝位的原因)。如下图,加入了eFuse的写入,不过默认是不生效的,用户如果想使能eFuse的烧写的话,需要打开BT_FUSE这个宏然后重新编译生成对应的elf文件,再参考我之前的一篇文章<All in One i.MXRT1050/RT1020 SPI Flash Algorithm for J-Flash>更新到J-Flash的支持里面去。
对于上述的eFuse写入代码,这里简单解释一下,由于eFuse是一块独立的物理存储空间不在CPU内部的4G可寻址空间范围内,要对其进行操作需要借助于OCOTP控制器,而eFuse的地址和OCOTP里的地址有个映射关系即eFuse address = OCOTP index * 0x10 + 0x400,所以上图中我们传入OCOTP的参数0x06对应的是eFuse空间中的0x460,也就是BT_FUSE_SEL熔丝位所在的物理空间地址。如果用户想要操作其他eFuse空间,则可以参考该代码中的API用法自行添加和修改,但是一定要注意对eFuse的操作是一次性的。
本文的最新代码和文档我已update到我的github仓库,欢迎下载和star。老话继续,本文首发ChinaAET,续发于CSDN和博客园,未完待续!
【原创】i.MXRT J-Flash烧写算法使能eFuse熔丝位写入的更多相关文章
- DM6446开发攻略:UBOOT-2009.03移植及nand flash烧写
有关DAVINCI U-BOOT的移植,以前写过一篇u-boot-1.3.4(2008年的),其实和这个u-boot-2009.03差别不大,只不过这个u-boot-2009.03是从TI的网站上下载 ...
- ADS 下 flash 烧写程序原理及结构
本原理:在 windows 环境下借助 ADS 仿真器将在 SDRAM 中的一段存储区域中的数据写到 Nand flash 存 储空间中.烧写程序在纵向上分三层完成: 第一层: 主烧写函数(完成将在 ...
- 【DM642学习笔记四】flash烧写过程——错误记录…
(欢迎批评指正) 一,打开.cdd配置文件时出错: 解决:在FlashBurn配置窗口中,Conversion Cmd一栏可不用管: 菜单Program—Download FBTC,load ...
- S03_CH11_基于TCP的QSPI Flash bin文件网络烧写
S03_CH11_基于TCP的QSPI Flash bin文件网络烧写 11.1概述 针对ZYNQ中使用QSPI BOOT的应用,将BOOT.bin文件烧写至QSPI Flash基本都是通过USB C ...
- s3c2440 J-flash 烧写 NOR flash
视屏教程里是在NOR Flash 烧写了一个supervivi然后通过superViVi配合DNW下载Uboot程序到landflash第零块,由于我电脑室64位win7,官方提供的USB下载驱动不能 ...
- DSP/BIOS使用之初窥门径——滴答时钟及烧写Flash
操作平台和环境 DSP型号:TMS320C6713 仿真器:XDS510PLUS Flash型号:AM29LV800BT或AM29LV800BT都试过(一般接口一样,区别不大) RAM型号:MT48L ...
- S03_CH12_基于UDP的QSPI Flash bin文件网络烧写
S03_CH12_基于UDP的QSPI Flash bin文件网络烧写 12.1概述 为了满足不同的需求,本例程在"基于TCP的QSPI Flash bin文件网络烧写"上进行修改 ...
- 【DSP开发】TMS320C66x DSP SPI Nor Flash的程序烧写
经过一段时间的研究终于把TMS320C6657单核和双核的SPI Nor Flash的程序烧写调通了.工具都是前辈的工作,有需要的可以留下邮箱,我有空可以发. 原理参考钱丰的<TI c66x 系 ...
- 【DM642学习笔记三】flash的烧写
ICETEK-DM642-PCI板上的29L008B芯片提供了8M位的Flash空间(访问地址空间是CE1,90000000h~90080000h).主要用于自启动功能和存储FPGA的配置数据. 一. ...
随机推荐
- java-多态、内部类
1.多态: 1)意义: 1.1)同一类型的引用,指向不同的对象时,有不同的实现-------行为的多态: cut(),run(),teach()... 1.2)同一个对象,被造型为不同的类型时,有不同 ...
- Vue 监听器和计算属性到底有什么不同?
各自的适用场景 计算属性临时快照 官方文档对于计算属性提到了一个重要的点子--"临时快照"(可能就是前面说的计算属性缓存),每当源状态发生变化时,就会创建一个新的快照. 有时候创建 ...
- 【JDBC】学习路径1-JDBC背景知识
学习完本系列JDBC课程后,你就可以愉快使用Java操作我们的MySQL数据库了. 各种数据分析都不在话下了. 第一章:废话 JDBC编程,就是写Java的时候,调用了数据库. Java Databa ...
- 【java】学习路线6-静态方法、私有化方法、父类子类
import java.util.Arrays; /* 我们可以自己创建方法(静态) 私有化方法,阻止他人实例化该方法 静态代码块只执行一次,只在加载这个所在类的时候执行 父类 - 子类 子类继承自父 ...
- Halcon C#开发OpenFramegrabber卡死问题
之前用Halcon12开发的时候,Hdevelop打开相机正常,但是用C#开发的时候,就出现了问题. 1.换库,甚至将x64中dll全部拷贝到debug中,始终不行 2.看到有说卸载360的,更是离谱 ...
- QPanter 绘画
Qpainter 绘图 1 绘图事件 void paintEvent(QPaintEvent *event) 2 声明一个画家对象 QPainter painter(this) this 指定绘图设 ...
- 第五十六篇:webpack的loader(四) -打包js中的高级语法
好家伙, 1.打包处理js文件中的高级语法 webpack只能打包处理一部分高级的JavaScript 语法.对于那些webpack无法处理的高级js 语法,需要借 助于 babel-loader 进 ...
- 02-MyBatisPlus入门
快速开始参考:https://baomidou.com/pages/226c21/ 测试项目: mybatis_plus 数据库:mybatis_plus 一.创建并初始化数据库 1.创建数据库: m ...
- 接入Twitter和Facebook分享踩坑记录
准备工作 1.首先需要在HTML的head添加下述meta标签内容,在分享时,Twitter和Facebook会爬取该网站页面的meta内容,然后生成分享卡片. 2.按照下述配置完成后,需要把内容发布 ...
- 2022第五空间-web部分wp+复盘总结
打了一天,麻了,大佬tql,这次get到了不少东西,一是一个不太常见的宽字节注入,我是真的没想到,而且后面也是看了wp理解了好一会才弄明白. 0x01: 题目是一个登录框,但是基本上是过滤掉了所有的常 ...