痞子衡嵌入式:解锁i.MXRTxxx上FlexSPI模块自带的地址重映射(Remap)功能
大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是i.MXRT三位数系列隐藏的FlexSPI Remap功能。
前段时间痞子衡写了一篇文章 《利用i.MXRT1060,1010上新增的FlexSPI地址重映射(Remap)功能可安全OTA》,介绍了Remap功能在OTA设计中的重要性。如果你对比过i.MXRT三位数(RT500/600)和四位数(RT1xxx)的FlexSPI模块,你会发现它们是一样的,寄存器定义几乎完全一致。但是我们知道这两个系列又分别是来自不同平台(LPC/i.MX),i.MXRT三位数可没有i.MXRT四位数上用于存放Remap控制的IOMUXC_GPR模块,那么在i.MXRT500/600上到底有没有Remap功能呢?本文痞子衡将为你解答。
1. FlexSPI NOR系统映射地址
老规矩还是先看一下FlexSPI在i.MXRT三位数上的系统映射空间。因为内核架构的差异,分配的映射地址与i.MXRT1xxx上完全不同。
i.MXRT500中分配给FlexSPI的系统映射空间如下,两个FlexSPI各分配了128MB。
i.MXRT600中分配给FlexSPI的系统映射空间如下,一个FlexSPI分配了128MB。
2. FlexSPI Remap控制在哪里?
目前我们已经可以从恩智浦官网下载到i.MXRT600的SDK软件包和参考手册,i.MXRT500的资料暂时还没有公布。对于i.MXRT600,无论是在SDK软件包中的头文件还是在参考手册中搜索“Remap”关键字,都搜不到任何信息,莫非是没有Remap功能?
好了,痞子衡就不卖关子了,其实Remap功能是支持的,而且直接做到了FlexSPI模块里,控制寄存器也在FlexSPI里,就在FLEXSPI BASE地址偏移0x420的地方(模块有更新,但文档暂时没有同步更新):
typedef struct
{
__IO uint32_t HADDRSTART;
__IO uint32_t HADDREND;
__IO uint32_t HADDROFFSET;
} FLEXSPI_REMAP_Type;
#define FLEXSPI_REMAP ((FLEXSPI_REMAP_Type *)(FLEXSPI_BASE + 0x420u));
因为Remap控制嵌在FlexSPI模块寄存器里,所以对于有两个FlexSPI模块的i.MXRT500,Remap控制也有两组,相互独立,这点跟同样有两个FlexSPI模块的i.MXRT1060上Remap设计是不一样的。
3. FlexSPI Remap功能设计
虽然i.MXRT500/600上的Remap控制嵌在FlexSPI模块内部,但Remap设计依然是属于系统架构层面的,只是在AHB总线层面做一个地址重定向。下面是Remap控制寄存器:
Remap功能 | 对应控制寄存器 | |
---|---|---|
寄存器名 | 寄存器地址 | |
ADDR_START | HADDRSTART | FLEXSPI_BASE + 0x420 |
ADDR_END | HADDREND | FLEXSPI_BASE + 0x424 |
ADDR_OFFSET | HADDROFFSET | FLEXSPI_BASE + 0x428 |
Remap设计很简单,就是地址(addr)落在[ADDR_START, ADDR_END]里的AHB读访问,其实际访问到的是addr + ADDR_OFFSET位置处的数据。(注意ADDR_START, ADDR_END, ADDR_OFFSET都是4KB对齐的)
Remap功能及寄存器定义上基本跟i.MX1xxx保持一致,但有一个小区别,就是HADDRSTART寄存器的bit0同时也承担了Remap功能开关控制。
4. Remap对擦写Flash的影响
启用Remap功能后,调用FlexSPI NOR驱动函数去擦写Flash不会受影响,擦写Flash操作正常走的是FlexSPI IPG命令方式,数据没有经过AHB bus。
下面这段测试代码是在MIMXRT500-EVK上跑的,用ROM API驱动擦写0x08100000地址,擦写操作前加了一段Remap设置干扰,实测下来Remap设置对擦写没有任何影响,复位后去读Flash,操作的还是原0x08100000地址。
#define FLEXSPI0_REMAP ((FLEXSPI_REMAP_Type *)(FLEXSPI0_BASE + 0x420u));
flexspi_nor_config_t flashConfig;
serial_nor_config_option_t configOption;
configOption.option0.U = 0xc0403004;
uint32_t programBuffer[64];
for (uint32_t i = 0; i < sizeof(programBuffer); i++)
{
*((uint8_t *)programBuffer + i) = (uint8_t)(i & 0xFF);
}
g_bootloaderTree->flexspiNorDriver->get_config(1, &flashConfig, &configOption);
g_bootloaderTree->flexspiNorDriver->init(1, &flashConfig);
FLEXSPI0_REMAP->HADDRSTART = 0x08100000 | 0x01;
FLEXSPI0_REMAP->HADDREND = 0x08200000;
FLEXSPI0_REMAP->HADDROFFSET = 0x100000;
g_bootloaderTree->flexspiNorDriver->erase(1, &flashConfig, 0x100000, 0x100);
g_bootloaderTree->flexspiNorDriver->page_program(1, &flashConfig, 0x100000, programBuffer);
Remap寄存器因为在FlexSPI模块中,因此Remap设置代码要在FlexSPI模块初始化之后,仅有模块时钟被开启,模块寄存器才能正常赋值,否则不生效(实测时钟不打开,读写Remap寄存器永远是0,并且不产生HardFault)。
5. 关于ROM API传参的疑惑解释
最后再简单说一下第4节示例代码里一点让人疑惑的地方,我们是在MIMXRT500-EVK上做的测试,i.MXRT500有两个FlexSPI(0/1),Flash是连在FlexSPI0上,但是ROM API里的instance传参竟然需要是1(i.MXRT1060 ROM API的FLEXSPI0传参就是0),这是怎么回事?
下面是i.MXRT500 BootROM中根据instance获取FLEXSPI模块基址的函数代码,其是根据i.MXRT500头文件中FLEXSPI_BASE_PTRS定义来获取基址值的。
static FLEXSPI_Type *const g_flexSpiInstances[] = FLEXSPI_BASE_PTRS;
static FLEXSPI_Type *flexspi_get_module_base(uint32_t instance)
{
FLEXSPI_Type *baseAddr = NULL;
baseAddr = g_flexSpiInstances[instance];
return baseAddr;
}
而BootROM中用的i.MXRT500头文件中FLEXSPI_BASE_PTRS定义如下所示,有点奇怪,跟正式SDK里的定义不一致。其实也可以理解,BootROM是芯片设计阶段的产物,那时候头文件是初版,后期有变化也正常。
/** Array initializer of FLEXSPI peripheral base pointers */
#define FLEXSPI_BASE_PTRS \
{ \
(FLEXSPI_Type *)0u, FLEXSPI1, FLEXSPI2 \
}
至此,i.MXRT三位数系列隐藏的FlexSPI Remap功能痞子衡便介绍完毕了,掌声在哪里~~~
欢迎订阅
文章会同时发布到我的 博客园主页、CSDN主页、知乎主页、微信公众号 平台上。
微信搜索"痞子衡嵌入式"或者扫描下面二维码,就可以在手机上第一时间看了哦。
痞子衡嵌入式:解锁i.MXRTxxx上FlexSPI模块自带的地址重映射(Remap)功能的更多相关文章
- 痞子衡嵌入式:利用i.MXRT1060,1010上新增的FlexSPI地址重映射(Remap)功能可安全OTA
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT部分型号上新增的FlexSPI Remap功能. OTA升级设计几乎是每个量产客户都绕不开的话题,产品发布后免不了要做固件( ...
- 痞子衡嵌入式:i.MXRT中FlexSPI外设对AHB Burst Read特性的支持
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是FlexSPI外设对AHB Burst Read特性的支持. 痞子衡之前写过一篇关于FlexSPI LUT的文章 <从头开始认识i ...
- 痞子衡嵌入式:i.MXRT中FlexSPI外设不常用的读选通采样时钟源 - loopbackFromSckPad
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是i.MXRT中FlexSPI外设不常用的读选通采样时钟源 - loopbackFromSckPad. 最近碰到一个客户,他们在 i.MX ...
- 痞子衡嵌入式:揭秘i.MXRT1060,1010上串行NOR Flash冗余程序启动设计
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT1060,1010上串行NOR Flash冗余程序启动设计. 工业产品设计里经常会有冗余程序/备份程序设计的需求,因为在工业 ...
- 痞子衡嵌入式:了解i.MXRT1060系列ROM中串行NOR Flash启动初始化流程优化点
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是i.MXRT1060系列ROM中串行NOR Flash启动初始化流程优化点. 前段时间痞子衡写了一篇 <深入i.MXRT1050系 ...
- 痞子衡嵌入式:揭秘i.MXRTxxx系列上串行NOR Flash双程序可交替启动设计
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT500/600上串行NOR Flash双程序可交替启动设计. 在上一篇文章 <i.MXRT1170上串行NOR Fla ...
- 痞子衡嵌入式:恩智浦i.MX RTxxx系列MCU启动那些事(6.1)- FlexSPI NOR连接方式大全(RT600)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是恩智浦i.MX RT600的FlexSPI NOR启动的连接方式. 痞子衡前段时间一鼓作气写完了三篇关于i.MXRT1xxx系列Flex ...
- 痞子衡嵌入式:了解i.MXRTxxx系列ROM API及其与i.MXRT1xxx系列的差异
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRTxxx系列ROM API设计细节. 痞子衡之前写过两篇文章 <利用i.MXRT1xxx系列ROM提供的FlexSPI ...
- 痞子衡嵌入式:恩智浦i.MX RTxxx系列MCU启动那些事(6.B)- FlexSPI NOR连接方式大全(RT500)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是恩智浦i.MX RT500的FlexSPI NOR启动的连接方式. 这个i.MXRT FlexSPI NOR启动连接方式系列文章,痞子衡 ...
随机推荐
- SpringBoot实现前后端数据交互、json数据交互、Controller接收参数的几种常用方式
1.获取参数的集中常见注解 @PathVariable:一般我们使用URI template样式映射使用,即url/{param}这种形式,也就是一般我们使用的GET,DELETE,PUT方法会使用到 ...
- Qt子类化后qss设置背景色无效的问题
1.问题背景 在某个类中,用到了一个组合的widget,有按钮进度条等,类似于视频播放器按钮控制区和精度条(参考了很多feiyangqingyun的文章,感谢),调试正常后整理代码,为了提高代码可读性 ...
- 字节数组X中存放着 0~F共16个十六进制数,请将这些数以十六进制形式显示在屏幕上。
问题 字节数组X中存放着 0~F共16个十六进制数,请将这些数以十六进制形式显示在屏幕上. 代码 data segment x db 0,1,2,3,4,5,6,7,8,9,0ah,0bh,0eh,0 ...
- Python raw_input() 函数
python raw_input() 用来获取控制台的输入.高佣联盟 www.cgewang.com raw_input() 将所有输入作为字符串看待,返回字符串类型. 注意:input() 和 ra ...
- PHP xml_set_processing_instruction_handler() 函数
定义和用法 xml_set_processing_instruction_handler() 函数规定当解析器在 XML 文档中找到处理指令时被调用的函数. 处理指令包含在 <? 和 ?> ...
- 浅析FMT,CMT, SMT区别
FMT(fine-grained multithreading)又叫交叉多线程或指令交错多线程 – 每个时钟周期都进行线程的切换,多个线程交替执行,同一个周期只从一个线程发射指令到功能部件 ...
- Android Studio同时监听多个Button实现activity跳转
MainActivity.java: package com.example.test; import android.content.Intent; import android.os.Bundle ...
- 老板让我从上千个Excel中筛选数据,利用Python分分钟解决!
大家好,又到了Python办公自动化系列. 今天分享一个真实的办公自动化需求,大家一定要仔细阅读需求说明,在理解需求之后即可体会Python的强大! 很多人学习python,不知道从何学起.很多人学习 ...
- 全程干货,requests模块与selenium框架详解
requests模块 前言: 通常我们利用Python写一些WEB程序.webAPI部署在服务端,让客户端request,我们作为服务器端response数据: 但也可以反主为客利用Python的re ...
- 经典的IPC问题
Inter-Process Communication的缩写,含义是进程间通信,是指两个进程间交换数据的过程. 哲学家进餐问题 概述 哲学家进餐/思考 进餐需要两把叉子 每次拿一把叉子 如何预防死锁 ...