痞子衡嵌入式:飞思卡尔i.MX RTyyyy系列MCU硬件那些事(2.2)- 在串行NOR Flash XIP调试原理


  你们好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给你们介绍的是飞思卡尔i.MX RTyyyy系列EVK在串行NOR Flash调试的原理算法

  本文是i.MXRT硬件那些事系列第二篇的续集,在第二篇首集中痞子衡给你们详细介绍了EVK板载调试器用法,有了调试器在手,今后调试不用愁。从调试代码所在目标存储器类别上来分,调试通常分为在SRAM调试和在Flash调试。在SRAM调试实现比较简单,程序直接从JTAG/SWD口灌进RAM便可;在Flash调试,则相对复杂一点,由于首先须要有Flash下载算法,下载成功后才能调试。
  一般的Cortex-M内核MCU通常都会内嵌并行NOR Flash,这个并行NOR Flash是直接挂在Cortex-M内核高性能AHB总线上的,知名IDE若是支持这款MCU,也都会同时集成对应Flash的下载算法,方便用户直接在IDE里下载代码进Flash和XIP调试,可是i.MXRT内部并无Flash,用户须要本身外接Flash,那该怎么办?还能在线XIP调试么?别着急,i.MXRT能够支持外接并行NOR和串行NOR实现XIP,从节省管脚数的角度,最多见的作法是将串行NOR Flash挂在i.MXRT FlexSPI总线上,FlexSPI支持XIP特性,因此原理上能够实如今线调试,今天痞子衡就为你们介绍i.MXRT上在外部串行Flash调试的原理:缓存

1、ARM CoreSight调试架构

  要实如今串行Flash调试,首先要能对内核进行调试。i.MXRT芯片是基于Cortex-M内核的,而Cortex内核的调试和跟踪,固然离不开CoreSight,它是ARM公司于2004年推出的一种新的调试体系结构,也是内核受权的一部分。
  CoreSight功能很是强大,其包含了不少调试组件(即各类协议),下图来自于 CoreSight技术简介手册,图中标出了CoreSight架构下的各类调试组件之间的联系,这么多组件一会儿看起来会有点晕,若是咱们按功能将这些组件分组,它们能够被分红以下三组:架构

  • 源部件(Source):芯片上跟踪数据的来源,产生跟踪数据发送到ATB(AMBA Trace Bus)。好比STM和ETM都属于Source部分。
  • 控制访问部件(Sink):配置和控制数据流的产生,可是不产生数据流,即那些能够保持从Source过来数据的模块。好比DAP和ECT(包含CTI和CTM)都属于Sink部分。
  • 汇聚点(Link):芯片上跟踪数据的终点,用于引导从Source到Sink过程当中的相似于通道做用的模块。好比TPIU、ETB和SWO都属于汇聚点。

  本文主要是概述性地介绍i.MXRT在外部串行Flash调试的原理,并不想深刻探析CoreSight,所以对于CoreSight,咱们只须要知道是它完成了主要的调试工做,而CoreSight惟一的依赖就是要保证能经过DAP组件从AMBA总线实时访问系统内存和外设寄存器(固然包括外部串行Flash中的代码)。app

2、i.MXRT FlexSPI外设特性

  要实如今串行Flash调试,其次是代码要能在串行Flash中XIP(原地执行),即CPU要能实时从串行Flash中任意位置取指令和数据。本文讲的串行Flash通常指SPI接口的NOR Flash,SPI模式能够是Single/Dual/Quad/Octal。不管是哪一种SPI模式,这种接口的Flash本质上都属于串行Flash,地址线和数据线不只共享并且是串行的。而按照一般的理解,要可以实现XIP,Flash应该是并行总线接口挂在AMBA上,这个并行总线应有独立的地址线和数据线,且地址线宽度跟Flash大小相对应。那么串行Flash为何能在i.MXRT上实现XIP呢?答案就是FlexSPI外设。
  让咱们打开RT1050参考手册,找到FlexSPI外设章节,能够看到以下FlexSPI模块框图,框图右边是FlexSPI与外部串行Flash的信号链接,框图左边是FlexSPI与i.MXRT系统内部总线链接,总线链接分为两种,分别是32bit IPS BUS(即手动操做FlexSPI寄存器发送Flash读写命令),64bit AHB BUS(由FlexSPI翻译AHB访问地址并自动发送相应Flash读写命令),串行Flash可以XIP的奥秘就在FlexSPI外设的AHB BUS链接。性能

  关于这个64bit AHB BUS链接,咱们能够FlexSPI特性里的Memory mapped read/write access by AHB Bus一栏找到更多细节。i.MXRT为FlexSPI外设在系统内存里分配了AHB访问地址映射(对于XIP调试来讲主要是读访问),当CPU取指到FlexSPI AHB地址映射空间时,FlexSPI外设会自动完成从外部串行Flash读取指令数据的工做,并将指令数据存放到AHB RX buffer里(一共8个),CPU直接从AHB RX buffer里获取指令去执行,AHB RX buffer能够有效下降读延时。fetch

  • AHB RX Buffer implemented to reduce read latency. Total AHB RX Buffer size: 128 x 64 Bits
  • 16 AHB masters supported with priority for read access
  • 8 flexible and configurable buffers in AHB RX Buffer
  • AHB TX Buffer implemented to buffer all write data from one AHB burst. AHB TX Buffer size: 8 x 64 Bits
  • All AHB masters share this AHB TX Buffer. No AHB master number limitation for Write Access.

  关于FlexSPI AHB地址映射,可见下面的RT1050 memory map表,AHB映射起始地址为0x60000000,最大支持504MB的空间(适用RT1010/RT1020/RT1050/RT1060)。若是是RT1064,AHB映射起始地址改成0x70000000;若是是RT1170,除了0x60000000映射地址外还新增了0x30000000的地址映射。FlexSPI AHB映射地址读访问包含如下特色:flex

  • Cachable and Non-Cachable access
  • Prefetch Enable/Disable
  • Burst size: 8/16/32/64 bits
  • All burst type: SINGLE/INCR/WRAP4/INCR4/WRAP8/INCR8/WRAP16/INCR16

3、串行NOR Flash下载算法

  要实如今串行Flash调试,最后要确保代码被成功下载到串行Flash中。串行Flash的读写不像访问RAM那样简单,是须要一套专门的FlexSPI NOR Flash驱动的,即所谓的Flash下载算法。
  串行Flash种类不少,虽然大多都符合JESD216标准,可是具体到某个厂家生产的Flash,仍是有细微区别的。有的Flash下载算法力求支持尽量多的Flash,而有的Flash下载算法则仅针对某个系列Flash。不论是哪一种Flash下载算法,对于i.MXRT这样没有内部Flash的芯片而言,Flash下载算法都是要跟具体的i.MXRT开发板相关联的,由于开发板决定了Flash链接的pinmux,Flash下载算法里FlexSPI管脚初始化要与开发板相匹配。
  每一个IDE的Flash下载算法设计不尽相同,本文暂不详细介绍具体Flash下载算法,后续文章会对常见IDE的Flash下载算法设计进行详解。this

4、在串行Flash调试过程

  CoreSight架构,FlexSPI特性,NOR Flash下载算法都介绍过了,在串行Flash调试的充分条件都有了。如今痞子衡为你们综合介绍一下调试过程。下面是痞子衡特意画的简图,其实调试过程概述起来并不复杂,当你启动IDE调试时,预先放在IDE里的Flash下载算法(可执行文件)会首先经过调试器下载到i.MXRT内部FlexRAM中,下载算法须要提供FlexSPI外设初始化和NOR Flash擦除、烧写功能API,而后调试器继续将应用程序代码(二进制机器码)分段缓存在FlexRAM里,并调用Flash下载算法API去完成应用程序的烧写(从FlexRAM到Flash中),应用程序彻底下载结束以后,便由CoreSight开始接管调试工做,此时CPU已经能够经过AHB总线访问挂在FlexSPI外设上的串行Flash里的应用程序代码数据,因此CoreSight固然能够完成实时代码运行控制与跟踪,你在IDE里也就能够进行单步调试啦。翻译

  至此,飞思卡尔i.MX RTyyyy系列EVK在串行NOR Flash调试的原理痞子衡便介绍完毕了,掌声在哪里~~~设计