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 代码下载

待补充

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

哥斯拉、冰蝎、中国蚁剑在护网中流量特征分析,收藏起来当资料吧,24年护网用得上

护网哥斯拉、冰蝎、中国蚁剑流量分析 【点击免费领取】CSDN大礼包&#xff1a;《黑客&网络安全入门&进阶学习资源包》&#x1f517;包含了应急响应工具、入侵排查、日志分析、权限维持、Windows应急实战、Linux应急实战、Web应急实战。 护网中最担心的是木马已经到了服…

CV每日论文--2024.6.4

1、Mixed Diffusion for 3D Indoor Scene Synthesis 中文 标题&#xff1a;用于 3D 室内场景合成的混合扩散 简介&#xff1a;这篇论文提出了一种名为MiDiffusion的混合离散-连续扩散模型,用于从给定的房间类型、平面图和可能存在的物体中合成逼真的3D室内场景。 作者指出,该…

芯片验证分享5 —— 激励开发3

大家好&#xff0c;我是谷公子&#xff0c;上节课跟大家分享了黑盒技术中的等价类分析和边界值分析方法。我们这次来分享下黑盒设计中的其它技术。 边界值分析和等价类划分的一个弱点是没有对输入条件的组合进行分析。对输入组合进行验证并不是简单的事情&#xff0c;因为即使…

Linux 36.3 + JetPack v6.0@jetson-inference之语义分割

Linux 36.3 JetPack v6.0jetson-inference之语义分割 1. 源由2. segNet2.1 命令选项2.2 下载模型2.2.1 Cityscapes2.2.2 DeepScene2.2.3 MHP2.2.4 VOC2.2.5 SUN 2.3 操作示例2.3.1 单张照片2.3.2 多张照片2.3.3 视频 3. 代码3.1 Python3.2 C 4. 参考资料 1. 源由 分类和目标识…

指针的认识(野指针、规避野指针、assert宏断言)

目录 a.野指针成因 1.指针未初始化 2.指针越界访问 3.指针指向的空间释放 b.规避野指针 1.指针初始化 2.小心指针越界 3.指针变量不再使用时&#xff0c;及时置NULL&#xff0c;指针使用之前检查有效性 4.避免返回局部变量的地址 c.assert宏断言的使用 概念&#xff1…

【Kubernetes】k8s的调度约束(亲和与反亲和)

一、调度约束 list-watch 组件 Kubernetes 是通过 List-Watch 的机制进行每个组件的协作&#xff0c;保持数据同步的&#xff0c;每个组件之间的设计实现了解耦。 用户是通过 kubectl 根据配置文件&#xff0c;向 APIServer 发送命令&#xff0c;在 Node 节点上面建立 Pod 和…

Qt/C++音视频开发76-获取本地有哪些摄像头名称/ffmpeg内置函数方式

一、前言 上一篇文章是写的用Qt的内置函数方式获取本地摄像头名称集合&#xff0c;但是有几个缺点&#xff0c;比如要求Qt5&#xff0c;或者至少要求安装了多媒体组件multimedia&#xff0c;如果没有安装呢&#xff0c;或者安装的是个空的呢&#xff0c;比如很多嵌入式板子&am…

js

<!DOCTYPE html> <html><head><meta charset"utf-8"><title>Document</title></head><body><input type"button" values"点击" onclick"alert(hahaha)"><script>alert(&…

【开源三方库】Fuse.js:强大、轻巧、零依赖的模糊搜索库

1.简介 Fuse.js是一款功能强大且轻量级的JavaScript模糊搜索库&#xff0c;支持OpenAtom OpenHarmony&#xff08;以下简称“OpenHarmony”&#xff09;操作系统&#xff0c;它具备模糊搜索和排序等功能。该库高性能、易于使用、高度可配置&#xff0c;支持多种数据类型和多语…

界面控件DevExpress WinForms的流程图组件 - 可完美复制Visio功能(二)

DevExpress WinForms的Diagram&#xff08;流程图&#xff09;组件允许您复制Microsoft Visio中的许多功能&#xff0c;并能在下一个Windows Forms项目中引入信息丰富的图表、流程图和组织图。 P.S&#xff1a;DevExpress WinForms拥有180组件和UI库&#xff0c;能为Windows F…

Solidworks 提取模型中的零件,并组合成一个新的零件,放入特征库

对方发来一个STP文件&#xff0c;其中有模型的部分零件想为我所用。 Shift键鼠标左键 选取需要的零件 在选好零件上右键&#xff0c;选择“孤立” 左边找到部件&#xff0c;ctrl左键选中&#xff0c;选择“插入到新零件” 点 绿色 勾 就选择保存类型&#xff0c;完成 。 打开这…

【技术】工业机器人机械臂安装高速电主轴打磨去毛刺

随着现代工业的发展&#xff0c;机械加工在制造业中扮演着至关重要的角色。然而&#xff0c;机械加工后的零件普遍存在着毛刺问题。这些毛刺不仅影响了零件的外观&#xff0c;更对工序的定位、产品的装配以及性能产生了不良影响&#xff0c;甚至可能导致机械设备损坏等严重事故…

计算机专业本科就业还是考研?考研有哪些热门方向?

考研并不是一个逃避就业的避难所&#xff0c;也不是一个简单的提升待遇的手段。考研是提升自我的途径&#xff0c;特别是对于那些对特定技术领域有浓厚兴趣并愿意深入研究的人来说 一个本科生能够认真学三年&#xff0c;那么他们所掌握的技能和知识不应该逊色于那些通过短期培…

作为表达式调用时,无法解析类修饰器的签名。vue3+ts+vite,使用装饰器时报错

作为表达式调用时&#xff0c;无法解析类修饰器的签名。 The runtime will invoke the decorator with 2 arguments, but the decorator expects 1.ts(1238) 页面也无法打开 解决方案&#xff1a; {"extends": "vue/tsconfig/tsconfig.dom.json","in…

利用Qss切分图片、使用图标

之前一直没有弄明白&#xff0c;现在明白了&#xff0c;记录一下&#xff01; 一般形式如下&#xff1a; border-image: url(:/icon_btn_menu_40x36.png) 0 80 0 0; 在原始图片上、上右下左、各切一刀、形成的图片区域、即为所取图标。 切的位置分别是距离最上、最右、最下…

09.爬虫---正则解析爬取数据

09.正则解析爬取数据 1.目标网站2.具体实现3.正则表达式分析4.完整代码并存入表格 1.目标网站 直达目标网站 https://movie.douban.com/chart 2.具体实现 我们来拿取一下上面网页的代码如下: from urllib import requesturl https://movie.douban.com/chart headers {Us…

oracle 数字或者小数格式化

select trim(. from to_char(1,fm9999990.9999)),trim(. from to_char(0.1,fm9999990.9999)) from dual

yolov8-obb 旋转目标检测 瑞芯微RKNN芯片部署、地平线Horizon芯片部署、TensorRT部署

特别说明&#xff1a;参考官方开源的yolov8代码、瑞芯微官方文档、地平线的官方文档&#xff0c;如有侵权告知删&#xff0c;谢谢。 模型和完整仿真测试代码&#xff0c;放在github上参考链接 模型和代码。 折腾旋转目标检测的小伙伴们看过来&#xff0c;yolov8旋转目标检测部署…

使用高德地图JS API 开发一些常见使用问题(急救包)

本文记录开发使用高德地图JS API 开发一些常见使用问题 API文档 &#x1f449;传送门 关于如何引入高德地图JS API方式 请移步前面文章&#x1f449;使用高德地图JS API 开发一些常见使用方法&#xff08;急救包&#xff09; 前篇&#x1f449;: 使用高德地图JS API 开发——…

面试官:Spring 启动过程是什么样的?详细讲讲你自己的理解!

引言&#xff1a;在面试中&#xff0c;对于 Java 开发者来说&#xff0c;掌握 Spring 框架的原理和使用是至关重要的。其中&#xff0c;了解 Spring 的启动流程、循环依赖问题的解决方法以及与设计模式相关的内容是常见的面试题目。 题目 面试官&#xff1a;Spring 启动过程是…