在嵌入式系统开发中,当使用大容量(大于16MB)的NOR Flash作为启动设备时,地址模式的切换不当可能导致芯片在执行软复位后无法正常启动。本文将深入分析该问题的成因,并结合i.MXRT系列芯片的ROM设计差异,提供通用可靠的解决方案。
一、大容量Flash地址模式设计
主流的大容量QSPI NOR Flash型号普遍支持3字节(3B)和4字节(4B)两套地址命令集。其中,4B地址命令只接受4B地址(不受内部地址模式寄存器影响),而3B地址命令则根据Flash当前所处的地址模式来决定跟随的地址是3B还是4B。
下表汇总了多个主流厂商大容量NOR Flash的地址模式设计:

从上表可知,几乎所有厂商进入/退出4B地址模式的命令设计一致(初始状态默认为3B地址模式)。对于高低地址段(Segment)的配置,除英飞凌(Infineon)外,其他厂商均支持且设计兼容。
关于3B/4B地址模式的切换方式,除专用命令外,部分厂商支持通过写配置寄存器实现,但行为分为两类:
- 写入后需复位生效:华邦(Winbond)、兆易创新(GigaDevice)、英飞凌(Infineon)的型号,写寄存器切换地址模式仅在掉电(POR)或硬件复位(Reset)时才生效。
- 写入后立即生效:ISSI、旺宏(MXIC)的型号,写入相应配置寄存器后,新的地址模式会直接生效。
二、Zephyr系统下的地址模式使能函数分析
在使用Zephyr驱动时,flash_flexspi_nor_4byte_enable() 函数是使能4B地址模式的关键。其内部通过参数en4b区分多种处理方式,核心手段是发送0xB7专用命令切换到4B地址模式。
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的全部地址空间,并未启用专用于大容量Flash的4B地址命令集。若应用程序调用此函数将Flash切换至4B地址模式后执行内核软复位,便会引发启动失败问题。
三、i.MXRT系列芯片ROM的应对策略
i.MXRT芯片上电后,ROM默认使用0x03(读取)命令配合3B地址来获取FlexSPI配置块(FCB)。若应用程序已将Flash切换到4B地址模式,随后进行内核软复位,ROM仍使用原方式读取,将无法获得正确的FCB,导致启动失败。
i.MXRT不同系列的ROM对此问题的处理方式有所演进。
3.1 RT10xx系列的ROM设计
RT10xx的ROM在启动配置(BT_CFG)的FLASH_TYPE字段中预留了3‘b000和3’b001两种配置,分别对应Flash处于3B或4B地址模式,以此决定使用0x03命令时跟随3B还是4B地址。但这仅在芯片上电复位(POR)时有效。若应用程序在运行时切换了Flash地址模式后进行内核软复位,此静态配置无法动态适应,问题依然存在。

3.2 RT11xx/RT三位数系列的ROM设计
为了根本性解决此问题,RT11xx等后续系列的ROM引入了新的机制。ROM在上电初始化后,会先对Flash执行一次软复位,假设其能恢复到默认的3B地址模式,然后再使用0x03命令加3B地址去读取FCB。这一设计逻辑上更为完善,但其有效性依赖于一个重要前提:所选Flash的软复位命令能否将其地址模式可靠地恢复至默认状态,这需要开发者仔细查阅具体Flash型号的数据手册。

四、通用且可靠的解决方案
上述ROM策略或依赖静态配置,或依赖Flash复位行为的不确定性,并非万全之策。最根本、最可控的解决方案应由应用程序自身实施。
既然地址模式是在应用程序中切换的,那么在触发内核软复位之前,应用程序应主动将Flash的地址模式恢复到初始状态(通常是3B模式)。例如,可以在软复位函数调用前,插入退出4B地址模式的命令(如0xE9)或发送Flash软复位命令。这确保了无论后续ROM采取何种策略,Flash都处于其预期的默认地址模式,从而保证软复位后的启动流程百分之百可靠。
这种主动管理的思路,与解决NOR Flash退出连续读(Continuous Read)模式的问题一脉相承,是嵌入式存储管理中一种稳健的设计实践。通过深入了解存储设备的特性和主控芯片的启动逻辑,开发者可以构建出更加健壮的嵌入式系统。