大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是i.MXRTxxx系列ROM中灵活的串行NOR Flash启动硬复位引脚选择

  关于 i.MXRT 系列 BootROM 中串行 NOR Flash 启动流程,痞子衡写过一篇非常详细的文章 《深入i.MXRT1050系列ROM中串行NOR Flash启动初始化流程》,这篇文章主要针对 i.MXRT1xxx 四位数系列,但基本上也适用 i.MXRTxxx 三位数系列,仅一些细节处有区别。

  在串行 NOR Flash 热启动过程中(非首次上电复位,而是单纯系统软复位 NVIC_SystemReset),有很多场景下均需要先复位一下 Flash ,将其恢复到默认的 Normal 模式,然后 Flash 才能被 BootROM 正常启动。这些场景包括 Flash 在上次系统运行时被配置到了某种特殊运行模式(QSPI 进入 Continuous Read 或者 QPI 模式,Octal Flash 进入 OPI 模式等),或者直接进到了低功耗模式(Deep Power Down)。

  本文就是介绍利用 BootROM 里集成的 Flash 硬复位功能来完成 Flash 复位操作。闲话少叙,进入正文:

  • 备注1:本文主要针对已量产的 i.MXRT500/600 。
  • 备注2:本文仅适用那些包含独立 RESET# 引脚的 Flash。

一、BootROM中实现

  在 《深入i.MXRT1050系列ROM中串行NOR Flash启动初始化流程》 一文的 2.1 节里,我们知道在 i.MXRT1xxx 四位数系列 BootROM 里同样集成了 Flash 硬复位功能,但是用于连接 Flash RESET# 引脚的 GPIO 是固定的(i.MXRT1050 上是GPIO1[9],i.MXRT1170 上是GPIO4[3] / GPIO2[8]),这对 PCB 设计有一定限制,如果被指定的 GPIO 在项目设计里有不可替代的功能,那只能放弃 BootROM 里这个 Flash 复位功能了。

  鉴于 i.MXRT1xxx 里 GPIO 指定不够灵活的缺陷,恩智浦 ROM 小组在 i.MXRTxxx 系列里做了改进,我们来看 i.MXRT600 的 fusemap 表,其中 BOOT_CFG[1] 里关于 QSPI_RESET_PIN 定义如下:

  我们看到了 3bit GPIO_PORT (0-7) 和 5bit GPIO_PIN_NUM (0-31) 设置,有了这个设置,用于连接 Flash RESET# 引脚 的 GPIO 选择就非常灵活了,基本可以涵盖所有 GPIO,因此项目 PCB 设计里只要随便找一个空闲的 GPIO 连到 Flash RESET# 引脚即可。

  该功能在 BootROM 里实现代码大概如下:

const clock_ip_name_t k_GpioClocks[8] = { kCLOCK_HsGpio0, kCLOCK_HsGpio1, kCLOCK_HsGpio2, kCLOCK_HsGpio3,
kCLOCK_HsGpio4, kCLOCK_HsGpio5, kCLOCK_HsGpio6, kCLOCK_HsGpio7 }; const RSTCTL_RSTn_t k_GpioResets[8] = { kHSGPIO0_RST_SHIFT_RSTn, kHSGPIO1_RST_SHIFT_RSTn, kHSGPIO2_RST_SHIFT_RSTn, kHSGPIO3_RST_SHIFT_RSTn,
kHSGPIO4_RST_SHIFT_RSTn, kHSGPIO5_RST_SHIFT_RSTn, kHSGPIO6_RST_SHIFT_RSTn, kHSGPIO7_RST_SHIFT_RSTn}; if (OCOTP->OTP_SHADOW[0x61] & 0x400)
{
// Initialize Reset Pin
uint32_t portInstance = (OCOTP->OTP_SHADOW[0x61] & 0x3800) >> 15;
uint32_t gpioInstance = (OCOTP->OTP_SHADOW[0x61] & 0x7c000) >> 18; // Enable Clock before accessing registers
CLOCK_EnableClock(k_GpioClocks[portInstance]);
RESET_PeripheralReset(k_GpioResets[portInstance]); // Configure the port to GPIO mode with pull-up resistor enabled.
IOPCTL->PIO[portInstance][gpioInstance] = IOPCTL_PIO_FSEL(0) | IOPCTL_PIO_PUPDENA(1) | IOPCTL_PIO_PUPDSEL(1) | IOPCTL_PIO_FULLDRIVE(1);
GPIO->DIRSET[portInstance] = (1u << gpioInstance); // High
GPIO->SET[portInstance] = (1u << gpioInstance);
flexspi_sw_delay_us(250);
// Low
GPIO->CLR[portInstance] = (1u << gpioInstance);
flexspi_sw_delay_us(250);
// High
GPIO->SET[portInstance] = (1u << gpioInstance);
flexspi_sw_delay_us(500);
}

二、在MIMXRT685-EVK上实践

  我们现在在官方 MIMXRT685-EVK 上实测一下这个功能,EVK 上选用的 Flash 型号是旺宏的 MX25UM51345G,这颗 Flash 有独立的 RESET# 引脚(A4),它被连到了主芯片的 PIO2_12 脚上。

  要想激活 BootROM 中 Flash 硬复位功能需要烧写 eFuse(也可以写相应 OCOTP Shadow Register 来替代,Shadow Register 只在上电或者触发 OCOTP refresh 命令时从 eFuse 中加载一次值,其后即使软复位 Shadow Register 值也不丢失),我们暂且用写 Shadow Register 方式来测试。

  正好前段时间痞子衡在做 SBL 项目写了篇文章 《在SBL项目实战中妙用i.MXRT1xxx里SystemReset不复位的GPR寄存器》,里面就有系统软复位需求,在支持 i.MXRT600 时就遇到了问题,因为第一次启动后 MIMXRT685-EVK 上的这颗 Octal Flash 被配置到了 OPI 模式,需要复位后才能正常被 BootROM 启动,所以我们直接就用上了 BootROM 里的 Flash 硬复位功能,代码很简单:

void isp_cleanup_enter(uint32_t flag)
{
CLOCK_EnableClock(kCLOCK_Rtc);
RTC->CTRL &= ~RTC_CTRL_SWRESET_MASK;
RTC->GPREG[0] = flag; // Reset Flash to normal mode by BootROM
// QSPI_RESET_PIN_ENABLE = 1'b1, GPIO_PORT = 3'b010, GPIO_PIN_NUM = 5'b01100
OCOTP->OTP_SHADOW[0x61] = 0x314000;
__DSB(); NVIC_SystemReset();
}

  至此,i.MXRTxxx系列ROM中灵活的串行NOR Flash启动硬复位引脚选择痞子衡便介绍完毕了,掌声在哪里~~~

欢迎订阅

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

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

痞子衡嵌入式:了解i.MXRTxxx系列ROM中灵活的串行NOR Flash启动硬复位引脚选择的更多相关文章

  1. 痞子衡嵌入式:深扒i.MXRTxxx系列ROM中集成的串行NOR Flash启动SW Reset功能及其应用场合

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRTxxx系列ROM中集成的串行NOR Flash启动SW Reset功能及其应用场合. 在串行 NOR Flash 热启动过程 ...

  2. 痞子衡嵌入式:深入i.MXRT1050系列ROM中串行NOR Flash启动初始化流程

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是深入i.MXRT1050系列ROM中串行NOR Flash启动初始化流程. 从外部串行NOR Flash启动问题是i.MXRT系列开发最 ...

  3. 痞子衡嵌入式:了解i.MXRT1060系列ROM中串行NOR Flash启动初始化流程优化点

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是i.MXRT1060系列ROM中串行NOR Flash启动初始化流程优化点. 前段时间痞子衡写了一篇 <深入i.MXRT1050系 ...

  4. 痞子衡嵌入式:在SBL项目实战中妙用i.MXRT1xxx里SystemReset不复位的GPR寄存器

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT1xxx里SystemReset不复位的GPR寄存器的小妙用. 我们知道稍大规模的项目代码设计一般都是多人协作完成的,在项目 ...

  5. 痞子衡嵌入式:恩智浦LPC系列MCU开发那些事 - 索引

    大家好,我是痞子衡,是正经搞技术的痞子.本系列痞子衡给大家介绍的是恩智浦LPC系列微控制器相关知识. 恩智浦半导体最早于2003年便开始推出LPC系列MCU,但早期的产品LPC2000/3000系列属 ...

  6. 痞子衡嵌入式:在i.MXRT启动头FDCB里使能串行NOR Flash的QPI/OPI模式

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是在FDCB里使能串行NOR Flash的QPI/OPI模式. 我们知道 Flash 读时序里有五大子序列 CMD + ADDR + MO ...

  7. 痞子衡嵌入式:揭秘i.MXRTxxx系列上串行NOR Flash双程序可交替启动设计

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT500/600上串行NOR Flash双程序可交替启动设计. 在上一篇文章 <i.MXRT1170上串行NOR Fla ...

  8. 痞子衡嵌入式:揭秘i.MXRT1060,1010上串行NOR Flash冗余程序启动设计

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT1060,1010上串行NOR Flash冗余程序启动设计. 工业产品设计里经常会有冗余程序/备份程序设计的需求,因为在工业 ...

  9. 痞子衡嵌入式:在i.MXRT启动头FDCB里使能串行NOR Flash的DTR模式

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是在FDCB里使能串行NOR Flash的DTR模式. 前两篇文章 <IS25WP系列Dummy Cycle设置> 与 < ...

随机推荐

  1. AI推理单元

    AI推理单元 推理服务供了一套面向 MLU(Machine Learning Unit,机器学习单元)设备的类似服务器的推理接口(C++11标准),以及模型加载与管理,推理任务调度等功能,极大地简化了 ...

  2. PyTorch 数据并行处理

    PyTorch 数据并行处理 可选择:数据并行处理(文末有完整代码下载) 本文将学习如何用 DataParallel 来使用多 GPU. 通过 PyTorch 使用多个 GPU 非常简单.可以将模型放 ...

  3. Yolov3&Yolov4网络结构与源码分析

    Yolov3&Yolov4网络结构与源码分析 从2018年Yolov3年提出的两年后,在原作者声名放弃更新Yolo算法后,俄罗斯的Alexey大神扛起了Yolov4的大旗. 文章目录 1. 论 ...

  4. mybatis 实现增删改查(CRUD)

    如何创建项目,注入依赖,编写核心配置文件.工具类.实体类这里就不详细说了,具体可以参考下边这条博文 https://www.cnblogs.com/bear7/p/12491937.html 这里将详 ...

  5. 并发王者课-铂金1:探本溯源-为何说Lock接口是Java中锁的基础

    欢迎来到<并发王者课>,本文是该系列文章中的第14篇. 在黄金系列中,我们介绍了并发中一些问题,比如死锁.活锁.线程饥饿等问题.在并发编程中,这些问题无疑都是需要解决的.所以,在铂金系列文 ...

  6. 深入Netty逻辑架构,从Reactor线程模型开始

    本文是Netty系列第6篇 上一篇文章我们从一个Netty的使用Demo,了解了用Netty构建一个Server服务端应用的基本方式.并且从这个Demo出发,简述了Netty的逻辑架构,并对Chann ...

  7. 【NX二次开发】Block UI 从列表选择部件

    属性说明 属性   类型   描述   常规           BlockID    String    控件ID    Enable    Logical    是否可操作    Group    ...

  8. ceph-csi源码分析(6)-rbd driver-nodeserver分析(下)

    更多 ceph-csi 其他源码分析,请查看下面这篇博文:kubernetes ceph-csi分析目录导航 ceph-csi源码分析(6)-rbd driver-nodeserver分析(下) 当c ...

  9. Redis的数据类型以及应用场景

    1. Redis的作用 1.1 Redis可以做什么 1.缓存:缓存机制几乎在所有的大型网站都有使用,合理地使用缓存不仅可以加快数据的访问速度,而且能够有效地降低后端数据源的压力.Redis提供了键值 ...

  10. Redis并发竞争key的解决方案详解

    1. 需求由来 1.Redis高并发的问题 Redis缓存的高性能有目共睹,应用的场景也是非常广泛,但是在高并发的场景下,也会出现问题:缓存击穿.缓存雪崩.缓存和数据一致性,以及今天要谈到的缓存并发竞 ...