你们好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给你们介绍的是飞思卡尔i.MX RTyyyy系列MCU的BootROM功能简介。编程
截止目前为止i.MX RTyyyy系列已公布的芯片有三款i.MXRT105x, i.MXRT102x, i.MXRT106x,因此本文的研究对象即是这三款芯片,从参考手册来看,这三款芯片的BootROM功能差异不大,因此一篇文章能够归纳这三款芯片的BootROM特性。设计
Boot是任何一款MCU都有的特性。说起Boot,首先应该联想到的是FLASH,一般Cortex-M微控制器芯片内部通常都会集成FLASH(从FLASH分类上来看应该属于Parallel NOR FLASH),你的Application代码都是保存在FLASH里,每次上电CPU会自动从FLASH里获取Application代码并执行,这个行为就是Boot。
你们都知道,ARM Cortex-M内存使用的是统一编址,32bit总线的地址空间是4GB (0x00000000 - 0xFFFFFFFF)。打开最新的Arm®v6/7/8-M Architecture Reference Manual手册找到以下system address map表,你会发现ARM已经将这4GB空间内容给初步规划好了,各ARM Cortex-M微控制器厂商在设计芯片时通常都会遵照ARM规定。
从上述system address map表中咱们能够知道,ARM 4GB空间的前512MB(0x00000000 - 0x1FFFFFFF)规划为非易失性存储器空间。看到这,你是否是明白了为啥各大厂商生产的Cortex-M芯片内部FLASH地址老是从0x0开始,由于仅含FLASH的芯片上电启动默认都是从0x0地址开始获取Application的初始PC和SP开始Boot。3d
你们是否是也会常常在芯片参考手册里看到BootROM的字眼,BootROM是什么?BootROM实际上是芯片在出厂前固化在ROM里的一段Bootloader程序。这个Bootloader程序能够帮助你完成FLASH里的Application的更新,而不须要使用额外的外部编程/调试器(好比JLink),除了Application更新以外,固然BootROM也能够完成Application的启动,Bootloader通常提供UART/SPI/I2C/USB接口与上位机进行通讯,与Bootloader配套使用的还有一个上位机软件,当芯片从BootROM启动后,经过这个上位机软件与BootROM创建链接,而后能够将你的Application代码(bin/s19/hex格式)下载进芯片FLASH。
BootROM并非每一款MCU都有的。以飞思卡尔Kinetis系列MCU为例,早期的Kinetis产品好比MKL25并不含ROM,第一款支持ROM的Kinetis芯片是2014年推出的MKL03,而恩智浦的LPC系列以及意法半导体的STM32系列MCU通常都是含ROM的。不一样厂商芯片的ROM起始地址可能不同(Kinetis ROM通常从0x1c000000开始,LPC ROM通常从0x03000000开始,STM32 ROM结束地址是0x1FFFFFFF)。调试
当芯片既有ROM也有FLASH的时候,便会出现Boot位置选择问题,标准术语称为Boot Mode。芯片上电CPU究竟是先从FLASH启动仍是先从ROM启动?关于这个问题,各芯片厂商的解决方案不同。
Kinetis的Boot Mode由FLASH偏移地址0x40d处的值(上电系统会自动将这个值加载到FTFx_FOPT寄存器中)以及NMI pin共同决定。LPC的Boot Mode由ISP[1:0]以及VBUS pins决定。STM32的Boot Mode由BOOT[1:0] pins决定。
下图为MK80的具体Boot Mode:
下图为LPC54114的具体Boot Mode:
下图为STM32F407的具体Boot Mode:
对象
SRAM存在于任何一款MCU中,它除了能够保存Application数据变量外,固然也能够存放Application代码以供CPU执行。可是SRAM是易失性存储器,存放的数据断电会丢失,因此从SRAM启动跟从FLASH/ROM启动性质不同。
从FLASH/ROM启动属于一级启动,不依赖除了Boot Mode选择以外的条件;而从SRAM启动属于二级启动,其须要借助裸芯片自己以外的外力引导一下才能完成。外力引导的方式有两种:一是借助于外部调试器,直接将Application下载进SRAM并将PC指向Application开始执行,其实这就是所谓的在SRAM调试;二是借助于事先存储在FLASH/ROM中的Bootloader程序,Bootloader会将存放在FLASH(或其余非易失性存储器,或者从上位机直接接收)中的Application先加载到SRAM里而后Jump过去执行。blog
有些MCU并无内部FLASH,因此会支持外接存储器,常见的外部存储器有QSPI NOR/NAND, SD/eMMC, SDRAM, Parallel NOR/NAND, SPI/I2C EEPROM等,MCU内部集成相应的存储器接口控制器,经过接口控制器能够轻松访问这些外部存储器。一个没有内部FLASH的MCU确定会有ROM(BootROM),由于必需要借助BootROM才能Boot存储在外部存储器的Application,因此从外部存储器启动也属于二级启动。
那么怎么理解从外部存储器启动?须要弄明白如下几个问题:
第一个问题:从外部NOR FLASH存储器启动(好比QSPI NOR/Parallel NOR/EEPROM)跟从内部FLASH启动有什么区别?最大的区别是从外部NOR FLASH启动本质上属于二级启动,其没法像内部FLASH那样直接启动,须要由Bootloader引导。即便技术上能够作到存储在外部NOR FLASH里的Application可以原地执行(XIP),但也须要Bootloader完成外部NOR FLASH的初始化以及XIP相关配置。
第二个问题:从外部NAND FLASH存储器启动(好比QSPI NAND/Parallel NAND/SD/eMMC)跟从NOR FLASH启动有什么区别?最大的区别是NAND FLASH没法像NOR FLASH那样能够XIP执行,这是由NAND FLASH原理决定的,由于NAND FLASH是按Page访问的而且容许坏块的存在,这意味着CPU没法直接从NAND FLASH取指和执行,必须先由Bootloader将存放在NAND FLASH中的Application先所有拷贝到内部SRAM中,而后从SRAM启动执行。
第三个问题:从外部SDRAM存储器启动跟从内部SRAM启动有什么区别?这里其实区别倒不大,两个都是易失性存储器,都没法直接启动,不过SRAM是直接挂在系统bus上,而SDRAM是挂在存储器接口控制器上,然后者须要Bootloader去作初始化。接口
在第一部分里讲了Boot基本原理以及各类Boot方式,那么i.MXRTyyyy Boot到底属于哪种?在回答这个问题以前咱们先看一下i.MXRT102x的system memory map(i.MXRT105x也相似,区别是ITCM/DTCM/OCRAM的size是512KB)。
从memory map里能够看到,i.MXRTyyyy支持存储类型一共有三种:一是96KB的ROM(即BootROM)、二是总容量3*256KB的RAM(OCRAM/DTCM/ITCM)、三是分配给外部存储器接口控制器(SEMC/QSPI)的2GB区域。看到这里你应该明白了,i.MXRTyyyy Boot方式主要是借助BootROM从外部存储器加载Application到内部SRAM/外部SDRAM/原地XIP执行。
那么i.MXRTyyyy到底支持从哪些外部存储器加载启动呢?翻看i.MXRTyyyy的参考手册里的System Boot章节,能够看到i.MXRT启动支持如下6种外部存储器:内存
- Serial(Multi-IO) NOR Flash via FlexSPI
- Serial(Multi-IO) NAND Flash via FlexSPI
- Parallel NOR Flash via SEMC
- RAW NAND Flash via SEMC
- SD/MMC via uSDHC
- Serial(1-bit SPI) NOR/EEPROM via LPSPI
其中Serial/Parallel NOR这两种Device能够XIP,其余4种Device没法XIP,须要拷贝到内部RAM或外接SDRAM里运行。关于具体如何从这6种Device启动,痞子衡下篇文章接着聊。flash
至此,飞思卡尔i.MX RTyyyy系列MCU的BootROM功能痞子衡便介绍完毕了,掌声在哪里~~~产品