痞子衡嵌入式:记录为i.MXRT1060更换较大容量Flash(IS25LP064A_IS25LP128F)导致二级App异常启动问题解决全过程(上篇)
大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家分享的是为i.MXRT1060更换较大容量Flash导致二级App异常启动问题。
痞子衡最近在支持一个 RT1062 国外客户项目,客户在项目预研阶段为 RT1062 搭配的启动 Flash 是较小容量 IS25LP064A,接近量产的时候需要改用较大容量 IS25LP128F。客户本以为只是一个简单的同厂家同系列 Flash 容量小升级而已,谁知道竟然遇到奇怪的芯片启动问题!在痞子衡和客户一番沟通之后,认定确实是个非常奇怪的案例,且听痞子衡慢慢道来:
本篇是上篇,主要是抛出问题,希望大家能够留言积极回复,给出你认为出问题的地方。
一、问题描述
客户项目代码分为两个部分,一个是从 0x6000_2000 处开始链接的 L2 Boot,还有一个是 0x6040_0000 处开始链接的 App,RT1062 芯片上电 BootROM 加载 L2 Boot 运行,L2 Boot 再跳转到 App 执行。

客户首先在小容量 IS25LP064A 上通过了代码测试,借助恩智浦官方下载工具 MCUXpresso SEC Secure Provisioning Tool (当然这里痞子衡更推荐的是 NXP-MCUBootUtility),先烧写 App,再烧写 L2 Boot(因为 App 由 L2 Boot 直接引导执行,所以其无需 RT 启动头,即使后下载的 L2 Boot 启动头会覆盖先下载的 App 启动头也无关紧要)。
客户最终希望能给 L2 boot 做签名启动,App 无需签名,所以 RT1062 内部 fuse SEC_CONFIG[1:0] 需要被烧写成 2'b1x - HAB Closed。客户同时做了两种测试,L2 boot 无签名情况以及有签名情况,均正常工作,因此可以证明当前 L2 Boot 和 App 代码设计在 IS25LP064A 上跑一切正常,也和是否签名无关(RT1062 HAB 状态)。
然后客户换了一块新板子,上面放置得是大容量 IS25LP128F,程序无任何改动,下载流程也一样,在 L2 Boot 无签名的时候,也能够正常工作。但是一旦给 L2 Boot 加了签名,这时候 L2 Boot 能够正常启动(有 Log 打出),但是 App 却没有正常启动(无 Log 输出),并且从 Log 输出来看,L2 Boot 一直在重复启动。
看到这你的第一反应是什么?根据控制变量法,似乎问题是由换到 IS25LP128F 引起的,也似乎是 L2 Boot 加了签名引起的。但是客户之前的测试能够证明,单独改动这两个 X 因素之一并不会导致问题,然而合在一起就引发了问题。
二、现有测试与分析
目前客户暂未分享其项目代码给痞子衡,为了快速验证客户这种情况,痞子衡在恩智浦开发板 RT1060-EVKC 上做了类似测试,在 \SDK_24_12_00_MIMXRT1060-EVKC\boards\evkcmimxrt1060\demo_apps\hello_world 例程基础上(flexspi_nor_debug) 上创建了两个 target,一个是 flexspi_nor_boot(增加 app 跳转代码),另一个 flexspi_nor_app(去掉 BOOT_HEADER,然后修改链接地址到 0x6040_0000)。

分别编译出 Mini L2 Boot 和 Mini App 之后,按照客户同样下载流程(用 SEC 上位机,且使能签名),这是痞子衡第一次用官方 SEC 上位机做签名下载操作,使用体验总体不如 NXP-MCUBootUtility 来得顺手。

痞子衡先在默认 W25Q128JWSIQ 上做了测试,然后又将板子上的 Flash 换成了 IS25LP128F 做了同样测试。让痞子衡感到遗憾的是,并未复现客户的情况,Mini L2 Boot 和 Mini App 跑得稳如狗。

三、值得关注的点
虽然没能成功复现客户的问题,但是在检查客户使用的两颗 Flash 的数据手册时,还是发现了一些隐患点的。我们先来看一下恩智浦官方开发板 Flash 使用情况以及 SDK 里对 Flash XIP 启动的速度配置(所谓 FCB,\SDK_XXX_MIMXRT1xxx-EVK\boards\evkmimxrt1xxx\xip\evkmimxrt1xxx_flexspi_nor_config.c),从 SDK 2.15 开始 FCB 尝试为支持调整 dummy cycle 的 Flash 做了适配以跑到 Flash 的最高速度。
- Note:不了解 dummy cycle 可以先阅读痞子衡旧文 《在i.MXRT启动头FDCB里调整Flash工作频率也需同步设Dummy Cycle (以IS25WP128为例)》

然而在 RT1060 SDK 里的 FCB 并没有加入 dummy cycle 方面的考虑,直接就是用了默认 6 dummy cycle 来支持 120MHz SDR Quad Fast Read (0xEB) 性能,这对于 RT1060-EVK/EVKB 上的 IS25WP064AJBLE 来说其实是有隐患的(对应默认最高频率是 104MHz),算超频在跑了。
此外痞子衡旧文 《同一厂商不同系列Flash型号下Dummy Cycle设置方法可能有差异 (以IS25LP064A为例)》 里介绍了 IS25LP064A 和 IS25WP128 系列有差异,用相同的分析方法你会发现 IS25LP064A 和 IS25LP128F 一样有差异,虽然 IS25LP128F 上限可以跑到 166MHz,但是默认 6 dummy cycle 下仅支持 81MHz。

客户包括痞子衡都直接使用得 SEC 上位机工具自动生成的 FCB 头,其只能使用默认 6 dummy cycle,而我们都将 Flash 运行频率设到了 120MHz 以上,这显然是有隐患的(虽然痞子衡的 Mini L2 Boot/App 没有跑出问题,但是压力运行之下可靠性无法保证)。
这会是客户问题的答案吗?痞子衡让客户将 Flash 工作频率调到了 80MHz 以符合手册要求,但是客户反馈,问题仍然存在!目前为止,痞子衡暂无其它思路,你能想到可能出问题的地方吗?
欢迎订阅
文章会同时发布到我的 博客园、CSDN、微信公众号、知乎、与非网、电子技术应用AET、电子星球、51CTO 平台上。
微信搜索"痞子衡嵌入式"或者扫描下面二维码,就可以在手机上第一时间看了哦。

痞子衡嵌入式:记录为i.MXRT1060更换较大容量Flash(IS25LP064A_IS25LP128F)导致二级App异常启动问题解决全过程(上篇)的更多相关文章
- 痞子衡嵌入式:利用i.MXRT1060,1010上新增的FlexSPI地址重映射(Remap)功能可安全OTA
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT部分型号上新增的FlexSPI Remap功能. OTA升级设计几乎是每个量产客户都绕不开的话题,产品发布后免不了要做固件( ...
- 痞子衡嵌入式:了解i.MXRT1060系列ROM中串行NOR Flash启动初始化流程优化点
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是i.MXRT1060系列ROM中串行NOR Flash启动初始化流程优化点. 前段时间痞子衡写了一篇 <深入i.MXRT1050系 ...
- 痞子衡嵌入式:揭秘i.MXRT1060,1010上串行NOR Flash冗余程序启动设计
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT1060,1010上串行NOR Flash冗余程序启动设计. 工业产品设计里经常会有冗余程序/备份程序设计的需求,因为在工业 ...
- 痞子衡嵌入式:IAR在线调试时设不同复位类型可能会导致i.MXRT下调试现象不一致(J-Link / CMSIS-DAP)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是IAR在线调试时设不同复位类型可能会导致i.MXRT下调试现象不一致. 做Cortex-M内核MCU嵌入式软件开发,可用的集成开发环境( ...
- 痞子衡嵌入式:改动i.MXRT1xxx里IOMUXC_GPR寄存器保留位可能会造成系统异常
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是改动i.MXRT1xxx里IOMUXC_GPR寄存器保留位可能会造成系统异常. 痞子衡的嵌入式技术交流群里有一位非常活跃的朋友(网名:文 ...
- 痞子衡嵌入式:Keil在线调试时设不同复位类型可能会导致i.MXRT下调试现象不一致(J-Link/DAPLink)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是Keil在线调试时设不同复位类型可能会导致i.MXRT下调试现象不一致. 本篇是 <IAR EWARM复位类型>.<M ...
- 痞子衡嵌入式:一个关于Segger J-Flash在Micron Flash固定区域下载校验失败的故事(SR寄存器BP[x:0]位)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家讲的是一个关于Segger J-Flash在Micron Flash固定区域下载校验失败的故事. 痞子衡最近在支持一个 i.MXRT1170 欧 ...
- 痞子衡嵌入式:恩智浦经典LPC系列MCU内部Flash IAP驱动入门
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是恩智浦经典LPC系列MCU内部Flash IAP驱动. LPC 系列 MCU 是恩智浦公司于 2003 年开始推出的非常具有代表性的产品 ...
- 痞子衡嵌入式:记录i.MXRT1060驱动LCD屏显示横向渐变色有亮点问题解决全过程(提问篇)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是i.MXRT1060上LCD横向渐变色显示出亮点问题的分析解决经验. 痞子衡前段时间在支持一个i.MXRT1060客户项目时遇到了LCD ...
- 痞子衡嵌入式:MCUBootUtility v2.4发布,轻松更换Flashloader文件
-- 痞子衡维护的NXP-MCUBootUtility工具距离上一个版本(v2.3.1)发布过去2个月了,这一次痞子衡为大家带来了版本升级v2.4.0,这个版本主要有一个非常重要的更新需要跟大家特别说 ...
随机推荐
- Qt编写地图综合应用10-点聚合
一.前言 点聚合在地图相关应用中比较常用,比如在地图上查询结果通常以标记点的形式展现,但是如果标记点较多,不仅会大大增加客户端的渲染时间,让客户端变得很卡,而且会让人产生密集恐惧症,密密麻麻的一大堆点 ...
- Qt开发经验小技巧146-150
Qt中自带的很多控件,其实都是由一堆基础控件(QLabel.QPushButton等)组成的,比如日历面板 QCalendarWidget 就是 QToolButton+QSpinBox+QTable ...
- Qt音视频开发33-ffmpeg安卓版
一.前言 一直都想搞个安卓版本的视频监控程序,很早以前弄过一个,采用的是早期的ffmpeg2的lib文件,对于现在众多的网络流媒体格式,支持有限,而且新的Qt编写安卓程序,结构上也变动了,新的安卓系统 ...
- [转]使用Eclipse创建一个简单的servlet项目
参考链接: 1.使用Eclipse创建一个简单的servlet项目 2.如何使用eclipse创建简单的servlet
- Java 中toString方法在枚举中的应用:展示枚举字段信息
在Java编程中,枚举(enum)是一种特殊的数据类型,它允许程序员定义一组固定的常量.枚举类型在Java中非常有用,尤其是在需要表示一组固定选项(如星期.月份.方向等)时.尽管枚举类型在定义时看起来 ...
- Eval-Expression.NET:动态执行C#脚本,类似Javascript的Eval函数功能
我们都知道在JavaScript中,我们可以通过Eval来执行JavaScript字符串代码. 下面推荐一个.Net版本的Eval的开源项目. 01 项目简介 Eval-Expression.NET是 ...
- Python串口实现dk-51e1单相交直流标准源通信
Python实现dk-51e1单相交直流标准源RS232通信 使用RS232,信号源DK51e1的协议帧格式如下: 注意点 配置串口波特率为115200 Check异或和不需要加上第一个0x81的字段 ...
- 并发编程之 ConcurrentLinkedQueue 源码
文章目录1 ConcurrentLinkedQueue的概述2 ConcurrentLinkedQueue的实现2.1 基本结构2.2 构造器2.2.1 ConcurrentLinkedQueue2. ...
- 史上最全Redis面试49题(含答案):哨兵+复制+事务+集群+持久化等
Redis主要有哪些功能? 1.哨兵(Sentinel)和复制(Replication) Redis服务器毫无征兆的罢工是个麻烦事,如何保证备份的机器是原始服务器的完整备份呢?这时候就需要哨兵和复制. ...
- shell脚本输出带文本颜色背景颜色自定义样式格式内容
shell脚本中 echo 和 printf 都可以输出内容.示例1: echo -e "\033[43;35m david use echo say Hello World \033[0m ...