痞子衡嵌入式:恩智浦i.MX RT1xxx系列MCU启动那些事(1)- Boot简介


  大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是恩智浦i.MX RT1xxx系列MCU的BootROM功能简介

  截止目前(2019年12月)为止i.MX RT1xxx系列已公布的芯片有七款i.MXRT105x, i.MXRT1021, i.MXRT106x,i.MXRT1015, i.MXRT1064 SIP, i.MXRT1011, i.MXRT117x,所以本文的研究对象便是这七款芯片,从参考手册来看,这七款芯片的BootROM功能差别虽有,但总体是一个架构,所以一篇文章可以概括这七款芯片的BootROM特性。

一、Boot基本原理

1.1 从内部FLASH启动

  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。

1.2 BootROM是什么

  大家是不是也会经常在芯片参考手册里看到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)。

1.3 Boot Mode选择

  当芯片既有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:

1.4 从内部SRAM启动

  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过去执行。

1.5 从外部存储器启动

  有些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去做初始化。

二、i.MXRT1xxx Boot方式

  在第一部分里讲了Boot基本原理以及各种Boot方式,那么i.MXRT1xxx Boot到底属于哪一种?在回答这个问题之前我们先看一下i.MXRT105x的system memory map(其他i.MXRT1xxx也类似,区别是BootROM/ITCM/DTCM/OCRAM的size不同)。

  从memory map里可以看到,i.MXRT1xxx支持存储类型一共有三种:一是96KB的ROM(即BootROM)、二是总容量512KB的FlexRAM(OCRAM/DTCM/ITCM)、三是分配给外部存储器接口控制器(SEMC/QSPI)的2GB区域。看到这里你应该明白了,i.MXRT1xxx Boot方式主要是借助BootROM从外部存储器加载Application到内部SRAM/外扩RAM/原地XIP执行

  那么i.MXRT1xxx到底支持从哪些外部非易失性存储器加载启动呢?翻看i.MXRT1xxx的参考手册里的System Boot章节,可以看到i.MXRT启动支持以下7种外部存储器:

  • Serial(Multi-IO) NOR Flash via FlexSPI
  • Serial(Multi-IO) NAND Flash via FlexSPI
  • Parallel NOR Flash via SEMC
  • SLC Raw NAND Flash via SEMC
  • SD Card via uSDHC
  • eMMC Card via uSDHC
  • Serial(1-bit SPI) NOR/EEPROM via LPSPI

  除了外部非易失性存储器之外,i.MXRT加载启动还支持以下2种外部易失性存储器:

  • SDRAM via SEMC
  • HyperRAM via FlexSPI

  上述非易失性存储器中Serial/Parallel NOR这两种Device可以XIP,其他5种Device无法XIP,需要拷贝到内部RAM或外接SDRAM/HyperRAM里运行。关于具体如何从这7种Device启动,痞子衡会在下篇文章继续聊。

三、i.MXRT1xxx Boot差异

  痞子衡在文章一开始说了,i.MXRT1xxx几款芯片BootROM功能是有差异的,这个差异主要体现在启动设备类型支持上,下面痞子衡用一个表格总结差异:

芯片 Serial NOR Serial NAND Parallel NOR SLC Raw NAND SD Card eMMC Card 1-bit SPI NOR SDRAM HyperRAM/PSRAM
i.MXRT118x 支持 支持 - 支持 支持 支持 支持 支持 支持
i.MXRT117x 支持 支持 - 支持 支持 支持 支持 支持 支持
i.MXRT116x 支持 支持 - 支持 支持 支持 支持 支持 支持
i.MXRT1064 支持 - - - 支持 支持 支持 支持 支持
i.MXRT106x 支持 支持 支持 支持 支持 支持 支持 支持 支持
i.MXRT105x 支持 支持 支持 支持 支持 支持 支持 支持 支持
i.MXRT104x 支持 支持 支持 支持 支持 支持 支持 支持 支持
i.MXRT1024 支持 - 支持 支持 支持 支持 - 支持 支持
i.MXRT1021 支持 支持 支持 支持 支持 支持 支持 支持 支持
i.MXRT1015 支持 支持 - - - - 支持 - 支持
i.MXRT1011 支持 - - - - - - - 支持

  至此,恩智浦i.MX RT1xxx系列MCU的BootROM功能痞子衡便介绍完毕了,掌声在哪里~~~

欢迎订阅

文章会同时发布到我的 博客园主页CSDN主页微信公众号 平台上。

微信搜索"痞子衡嵌入式"或者扫描下面二维码,就可以在手机上第一时间看了哦。

posted @ 2018-05-13 11:48  痞子衡  阅读(12911)  评论(11编辑  收藏  举报