大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是i.MXRT1064片内Flash的RESET#引脚对程序启动和运行的影响

  上一篇文章 《i.MXRT1024/1064片内4MB Flash的SFDP表易丢失导致的烧录异常》 痞子衡带大家初步了解了 i.MXRT 上片内合封的 4MB Flash,合封 Flash 方式一般来说比外挂方式要省事省心,但前提是你充分了解了它的合封方式、信号连接等细节。如果对这些细节没有完全掌握,合封就像是一个黑盒子,还真不一定就比外挂可靠。

  近期另有一个 RT1064 客户反馈,产品在运行过程中会发生极小概率的宕机,分析发现宕机时(不断电情况下)内部 Flash 读回的程序数据竟然全是 0x00,看起来 Flash 内容被篡改了,但是重新上电又能正常工作,这是怎么回事?今天痞子衡就和大家聊聊这个话题:

  • Note:本文所述问题仅在 RT1064 上发生,不存在于 RT1024 上。

一、RT1024/1064片内Flash连接差异

1.1 W25Q32JV不同封装

  我们知道 RT1024/RT1064 内部合封得是 Winbond W25Q32JV 裸 Die,而 W25Q32JV 作为单独产品售卖时实际上提供了非常多的封装形式,这其中我们最熟悉得是经典的 8 个引脚的 SOIC-8 208-mil 封装。

  从 W25Q32JV 裸 Die 本身角度来说,其一共有 9 个信号线,在 SOIC-8 上将本该单独引出的 RESET# 信号复用到了 IO3 上(虽然这个脚本身还有一个 HOLD# 复用),而在 SOIC-16 或者 TFBGA-24 上我们就能看到这个单独的 RESET# 信号了:

1.2 RT1024片内RESET#连接

  在 RT1024 上,内部 Flash 的 RESET# 信号保留悬空(或其它处理),并没有和 RT1020 之间有信号连接,这里 GPIO_AD_B1_13 被着重强调,是因为 RT1024 BootROM 会根据 efuse 配置情况控制这个 I/O 来复位 Flash(显然这里是无效的)。

1.3 RT1064片内RESET#连接

  在 RT1064 上,内部 Flash 的 RESET# 信号被连接到了 RT1060 内部信号 GPIO_SPI_B0_13 上,当然 RT1064 BootROM 也会根据 efuse 配置情况控制这个 I/O 来复位 Flash(这时就会产生一定作用)。

二、不处理片内Flash RESET#信号带来的风险

  在痞子衡旧文 《深入i.MXRT系列ROM中串行NOR Flash启动初始化流程》 一文 2.1 复位Flash芯片 小节里,我们知道如果 efuse 里 RESET# 相关 bit 被烧写使能后,RT1064 BootROM 才会初始化 GPIO_SPI_B0_13 引脚为 GPIO 输出模式,并且拉低拉高一次来复位 Flash,等复位结束 GPIO_SPI_B0_13 会保持高电平输出。

// RT1064 上 RESET# 相关的 fuse
fuse 0x6e0[7] - FLEXSPI_RESET_PIN_EN
0 - Disable
1 - Enable fuse 0x6e0[31] - FLEXSPI_RESET_PIN_SEL
0 - GPIO_SPI_B0_00
1 - GPIO_SPI_B0_13

  但是默认情况下,RT1064 芯片出厂以及客户都不会去烧写跟这个 RESET# 相关的 efuse,这意味着 GPIO_SPI_B0_13 内部引脚会一直保持上电默认状态,那么默认是什么状态呢?这从 IOMUXC_SW_PAD_CTL_PAD_GPIO_SPI_B0_13 寄存器默认值 0x10B0 可以得知其为输入 Keeper 状态。

  我们知道 RESET# 信号对 Flash 来说也是输入(从 Winbond 技术人员处得知,该信号内部有 280K 欧姆上拉),两个引脚相连,各自都是输入状态,显然有点不太可靠。说一种极端情况,芯片上电过程中,在 Flash 端弱上拉对 RESET# 作用让电压爬升到有效高电平 VCC x 0.7 之前,RT1060 的 GPIO_SPI_B0_13 端输入 Keeper 状态先产生作用,这时就会产生一个弱下拉,由于不同芯片的器件特性差异,这里的弱上拉/下拉都存在一定的误差范围,最终极有可能导致 RESET# 电平处于中间不定态。此外哪怕芯片上电过程中没问题,实际运行中,由于片内温度电磁环境等各方面因素,导致 RESET# 信号发生翻转,对 XIP 程序运行稳定性也是毁灭性打击。

三、解决RESET#信号稳定性的方案

  为了验证 GPIO_SPI_B0_13 信号状态对于 RT1064 影响,痞子衡在测试 SFDP 工程里加上了这个信号的控制,当 GPIO_SPI_B0_13 输出为低时,即 Flash RESET# 处于有效状态,此时 Flash SFDP 都不能正常读出,更别提内存数据读取操作了。

  那么该如何解决这个问题呢?上述原理知道后,其实方法就特别简单了:

  • 解决启动问题:烧写 fuse 0x6e0[31,7] 两个位,让 BootROM 去初始化 GPIO_SPI_B0_13 引脚。(大约增加 750us 启动时间)
  • 解决跑飞问题:假如芯片没有启动问题,但你不想额外烧写 fuse,那么 XIP App 运行起来后第一件事就是初始化 GPIO_SPI_B0_13 为 GPIO 输出模式,并且设为高电平。(为了可靠性,这部分代码可以 RAMFUNC 运行)

  至此,不处理i.MXRT1064片内Flash的RESET#引脚可能会导致无法启动或程序跑飞痞子衡便介绍完毕了,掌声在哪里~~~

欢迎订阅

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

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

痞子衡嵌入式:不处理i.MXRT1064片内Flash的RESET#引脚可能会导致无法启动或程序跑飞的更多相关文章

  1. 痞子衡嵌入式:kFlashFile v1.0 - 一个基于Flash的掉电数据存取方案

    大家好,我是痞子衡,是正经搞技术的痞子.今天给大家带来的是痞子衡的个人小项目 - kFlashFile. 痞子衡最近在参与一个基于 i.MXRT1170 的项目,项目有个需求,需要在 Flash 里实 ...

  2. 痞子衡嵌入式:i.MXRT中不支持DQS的FlexSPI引脚组连接Flash下载与启动注意事项

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是i.MXRT中不支持DQS的FlexSPI引脚组连接Flash下载与启动注意事项. 最近痞子衡在支持一个印度客户,这个客户项目主芯片选择 ...

  3. 痞子衡嵌入式:i.MXRT连接特殊Octal Flash时(OPI DTR模式下反转字节序)下载与启动注意事项(以MX25UM51245为例)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是OPI DTR模式下反转字节序的Octal Flash在i.MXRT下载与启动注意事项. 在恩智浦官方参考设计板 MIMXRT595-E ...

  4. 痞子衡嵌入式:存储器大厂Micron的NOR Flash芯片特殊丝印设计(FBGA代码)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家讲的是存储器大厂Micron的NOR Flash芯片特殊丝印设计(FBGA代码). 痞子衡之前写过一篇文章 <J-Flash在Micron ...

  5. 痞子衡嵌入式:恩智浦MCU安全加密启动一站式工具NXP-MCUBootUtility用户指南

    NXP MCU Boot Utility English | 中文 1 软件概览 1.1 介绍 NXP-MCUBootUtility是一个专为NXP MCU安全加密启动而设计的工具,其特性与NXP M ...

  6. 痞子衡嵌入式:利用i.MXRT1xxx系列ROM提供的FlexSPI driver API可轻松IAP

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT系列ROM中的FlexSPI驱动API实现IAP. 痞子衡的技术交流群里经常有群友提问: i.MXRT中的FlexSPI驱动 ...

  7. 痞子衡嵌入式:其实i.MXRT1050,1020,1015系列ROM也提供了FlexSPI driver API

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT1050/1020/1015系列ROM中的FlexSPI驱动API使用. 今天痞子衡去4S店给爱车做保养了,保养一次要等两小 ...

  8. 痞子衡嵌入式:利用i.MXRT1060,1010上新增的FlexSPI地址重映射(Remap)功能可安全OTA

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT部分型号上新增的FlexSPI Remap功能. OTA升级设计几乎是每个量产客户都绕不开的话题,产品发布后免不了要做固件( ...

  9. 痞子衡嵌入式:恩智浦i.MX RT1xxx系列MCU硬件那些事(2.3)- 串行NOR Flash下载算法(J-Link工具篇)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是J-Link工具下i.MXRT的串行NOR Flash下载算法设计. 在i.MXRT硬件那些事系列之<在串行NOR Flash X ...

  10. 痞子衡嵌入式:原来i.MXRT1xxx系列里也暗藏了Product ID寄存器

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT1xxx系列里暗藏的Product ID寄存器. MCU 厂商在定义一个产品系列时,通常是会预先规划产品发展路线的(即会有一 ...

随机推荐

  1. 理解 SystemVerilog 中的循环与并发线程

    1. 首先理解 scope 的概念 除了常见的module.interface.class.task以及function等等,另外,begin-end block 和 fork-join block ...

  2. DW001 - 数据仓库理论知识

    数据仓库概念 数据仓库基本架构 数据集市概念 数据湖概念 数据仓库概念 数据仓库(Data Warehouse,DW)是一个面向主题的.集成的.非易失的.反映历史变化的.用来支持企业管理决策的数据集合 ...

  3. linux 删除文件提示 opration not permitted 处理方法(宝塔删除文件提示无法删除)

    问题描述:linux系统中使用rm -rf强制删除文件,提示 opration not permitted,无法删除成功(宝塔删除文件提示无法删除),该问题确定为已关闭所有安全软件及防止恶意篡改的软件 ...

  4. 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!

    效果 来具体介绍之前先来看看效果. 使用C#构建了一个简单的MCP客户端,以下为运行这个简单客户端的截图,同样可以在Cline等其它的一些MCP客户端中玩耍. 创建一个数据库表: 获取数据库中的所有表 ...

  5. Arrays工具类教你优雅地管理数组数据

    数组专用工具类指的是 java.util.Arrays 类,基本上常见的数组操作,这个类都提供了静态方法可供直接调用.毕竟数组本身想完成这些操作还是挺麻烦的,有了这层封装,就方便多了. package ...

  6. go string转int strconv包

    前言 strconv 主要用于字符串和基本类型的数据类型的转换 s := "aa"+100 //字符串和整形数据不能放在一起 所以需要将 100 整形转为字符串类型 //+号在字符 ...

  7. 编写你的第一个 Django 应用程序,第8部分

    本教程从教程 7 停止的地方开始.我们已经构建了我们的网络投票应用程序,现在将查看第三方软件包. Django 的优势之一是丰富的第三方软件包生态系统.它们是社区开发的包,可用于快速改进应用程序的功能 ...

  8. 编写你的第一个 Django 应用程序,第1部分

    让我们通过示例来学习. 在本教程中,我们将引导您完成基本投票应用程序 它将由两部分组成: 一个公共网站,允许人们查看投票并在其中投票. 允许您添加.更改和删除投票的管理网站. 一.开发环境搭建 第一步 ...

  9. 如何在 PostgreSQL 中运行 TLS 回归测试

    概述 本文将分享一个简单的步骤,介绍如何在 PostgreSQL 中运行 SSL/TLS 回归测试. Postgres 回归测试 每当我们想要添加新功能或进行修复时,都应该运行 PostgreSQL ...

  10. MFC下北京时间与时间戳相互转换

    //时间戳转北京时间字串 CString getLocalDate(__int64 timestamp) { timestamp += 28800;//GTM偏移8个时区得到北京时间 tm p; gm ...