news 2026/4/25 19:16:26

痞子衡嵌入式:16MB以上NOR Flash地址模式切换会造成软复位后i.MXRT无法正常启动

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
痞子衡嵌入式:16MB以上NOR Flash地址模式切换会造成软复位后i.MXRT无法正常启动

大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家分享的是i.MXRT上使用16MB以上NOR Flash软复位无法正常启动问题的分析解决经验

五年前痞子衡写过一篇文章 《IS25WP256D的Bank Address Register[0]使用对RT1050软复位启动的影响》,这篇文章介绍了对大容量 Flash(>16MB) 的3字节地址命令下高/低地址空间(128Mb segment)切换特殊设计的利用需要注意,如果主芯片 App 程序中包含内核软复位设计,记得内核复位前先将 Flash 设置到初始状态。

最近有一个 RT1180 客户,启动 Flash 选用得是 IS25LP256H,App 程序里使用 Zephyr Flash 驱动时发现只要调用了 flash_flexspi_nor_4byte_enable() 函数后再做内核软复位,芯片就不能再次启动了,这其实还是大容量 Flash 地址模式搞的鬼。今天痞子衡就和大家聊聊这个问题:

一、大容量Flash地址模式设计

痞子衡列出了下面 6 个主流 Flash 厂商的代表大容量 QSPI NOR 型号,将其关于地址模式的信息整理在了一起,开头提及的文章里4.3 关于Flash的3/4字节地址小节说了,大容量 Flash 一般都支持 3/4B 地址两套命令,4B 地址命令只接受 4B 地址(不受地址模式影响),3B 地址命令则根据当前地址模式来决定到底跟 3/4B 地址。

Flash地址模式设计
进/出4B地址命令高低Segment配置位高低Segment寄存器写命令3/4B地址配置位3/4B地址寄存器写命令
IS25LP256H0xB7/0xE9Bank Address Register[0] - BA240x18/0xC5Bank Address Register[7] - EXTADD0x18/0xC5
W25Q256JV0xB7/0xE9Extended Address Register[0] - A240xC5Status Register-3[1:0] - ADP,ADS0x11
GD25Q256M0xB7/0xE9Extended Address Register[0] - A240xC5Status Register-2[13:12] - ADS,ADP0x31
MX25L25645G0xB7/0xE9Extended Address Register[0] - A240xC5Configuration Register[5] - 4BYTE0x01
S25FL256L0xB7/0xE9N/AN/AConfiguration Register 2 Volatile[1:0] - ADP,ADS0x71
MT25QL256A0xB7/0xE9Extended Address Register[0] - A24
16bit Configuration Register[0]
0xC5,0xB1N/AN/A

上表里我们可以看到所有厂商对于进入/退出 4B 地址模式的命令设计都是一样的(初始情况下 Flash 都是 3B 地址模式),关于高低 Segment 配置设计除了 Infineon 之外,其他厂商都支持并且设计上也兼容。最后就是 3/4B 地址模式切换除了有专用命令设计外,除 Micron 之外的其他厂商也提供直接写配置寄存器的方式,但是这里分为两派:一派是 Winbond、GigaDevice、Infineon,其写寄存器切换地址模式仅在 POR 或者 reset 时才会生效,而另一派 ISSI、MXIC 则写了相应配置寄存器后新地址模式直接生效。

二、Zephyr下flash_flexspi_nor_4byte_enable()

了解了大容量 Flash 的地址模式以及切换方法,我们再来看看 Zephyr 驱动里是怎么处理的,我们找到这个函数实现,其 en4b 参数区分了好几种不同处理,最主要的方式就是发 0xB7 专用命令切到 4B 地址模式。

/* by 01130.hk - online tools website : 01130.hk/zh/calcheat.html */ en4b & BIT(6) - Flash is always in 4 byte mode. We just need to configure LUT en4b & BIT(0) - Issue instruction 0xB7 en4b & BIT(1) - Issue write enable, then instruction 0xB7 en4b & BIT(4) - Set bit 0 of 16 bit configuration register via 0xB1 cmd Other methods not supported. Include: BIT(2): 8-bit volatile extended address register used to define A[31:24] bits. BIT(3): 8-bit volatile bank register used to define A[31:24] bits. BIT(5): Dedicated vendor instruction set.

从这个函数设计我们知道 Zephyr Flash 驱动使用了 3B 地址命令结合地址模式切换来支持所有容量 Flash 的全部空间访问,并没有启用 4B 地址命令(毕竟 4B 地址命令仅在大容量 Flash 上支持)。

三、RT系列对于Flash地址模式处理

我们知道 RT 系列芯片上电 ROM 默认是用 0x03 命令 + 3B 地址来获取 FCB 的,当第一次启动成功之后,如果 App 程序里将 Flash 切换到 4B 地址模式,然后做内核软复位重新启动,此时 ROM 再用 0x03 命令 + 3B 地址就不能再拿到正确的 FCB 了,这就是再次启动失败的原因。

3.1 RT10xx系列ROM设计

在 RT10xx 上 ROM 在 BT_CFG 的 FLASH_TYPE 里放了 3'b000 和 3'b001 两种配置,分别对应 Flash 是 3B/4B 地址模式两种情况,从而用 0x03 命令 +3/4B 地址来获取 FCB。这样的设计仅对 RT 芯片 POR 时有效,但如果是切换 Flash 地址模式后内核软复位的情况依然失效(因为 BT_CFG 不能动态更改)。

更进一步的理解是这种设计是针对 Flash 默认地址模式是 4B 的情况,但实际上几乎没有 Flash 默认地址模式是 4B,毕竟已经有一套专门 4B 地址命令在这了。

3.2 RT11xx/RT3digits系列ROM设计

为了改进 RT10xx 上 ROM 缺陷,在 RT11xx ROM 里 xSPI_FLASH_TYPE 干脆就拿掉了 3'b001 配置(注意这里仅仅是文档方面移除,代码里实际上支持还在),取而代之的是真正解决地址模式切换问题的手段,详见痞子衡旧文 《RT系列ROM中集成的NOR SW Reset功能》,简单来说就是假设 Flash 软复位后状态是 3B 地址模式,ROM 上电后先对 Flash 做一次软复位,再用 0x03 命令 +3B 地址来获取 FCB,这个设计逻辑看起来通顺了,唯一需要注意的是软复位能不能将 Flash 地址模式恢复到默认状态,这个需要检查具体 Flash 数据手册。

四、通用解决方案

上一节讲得都是依赖 ROM 来解决 Flash 地址模式切换问题,这其实还是没有把控全局的感觉,毕竟 Flash 地址模式是在 App 程序里切换的,那显然 App 程序在做内核软复位的时候自己主动将 Flash 地址模式再切回来不就完了吗!就像痞子衡旧文 《SW Reset退出NOR Continuous read模式》 里做法那样,App 程序里加上 Flash 复位命令相关代码(对本文来说也可以是退出 4B 地址模式命令相关代码),在需要的地方调用一下即可。

至此,i.MXRT上使用16MB以上NOR Flash软复位无法正常启动问题的分析解决经验痞子衡便介绍完毕了,掌声在哪里~~~

欢迎订阅

文章会同时发布到我的 博客园主页、CSDN主页、知乎主页、微信公众号 平台上。

微信搜索"痞子衡嵌入式"或者扫描下面二维码,就可以在手机上第一时间看了哦。

最后欢迎关注痞子衡个人微信公众号【痞子衡嵌入式】,一个专注嵌入式技术的公众号,跟着痞子衡一起玩转嵌入式。


衡杰(痞子衡),目前就职于恩智浦(NXP)半导体MCU系统应用部门,担任高级嵌入式系统应用工程师。

专栏内所有文章的转载请注明出处:http://www.cnblogs.com/henjay724/

与痞子衡进一步交流或咨询业务合作请发邮件至 hengjie1989@foxmail.com

可以关注痞子衡的Github主页 https://github.com/JayHeng,有很多好玩的嵌入式项目。

关于专栏文章有任何疑问请直接在博客下面留言,痞子衡会及时回复免费(划重点)答疑。

痞子衡邮箱已被私信挤爆,技术问题不推荐私信,坚持私信请先扫码付款(5元起步)再发。


版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/17 20:46:06

儿童生长曲线分析技术深度解析:原理、实现与预警机制

本文从技术视角深入探讨儿童身高体重管理的核心挑战,详细解析生长曲线分析的原理、标准化数据来源及百分位/Z-score计算方法。并以长高乐APP为例通过Python代码示例展示数据模型设计、API接口实现与可视化技术,并系统阐述基于生长曲线的5大预警机制,为儿童健康管理提供技术支…

作者头像 李华
网站建设 2026/4/23 16:14:15

为什么越来越多的网工运维转行网络安全?

为什么越来越多的网工运维转行网络安全? 、 最近越来越多的网工运维小伙伴都在吐槽:干网工、运维多年,薪资还是5.6K,技术也遇瓶颈上不去,考虑转岗或者转行。其中大部分的网工运维小伙伴们纷纷瞄准了高薪高前景的网络…

作者头像 李华
网站建设 2026/4/21 21:06:13

社交网络数据质量治理:经验与教训

社交网络数据质量治理:从踩坑到进阶的实战经验 一、引言:社交网络的“数据烂尾楼”困境 钩子:你遇到过这些“反人类”社交体验吗? 刷到完全不感兴趣的推荐?比如你是健身达人,却总收到美妆广告&#xff1…

作者头像 李华
网站建设 2026/4/18 23:53:20

std::greater结构体用在sort和lower_bound

https://cn.bing.com/search?pglt417&qgreater%3Cstring%3E std::sort(numbers, numbers 5, std::greater<int>());&#xff0c;std::greater{}也可以 #if _LIBCPP_STD_VER > 14 template <class _Tp void> #else template <class _Tp> #endif s…

作者头像 李华
网站建设 2026/4/23 15:00:37

当数字员工搭载AI销冠系统,如何迅速提升销售效率?

数字员工通过引入AI销冠系统&#xff0c;能够显著优化业务流程&#xff0c;降低企业运营成本&#xff0c;并提升整体效率。数字员工的智能化特性使其能够自动化处理大量客户交互&#xff0c;如电话回访和信息收集&#xff0c;减少了对传统人工客服的依赖。这不仅提高了工作效率…

作者头像 李华