笔者最近接触到一块IMXRT1160的双core板子,特依次来记录学习一下
1、IMXRT1160 板子介绍
介绍一下NXP的Demo板子,是一个双core的板子,Cortexm7和Cortexm4,总计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
- 可配置的512 TCM (默认256 data 和256 指令)
- 16个region的MPU
- NMI + 240 IRQ
- 带WFIWFE的睡眠和深度睡眠
- 支持SWD以及JTAG
- 双core锁步机制双核Lock-Step、SVN。
CortexM4内核:1个core,基于ARMv7-ME指令集, - AHB LMEM (对于TCM和cache的memory控制)
- 可配置的256KB的TCM,(默认128的指令TCM和128的数据TCM)
- 16KB的code bus cache和16KB的系统bus cache
- 集成TCM的ECC校验和代码奇偶校验
- FPU(浮点运算单元)、集成NVIC(可嵌套中断)、WIC(唤醒中断控制器)、MPU(内存保护单元)、MMCAU(加密加速单元)和MCM(复杂控制模块)
2、IMXRT1160 内存布局
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:CM4和CM7的外设地址,从这里可以看出来,外设是共享的,两者都可以访问。
可以通过NXP的IDE MCUXPRESS的例程里面看到相关的memory配置。
通过上面可以看到,代码执行在0x30000000位置,0x20000000是CM7数据位置,rpmsh_sh_mem是双核共享的空间。
当然从这里我们也可以推测其是XIP(excute in place),在Flash上面执行代码。
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被用户使用,那么该空间需要保留出来。
3、IMXRT1160板子 boot启动
IMXRT1160的启动方式较为多样,上面已经介绍,主要有以下几种方式。通过对Boot Mode的两个输入引脚采样,来决定才有什么方式来Boot。
- 从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的流程如下:
Image Vector Table:Image的向量表如下: