ARM学习(28)NXP 双coreMCU IMX1160学习

笔者最近接触到一块IMXRT1160的双core板子,特依次来记录学习一下

1、IMXRT1160 板子介绍

介绍一下NXP的Demo板子,是一个双core的板子,Cortex-M7Cortex-M4,总计1MB的RAM空间,256KB的ROM空间,提供了丰富的内存接口,包括SDRAM、Nand Flash、Nor Flash、SD/eMMC,QSPI以及HyperRAM FLash。支持从fuseboot、ISP 串行下载和内部boot启动。

模块结构框图如下:
在这里插入图片描述

板子框图如下:
在这里插入图片描述
内部boot启动支持多种启动:
在这里插入图片描述
支持DAP-Link和Jtag调试。DAP-LINK或者OpenSDA,可参考这篇文章:OpenSDA调试器背景与架构。

再来看一下其内核的特性:
CortexM7内核:一个core,基于arm V7E-M

  • 64位,AMBA4 AXI总线,32位 AHB 外设端口,32位AMBA AHB 从机端口,AMBA APB Coresight debug组件
  • 32KB的指令cache以及32KB的带ECC校验的数据cache
  • 可配置的512KB TCM (默认256KB data 和256KB 指令)
  • 16个region的MPU
  • NMI + 240 IRQ
  • 带WFI 、WFE的睡眠和深度睡眠
  • 支持SWD以及JTAG
  • 双core锁步机制。
    在这里插入图片描述
    CortexM4内核:1个core,基于ARMv7-ME指令集,
  • AHB LMEM (对于TCM和cache的memory控制)
  • 可配置的256KB的TCM,(默认128KB的指令TCM和128KB的数据TCM)
  • 16KB的code bus cache和16KB的系统bus cache
  • 集成TCM的ECC校验和代码奇偶校验
  • FPU(浮点运算单元)、集成NVIC(可嵌套中断)、WIC(唤醒中断控制器)、MPU(内存保护单元)、MMCAU(加密加速单元)和MCM(复杂控制模块)

在这里插入图片描述

2、IMXRT1160 内存布局

内存布局比较重要,外设访问,boot启动,代码缓存等等都与内存相关,可以看到一些相关的信息,尤其是双core,更是这样,涉及到共享内存,外设是否独立或者共享等等。

2.1 M7内存布局

在这里插入图片描述

在这里插入图片描述
memory说明:

  • 0x80000000:SEMC接口,可以接SDRAM,
  • 0x30000000:FlexSPI,可以作为QSPI访问Flash,作为mempory memory map的存放flash的地址。
  • 0x20360000: 128KB的 专有的OCRAM/FlexRAM空间
  • 0x20200000:64KB,可作为双core共享空间
  • 0x202C0000:64KB,可作为双core共享空间
  • 0x20200000:映射到M4的空间,256KB,作为CM4运行代码的位置,也是M4TCM的位置,这部分如果CM4 断电情况下,CM7无法访问。
  • 0x20000000:DTCM的位置,可都配置数据TCM,,可以配置256 KB DTCM,可最大配置512KB
  • 0x00000000:ITCM的位置,可都配置为指令TCM,也可以配置256 KB ITCM,可最大配置512KB
  • 0x40000000 - 0x41000000:AIPS(ARM IP BUS)CM4和CM7的外设地址,从这里可以看出来,外设是共享的,两者都可以访问。

可以通过NXP的IDE MCUXPRESS的例程里面看到相关的memory配置。
在这里插入图片描述
通过上面可以看到,代码执行在0x30000000位置,0x20000000是CM7数据位置(DTCM,rpmsh_sh_mem是双核共享的空间。

当然从这里我们也可以推测其是XIP(excute in place),在Flash上面执行代码,因为没有其他的空间来存放代码,等下通过Boot启动来确认一下。

2.2 M4内存布局

在这里插入图片描述
在这里插入图片描述
memory说明:

  • 0x20200000:64KB,可作为双core共享空间
  • 0x202C0000:64KB,可作为双core共享空间
  • 0x20200000:CM4的空间,256KB,OCRAM,可以用来放数据和代码,
  • 0x20000000:System TCM(128KB),映射到 0x20220000,存放数据
  • 0x1FE00000:Code TCM (128KB),映射到 0x20200000,存放代码,
  • 0x08000000:FlexSPI,可以接QSPI,作为CM4的启动代码位置。

NXP的IDE MCUXPRESS的例程里面看到相关的memory配置。
在这里插入图片描述

2.3 ROM的空间

在这里插入图片描述

  • 0x00200000:ROM的空间位于0x00200000,大小是256KB
  • 0x20240000:ROM所占用的RAM空间,所以不能作为boot image的一部分,当ROM code执行完成之后,可以释放出来使用。如果ROM的API被用户使用,那么该空间需要保留出来。

简单说一下ROM的特性:

  • 支持不同boot 设备启动
  • 支持串行(UART、USB-HID)下载
  • 支持Device Configuration Data 设置数据配置
  • 支持secure boot,带签名的高保障性boot
  • 支持拓展的内存配置数据
  • 支持FlexSPI Nor加密的XIP方式(加密引擎和AES解密)

对于secure boot,就是对启动的Image进行检验,验证过了才可以执行,否则就停留在boot或者是老的Image。

  1. 引导ROM的一个关键功能是能够执行安全引导,也称为高保证引导(HAB)。这是由HAB安全库支持的,该库是ROM代码的子组件。HAB使用硬件和软件的组合以及公钥基础设施(PKI)协议来保护系统不执行未经授权的程序Image。

  2. 在HAB允许执行用户Image之前,必须对Image进行签名。签名过程在Image构建过程中完成私钥加密的过程,然后签名被包括作为最后程序Image的一部分。如果配置为这样做,则ROM使用程序Image中包含的公钥来验证签名。除了支持数字签名验证来验证程序Image之外,还支持加密引导。

  3. 加密引导可用于防止直接从引导设备克隆程序Image。可以在上支持的所有引导设备上使用HAB进行安全引导除了串行下载器之外的芯片。引导ROM中的HAB库还提供API功能,允许额外的引导链组件(例如引导加载器、应用程序)扩展安全引导链。SEC_CONFIG的出厂设置是开放配置,其中ROM/HAB执行Image认证,但忽略所有认证错误,并且仍然允许执行图像。

3、IMXRT1160板子 boot启动

IMXRT1160的启动方式较为多样,上面已经介绍,主要有以下几种方式。通过对Boot Mode的两个输入引脚采样,来决定才有什么方式来Boot。
在这里插入图片描述
boot的core也可以被配置,通过BT_CORE_SEL来进行选择,BT_CORE_SEL为0,则M7core启动,如果为1,则M4启动,M4启动相对慢一些。
在这里插入图片描述

  • 从Fuse boot
  • 串行download下载
  • 内部boot
  • NXP内部保留使用
    在这里插入图片描述

3.1 Fuse Boot

与 Internal Boot 非常类似,只有一个不一样的点,那就是GPIO Boot PIn引脚被忽略。rom code只使用Boot efuse 的设置。

启动流程由BT_FUSE_SEL的值来决定,

  • 如果为1,则从boot device来启动
  • 如果来0,则从串行下载启动。

首次板子运行时,BT_FUSE_SEL的值可能为1,但是boot device里面没有Image,可能无法启动,这个时候需要强制设置BT_FUSE_VAL为0,下载一个引导程序到Boot device,然后修改了BT_FUSE_SEL的值,下一次ROM code根据新的eFUSE设置就从boot device启动了。
在这里插入图片描述

3.2 Serial Downloader

通过串口或者USB-HID遵循一定的命令协议,来把用户的程序下载到板子里面。例如STM32的FlyMCU,也叫做ISP模式。就是利用ROM的来进行下载。

3.3 Internal Boot

从内部设备进行启动,方式比较多,通过boot的引脚来决定,如前面所述,这里介绍了串行Flash启动的方式。
在这里插入图片描述
在这里插入图片描述
boot device的配置如下:配置串行Flash的实例,Flash类型,是否自动检测RAM还是XIP方式等
在这里插入图片描述
在这里插入图片描述
串行Flashboot的流程如下:

  1. 首先进入Flex Nor的boot流程。
  2. 配置Flex SPI的引脚和时钟(30MHZ)进行基本的读取配置参数的操作或者Flash是否存在的检测。这些参数位于NorFlash地址的0x400的偏移位置,参数大小为512Byte。
  3. 基于读到的参数进行基本的配置。
  4. 是否是加密的XIP模式使能?
  5. 读取boot device的数据,包括起始地址以及长度等信息,读取Image Vector Table信息,这是用户Image的header信息,填充了用户的Image的地址地址以及大小等信息,方便搬移等等操作。
  6. 如果Image Header无效,Image继续搜索
  7. 如果Image Header有效,则判断是否是XIP方式,XIP可以通过boot data判断,boot data的start地址与读参数的数据的地址一致,则为XIP方式,如果不一致,则为Plain Imgae 方式,则需要从Flasn搬移到对应的RAM地址运行。
  8. 确定好的Image是否有效(栈的空间有效,以及跳转的地址有效),则跳转到对应的地址执行。
    在这里插入图片描述
    Flash配置参数如下:(配置参数开放,方便支持串行Flash、以及hyper Ram等启动方式)
    这个配置参数位置在代码开始位置的0x400偏移位置处
    在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
典型参数配置如下:参考NXP IDE。

const flexspi_nor_config_t qspiflash_config = {.memConfig ={.tag              = FLEXSPI_CFG_BLK_TAG,.version          = FLEXSPI_CFG_BLK_VERSION,.readSampleClkSrc = kFlexSPIReadSampleClk_LoopbackFromDqsPad,.csHoldTime       = 3u,.csSetupTime      = 3u,// Enable DDR mode, Wordaddassable, Safe configuration, Differential clock.controllerMiscOption = 0x10,.deviceType           = kFlexSpiDeviceType_SerialNOR,.sflashPadType        = kSerialFlash_4Pads,.serialClkFreq        = kFlexSpiSerialClk_133MHz,.sflashA1Size         = 16u * 1024u * 1024u,/* Enable flash configuration feature */.configCmdEnable   = 1u,.configModeType[0] = kDeviceConfigCmdType_Generic,/* Set configuration command sequences */.configCmdSeqs[0] ={.seqNum   = 1,.seqId    = 12,.reserved = 0,},/* Prepare setting value for Read Register in flash */.configCmdArgs[0] = (FLASH_DUMMY_VALUE << 3),.lookupTable ={// Read LUTs[0] = FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0xEB, RADDR_SDR, FLEXSPI_4PAD, 0x18),[1] = FLEXSPI_LUT_SEQ(DUMMY_SDR, FLEXSPI_4PAD, FLASH_DUMMY_CYCLES, READ_SDR, FLEXSPI_4PAD, 0x04),// Read Status LUTs[4 * 1 + 0] = FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x05, READ_SDR, FLEXSPI_1PAD, 0x04),// Write Enable LUTs[4 * 3 + 0] = FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x06, STOP, FLEXSPI_1PAD, 0x0),// Erase Sector LUTs[4 * 5 + 0] = FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x20, RADDR_SDR, FLEXSPI_1PAD, 0x18),// Erase Block LUTs[4 * 8 + 0] = FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0xD8, RADDR_SDR, FLEXSPI_1PAD, 0x18),// Pape Program LUTs[4 * 9 + 0] = FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x02, RADDR_SDR, FLEXSPI_1PAD, 0x18),[4 * 9 + 1] = FLEXSPI_LUT_SEQ(WRITE_SDR, FLEXSPI_1PAD, 0x04, STOP, FLEXSPI_1PAD, 0x0),// Erase Chip LUTs[4 * 11 + 0] = FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x60, STOP, FLEXSPI_1PAD, 0x0),// Set Read Register LUTs[4 * 12 + 0] = FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0xC0, WRITE_SDR, FLEXSPI_1PAD, 0x01),[4 * 12 + 1] = FLEXSPI_LUT_SEQ(STOP, FLEXSPI_1PAD, 0x00, 0, 0, 0),},},.pageSize           = 256u,.sectorSize         = 4u * 1024u,.ipcmdSerialClkFreq = 0x1,.blockSize          = 64u * 1024u,.isUniformBlockSize = false,
};

Image Vector Table:Image的向量表如下:

在这里插入图片描述
首先来说一下Image向量表的偏移位置,不同的Flash启动,其ROM 寻找的偏移位置不一样
在这里插入图片描述
本文介绍的FlexSPI Nor的偏移是0x1000,就是4K的位置。
在这里插入图片描述
Image向量表的结构如下,每个字段都是32位。
在这里插入图片描述

Image的header结构如下:Value=0x412000D1
在这里插入图片描述
通过最终的Imgae Code可以看到。
在这里插入图片描述
Entry:就是用户code的入口地址,便于ROM code跳转过去,
DCD:Device Configuration Data,设备的配置数据,用户如果有需要配置的外设信息,可以在此处按照相应的参数格式填写,没有填0

Boot Data:启动数据,Image的绝对地址,以及编程Image的大小信息,可以用来判断是否是XIP方式,如果是XIP方式,则boor data 里面的start地址就是Flash 的起始地方,否则就不是XIP方式。
不是XIP方式的boot data数据
在这里插入图片描述
是XIP方式的boot数据
在这里插入图片描述
self:指示着IVT 表的地址,rom code用来使用,确定IVT的地址是否合法。

4、IMXRT1160 代码下载

待补充

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/22086.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Window10磁盘的分盘和合并

注意&#xff1a; 当我们c盘不够大需要扩大磁盘空间时&#xff0c;当c盘后面没有未划分的磁盘时候&#xff0c;我们是无法进行扩充c盘的&#xff0c;此时&#xff0c;我们可以先删除后面一个磁盘&#xff0c;再进行扩大。 如下&#xff1a;c盘后没有未分配的空间&#xff0c;…

【项目管理常见问题大揭秘】每个管理者都要Get的「五维思维」~

走上管理岗☸要懂得五维思维 &#x1f4bc;自我管理——做自己的CEO 严于律己&#xff1a;严格要求自己&#xff0c;注重个人品牌建设 宽以待人&#xff1a;接纳不同观点&#xff0c;提升团队凝聚力 尊重事实&#xff1a;鼓励团队成员发挥优势&#xff0c;避免负面评价 坚守诚…

求助:西莫电子期刊 交流互助 传递

点击上方 “机械电气电机杂谈 ” → 点击右上角“...” → 点选“设为星标 ★”&#xff0c;为加上机械电气电机杂谈星标&#xff0c;以后找夏老师就方便啦&#xff01;你的星标就是我更新动力&#xff0c;星标越多&#xff0c;更新越快&#xff0c;干货越多&#xff01; 关注…

Java面经——SpringCloud微服务

SpringCloud SpringCloud的五大组件 注册中心网关远程调用负载均衡熔断降级 谈谈你对SpringCloud的理解 SpringCloud是为了解决微服务架构中出现的一系列服务治理难题的而提出的一套规范&#xff0c;统一了标准。降低了微服务架构的开发难度。有了 Spring Cloud 这样的技术生…

【android 9】【input】【8.发送按键事件2——InputDispatcher线程】

系列文章目录 本人系列文章-CSDN博客 目录 系列文章目录 1.简介 1.1流程介绍 1.2 时序图 2.普通按键消息发送部分源码分析&#xff08;按键按下事件&#xff09; 2.1 开机后分发线程阻塞的地方 2.2 InputDispatcher::dispatchOnceInnerLocked 2.3 InputDispatcher::disp…

使用C语言实现贪吃蛇(超详细)

目录 实现贪吃蛇我们要知道哪些&#xff1f; Easyx图形库 Easyx的安装 游戏思路 游戏实现 头文件的使用 ​编辑和食物以及控制方向的初始化 对于坐标的实现&#xff1a; 食物颜色的实现&#xff1a; 游戏数据的初始化 加载音乐 图形窗口的设置&#xff1a; 蛇身节数…

【动手学深度学习】多层感知机之暂退法问题研究详情

目录 &#x1f30a;问题研究1 &#x1f31e;问题研究2 &#x1f332;问题研究3 &#x1f30d;问题研究4 &#x1f333;问题研究5 &#x1f30c;问题研究6 &#x1f30a;问题研究1 如果更改第一层和第二层的暂退法概率&#xff0c;会发生什么情况&#xff1f;具体地说&am…

深入理解指针(4)--新手小白都能明白的指针解析

深入理解指针(4)–新手小白都能明白的指针解析 文章目录 深入理解指针(4)--新手小白都能明白的指针解析1. 回调函数2. qsort使用举例2.1 冒泡排序2.2 qsort函数介绍2.3 用冒泡排序实现qsort 结语 1. 回调函数 回调函数就是⼀个通过函数指针调用的函数 如果我们把函数的指针&a…

玩转微服务-GateWay

目录 一. 背景二. API网关1. 概念2. API网关定义3. API网关的四大职能4. API网关分类5. 开源API网关介绍6. 开源网关的选择 三. Spring Cloud Gateway1. 文档地址2. 三个核心概念3. 工作流程4. 运行原理4.1 路由原理4.2 RouteLocator 5. Predicate 断言6. 过滤器 Filter6.1. 过…

[图解]建模相关的基础知识-02

1 00:00:01,530 --> 00:00:05,200 第2个概念&#xff0c;谓词&#xff0c;Predicate 2 00:00:07,530 --> 00:00:10,800 或者叫断言&#xff0c;翻译各种各样都有 3 00:00:12,830 --> 00:00:15,050 实际上就是前面命题 4 00:00:15,060 --> 00:00:16,610 相当于常…

记录Nuxt 3 官网项目的一次部署

本来以为就是一次简单的部署&#xff0c;之前也是部署过几次nuxt项目了&#xff0c;所以&#xff0c;并没有要记录的想法。但是过程出现了很多问题&#xff0c;最后考虑还是写下来吧。留个记录&#xff08;完整的配置部署过程&#xff09; 这里我将要说明两种部署方式以供选择&…

开源网安软件安全国产化替代解决方案亮相2024澳门万讯论坛

近日&#xff0c;2024万讯论坛在澳门成功举办。本次论坛由万讯电脑科技主办&#xff0c;旨在引进国内尖端科技厂商&#xff0c;提供全方位的信创解决方案&#xff0c;分享信创化过程中所面临的挑战及阶段性转换经验。开源网安作为拥有软件安全领域全链条产品的厂商&#xff0c;…

Analytical Model(分析模型)和Compact model(紧凑模型)有什么不同

Analytical Model&#xff08;分析模型&#xff09; 和 Compact Model&#xff08;紧凑模型&#xff09; 在电子工程和半导体物理领域有着不同的应用和特点&#xff1a; Analytical Model&#xff08;分析模型&#xff09;: 理论基础&#xff1a;分析模型基于物理原理和数学公…

jeecg dictText字典值

前端列表的字典值回显&#xff0c;配置了数据字典后&#xff0c;在本地测试可以回显中文的数据&#xff0c; 但在线上服务器不能正常回显出来&#xff1b; 原因是在前端拿到records的列表值时可以拿到dictText的字典&#xff0c;但是线上服务器没有dictText的值&#xff1b; …

聚焦 Navicat 17 新特性 | 模型设计优化与创新

随着 Navicat 17 的正式发布&#xff0c;受到了广泛的关注和讨论。Navicat 产品力又一次大跃迁。新引入的特性显著增强了用户的数据库管理和数据分析体验&#xff0c;包括&#xff1a;模型设计与同步、数据字典、数据分析&#xff08;data profiling&#xff09;、用户体验、查…

共享门店模式:快速打造连锁实体店

在数字化浪潮的冲击下&#xff0c;许多线下实体店正面临前所未有的挑战。然而&#xff0c;在这个变革的时代&#xff0c;共享门店模式&#xff0c;也被称为“共享股东”&#xff0c;正以其独特的魅力&#xff0c;为实体店带来新的生机。 一、共享门店模式的崭新定义 共享门店…

​水经微图Web版1.8.0发布

让每一个人都有自己的地图&#xff01; 水经微图&#xff08;简称“微图”&#xff09;新版已上线&#xff0c;在该版本中主要新增了注册登录功能&#xff0c;线与面图层新增矩形、圆或军标等绘制功能&#xff0c;以及其它功能的优化。 现在&#xff0c;为你分享一下本轮迭代…

PostgreSQL调优工具:PGTune

PostgreSQL调优工具&#xff1a;PGTune 1&#xff0c;PGTune网址 https://pgtune.leopard.in.ua/#/ 参数解释&#xff1a; DB Version&#xff1a;数据库版本 OS Type&#xff1a;操作系统 DB Type&#xff1a;数据库类型&#xff0c;一般默认即可 Total Memory (RAM)&#x…

巨详细Linux安装MySQL

巨详细Linux安装MySQL 1、查看是否有自带数据库或残留数据库信息1.1检查残留mysql1.2检查并删除残留mysql依赖1.3检查是否自带mariadb库 2、下载所需MySQL版本&#xff0c;上传至系统指定位置2.1创建目录2.2下载MySQL压缩包 3、安装MySQL3.1创建目录3.2解压mysql压缩包3.3安装解…

2 - 力扣高频 SQL 50 题(基础版)

2.寻找用户推荐人 考点: sql里面的不等于&#xff0c;不包含null -- null 用数字判断筛选不出来 select name from Customer where referee_id !2 OR referee_id IS NULL;