惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

D
DataBreaches.Net
J
Java Code Geeks
有赞技术团队
有赞技术团队
H
Hackread – Cybersecurity News, Data Breaches, AI and More
The GitHub Blog
The GitHub Blog
T
The Blog of Author Tim Ferriss
Apple Machine Learning Research
Apple Machine Learning Research
量子位
D
Docker
V
Visual Studio Blog
博客园 - 司徒正美
Martin Fowler
Martin Fowler
人人都是产品经理
人人都是产品经理
WordPress大学
WordPress大学
U
Unit 42
M
MIT News - Artificial intelligence
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
G
Google Developers Blog
Engineering at Meta
Engineering at Meta
V
V2EX
大猫的无限游戏
大猫的无限游戏
雷峰网
雷峰网
Vercel News
Vercel News
C
Check Point Blog

博客园 - 痞子衡

痞子衡嵌入式:如果你嫌MCU板卡工厂验收测试麻烦,不妨试试FATestSuite 痞子衡嵌入式:大话双核i.MXRT1180之XIP应用里借助MU实现可靠Flash IAP的方法 痞子衡嵌入式:turbo-spiboot - 一种基于MCUBoot协议的二级SPI加载APP提速方案 痞子衡嵌入式:如果你在找针对i.MX RT系列的OTA参考设计,可以持续关注Tiny OTA 痞子衡嵌入式:Farewell, 我的写博故事2025 《痞子衡嵌入式半月刊》 第 120 期 痞子衡嵌入式:16MB以上NOR Flash地址模式切换会造成软复位后i.MXRT无法正常启动 痞子衡嵌入式:i.MXRT中FlexSPI外设速度上限的三个影响因子(数据手册里的纠结) 痞子衡嵌入式:在i.MXRTxxx下使能DMA动态链式传输误区及各外设驱动对DMA链式支持情况 痞子衡嵌入式:在i.MXRTxxx下使能DMA链式传输可达到SPI从设备接收速率上限50Mbps 痞子衡嵌入式:在i.MXRT下测试启动特性时可改写OTP Shadow寄存器而不烧OTP 痞子衡嵌入式:如果i.MXRT1xxx在Hab关闭时出现偶发性启动失败,请先检查JTAG电路 痞子衡嵌入式:恩智浦i.MX RT1xxx系列MCU启动那些事(11.B)- FlexSPI NOR连接方式大全(RT1180) 《痞子衡嵌入式半月刊》 第 119 期 痞子衡嵌入式:从i.MXRT600用户手册UM里一个关于FlexSPI LUT长度的勘误说起 痞子衡嵌入式:i.MXRT1170使用FlexSPI 2nd引脚组连接串行NOR Flash启动时FDCB需特殊设置 痞子衡嵌入式:MDK5.40下从DFP包路径添加用户下载算法FLM文件的方法 痞子衡嵌入式:i.MXRT10xx系列ROM的UART SDP设置不同波特率的方法与实践 痞子衡嵌入式:不处理i.MXRT1064片内Flash的RESET#引脚可能会导致无法启动或程序跑飞 痞子衡嵌入式:聊聊i.MXRT1024/1064片内4MB Flash的SFDP表易丢失导致的烧录异常
痞子衡嵌入式:在含多个i.MXRT的主从系统中共享一颗Flash启动...
痞子衡 · 2025-04-29 · via 博客园 - 痞子衡

  大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是多个i.MXRT共享一颗Flash启动的方法

  在 《多个i.MXRT共享一颗Flash启动的方法与实践(上)》 一文里痞子衡给大家从理论上介绍一种多 i.MXRT 共享 Flash 启动的方法,但是理论虽好,如果没有经过实践验证切实可行,不过是纸上谈兵,所以今天痞子衡就找了两个 i.MXRT 开发板来具体实操这种方法:

一、搭建硬件平台

  理论上任意两块 i.MXRT 开发板均可以用作硬件测试平台(这里仅考虑一主一从,至于一主多从原理差不多),但是痞子衡手头 MIMXRT1010-EVK_Rev.C 开发板较多,就选用它来做测试吧,痞子衡对硬件做了如下改动:

  • 去除从板上 U13 - Flash
  • 保留主板上 U13 - Flash,并且飞线连接到从板 U13(低速启动仅需 CS, SCLK, IO0, IO1)
  • 主板主芯片 GPIO_11 信号(R1870 靠主芯片端,非 D25 LED 端)连到从板主芯片 POR_B(SW3 的 Pin3/4)

二、软件代码设计

  有了硬件平台,现在开始设计代码。为了简单起见,主从 i.MXRT 共用一份 App(可以在条件分支里做区分)。因为 Flash 是共享的,所以 App 必须是 Non-XIP 性质。要让芯片 BootROM 去支持 Non-XIP 启动,得使用专用上位机工具(比如痞子衡的 MCUBootUtility 或者恩智浦官方 SPT )来下载程序镜像文件,这样稍微麻烦一点。为了避免下载程序的麻烦,我们可以简单设计一个 boot_loader 工程来拷贝和跳转 boot_app 程序。

两个工程路径:
/boards/evkmimxrt1010/demo_apps/boot_loader
/boards/evkmimxrt1010/demo_apps/boot_app

2.1 boot_loader 工程设计

  boot_loader 工程是一个 XiP 工程,由芯片 BootROM 直接启动。我们可以直接基于 SDK 里的 hello_world 来修改(flexspi_nor target),先对它的启动头 FCB 做如下修改(1-bit SPI 30MHz Normal Read Mode):

  boot_app 工程是一个 Non-XiP 工程,也可以基于 SDK 里的 hello_world 来修改(debug target),它生成的 binary 直接导入到 boot_loader 工程里,具体方法可参见 《i.MXRT双核工程调试的三种方法(IAR篇)》 一文里的 2.3 通用方法:双核工程有关联,主核加载从核 小节,这里不再赘述。

  boot_loader 工程里有了 boot_app 数据以及链接地址,拷贝和跳转函数设计就比较简单了,都是通用代码。最终调稳定的 boot_loader 工程可以直接在 IDE 里下载到 Flash 里运行(需调试器连接到主板 SWD 口)。

2.2 boot_app 工程设计

  现在来到最核心的 boot_app 工程设计,工程还是基于 hello_world,可以从串口接收简单的字符指令(A,B...)来做不同测试,目前设计了六个测试指令:

字符指令 A(仅适用主 i.MXRT)- 将 GPIO_11 输出电平由低变高控制 POR_B 信号以释放从 i.MXRT
字符指令 B(仅适用主 i.MXRT)- 将 GPIO_11 输出电平由高变低控制 POR_B 信号以复位保持从 i.MXRT
字符指令 C(适用主/从i.MXRT)- 初始化 Flash 相关引脚为 FlexSPI 功能
字符指令 D(适用主/从i.MXRT)- 恢复 Flash 相关引脚为默认 GPIO 状态
字符指令 E(适用主/从i.MXRT)- 以一线模式擦写读 U13 Flash
字符指令 F(仅适用从 i.MXRT)- 用定时器不断翻转 GPIO_11 来驱动 D25 LED 闪烁

  这里需要特别说一下指令 A 和 E,这里面涉及到主/从 i.MXRT 芯片 FlexSPI 引脚共同驱动一个 Flash 的冲突问题。当主 i.MXRT 执行 A 指令来释放从 i.MXRT 时,需要先执行 D 指令(即调用如下函数)将 FlexSPI 引脚恢复到上电默认 GPIO 状态(BootROM 启动时已将这些引脚配置成了 FlexSPI 功能),否则从 i.MXRT 可能无法正常从 Flash 启动。

void bsp_deinit_flexspi_pins(void) 
{
    IOMUXC_SetPinMux(IOMUXC_GPIO_SD_06_GPIO2_IO06, 0U); 
    IOMUXC_SetPinMux(IOMUXC_GPIO_SD_07_GPIO2_IO07, 0U); 
    IOMUXC_SetPinMux(IOMUXC_GPIO_SD_09_GPIO2_IO09, 0U); 
    IOMUXC_SetPinMux(IOMUXC_GPIO_SD_10_GPIO2_IO10, 0U);
    IOMUXC_SetPinConfig(IOMUXC_GPIO_SD_06_GPIO2_IO06, 0x10A0U);
    IOMUXC_SetPinConfig(IOMUXC_GPIO_SD_07_GPIO2_IO07, 0x10A0U);
    IOMUXC_SetPinConfig(IOMUXC_GPIO_SD_09_GPIO2_IO09, 0x10A0U);
    IOMUXC_SetPinConfig(IOMUXC_GPIO_SD_10_GPIO2_IO10, 0x10A0U);
}

  C 指令和 E 指令显然是结伴而行的,当从 i.MXRT 执行过 C,E 指令且仍处于激活状态时,如果主 i.MXRT 想正常执行 C,E 指令,要么先执行 B 指令直接将从 i.MXRT 复位保持住(FlexSPI 相关引脚配置也自动复位了),要么让从 i.MXRT 先执行下 D 指令。

三、在板卡上测试

  现在给板卡供电,将包含 boot_app 的 boot_loader 程序下载进 Flash,主板串口是 COM43,从板串口是 COM50,我们做一个快速测试,给主板直接发送 A 指令发现从板没有启动,但是执行过 D 指令后再发送 A 指令,这时候从板就正常启动了。此外主/从板也都能对 Flash 进行正常擦写,这证明我们的创新连接方法是切实可行的。

  至此,多个i.MXRT共享一颗Flash启动的方法痞子衡便介绍完毕了,掌声在哪里~~~

欢迎订阅

文章会同时发布到我的 博客园CSDN微信公众号知乎与非网电子技术应用AET电子星球51CTO 平台上。

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