痞子衡嵌入式:恩智浦i.MX RT1xxx系列MCU硬件那些事(2.6)- 串行NOR Flash下载算法(MCUXpresso IDE篇)


  你们好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给你们介绍的是MCUXpresso IDE开发环境下i.MXRT的串行NOR Flash下载算法设计html

  在i.MXRT硬件那些事系列之《在串行NOR Flash XIP调试原理》一文中,痞子衡简单提了一下串行NOR Flash下载算法的概念,并无介绍具体设计细节,关于NOR Flash下载算法每一个IDE都有本身的一套设计,虽然基本设计理念是同样的,可是细节方面仍是有区别。在前面的文章里,痞子衡分别介绍过《J-Link下算法设计》《Keil MDK下算法设计》《IAR EWARM下算法设计》,今天痞子衡就来细聊MCUXpresso IDE下的NOR Flash下载算法:算法

1、MCUXpresso IDE各版本对i.MXRT的支持

  MCUXpresso IDE是飞思卡尔和恩智浦合并以后推出的全新IDE,这个IDE是免费的,可用于新恩智浦全系列ARM Cortex-M控制器(Kinetis、LPC、JN、QN、i.MXRT等)。熟悉这两家公司的人应该知道,其实MCUXpresso IDE就是原恩智浦LPCXpresso IDE与原飞思卡尔Kinetis Design Studio IDE的合体。微信

  从恩智浦官网上看,目前最新的MCUXpresso IDE版本是v11.2.1,其可以支持目前全部已量产的i.MXRT系列。从 MCUXpresso IDE历史各版本Release Note 上看,咱们能够看到其各版本对i.MXRT支持状况以下:ide

各版本下载地址:https://nxp.flexnetoperations.com/control/frse/product?child_plneID=756637&ver=ARC函数

  MCUXpresso IDE对新MCU型号的支持虽然并非与自身版本严格绑定,但经过相似打patch的方式比较复杂,且官方不支持这么作,反正这个IDE是免费的,升级又不要钱,也不须要申请license,最好仍是经过安装最新版本的方式来实现新型号的支持。flex

2、为当前MCUXpresso IDE增长新下载算法支持

  痞子衡安装的是最新的v11.2.1,咱们觉得RT600这颗芯片新增flash下载算法为例介绍MCUXpresso IDE下的使用。在开始以前要特别强调一下MCUXpresso IDE与MDK/IAR很是不一样的地方,MDK/IAR自带的flash下载算法是跟具体硬件仿真器无关的,它能够在全部支持的仿真器(JLink/DAPLink等)下正常使用,可是MCUXpresso IDE自带的flash下载算法只能在CMSIS-DAP类型的仿真器下使用。若是你在MCUXPresso IDE下使用JLink,那么下载算法只能用JLink的算法。ui

  如今咱们随便打开一个i.MXRT600 SDK工程,右击工程进入Properties设置界面,在MCU Settings下能够看到LinkServer Flash Driver的设置界面,这里就是选择flash下载算法。MCUXpresso IDE默认自带了很是多的flash下载算法(文件后缀名是.cfx,其实就是可执行文件elf),即便是同一颗芯片RT600,能够看到其有不少个.cfg可选,这分别对应了不一样的flash种类以及与主芯片链接端口。.net

  若是默认选择的Flash下载算法文件不适用你的板子,那么你须要本身提供合适的算法文件(.cfx),并将其放入MCUXpresso IDE安装目录下(\MCUXpressoIDE_11.2.1_4149\ide\binaries\Flash),从新打开工程选项,新增的算法会自动刷新到待选算法列表:设计

3、NOR Flash下载算法设计

  MCUXpresso IDE下Flash下载算法是公开的,\MCUXpressoIDE_11.2.1_4149\MCUXpresso_IDE_User_Guide.pdf 文档的 LinkServer Flash Support 章节有一些使用方面的介绍,能够看一下。3d

3.1 下载算法模板工程

  虽然下载算法自己是公开的,但设计文档不多,只给了示例工程。但对于工程师来讲,还有什么比给代码来得更直接呢。

  • 示例算法工程路径:\MCUXpressoIDE_11.2.1_4149\ide\Examples\Flashdrivers\NXP\iMXRT

  咱们就以iMXRT1050_QSPI.zip示例包里代码来分析其结构设计。这个示例包包含两个工程(LPCXFlashDriverLib和iMXRT1050_QSPI),须要先编译LPCXFlashDriverLib工程生成libLPCXFlashDriverLib.a,这个库是iMXRT1050_QSPI工程的源文件,而后编译iMXRT1050_QSPI工程生成咱们须要的算法文件MIMXRT1050-EVK_IS25WP064A.cfx。

  MCUXpresso IDE下载算法这种两级编译的设计,与IAR/MDK下载算法结构彻底不一样,这么设计的主要缘由是恩智浦ARM Cortex-M内核MCU产品线众多,而MCUXpresso IDE须要支持全部MCU,所以将公共设计的部分提取到了LPCXFlashDriverLib工程里(为了通用性,工程采用CM0指令集来编译)。此外,从工程名你就能看出,还保留着上一代LPCXpresso IDE的基因。

  LPCXFlashDriverLib工程有不少build,能够根据ServiceMessages.c文件里的条件编译宏了解到它们的差别,其中Release_SectorHashing工程是默认选择用于最终生成.cfx的,这个build主要是利用32 bit Fowler/Noll/Vo FNV-1a哈希算法对每一个Sector的数据下载作了校验。

  再到iMXRT1050_QSPI工程,这个工程就是采用具体MCU的内核指令集(CM7)来编译,在工程设置里能够看到连接了LPCXFlashDriverLib工程的Release_SectorHashing生成的.a文件,若是LPCXFlashDriverLib工程选择了其余build,这里也要相应改一下。

3.2 下载算法结构设计

  算法自己设计算是几个经常使用IDE里最复杂的一个了。iMXRT1050_QSPI工程除了通常的FlexSPI驱动外,有两个源文件FlashDev.c和FlashPrg.c,对这文件名有没有很熟悉?是的,这就是标准的CMSIS开源flash算法API定义,里面的内容也是相似的,这里就不赘述了,须要特别强调的是这些Flash擦写API并非MCUXpresso IDE在下载时实际调用入口。

  算法最核心的设计在LPCXFlashDriverLib工程,先看lpcx_flash_memdev.c里内容,这个文件里定义了一个重要的常量结构体MemoryDevice,这个MemoryDevice会被连接在算法执行区域(前64KB的DTCM)的起始位置(0x20000000),给MCUXpresso IDE调试器提供算法所有的信息。

// MemoryDevice Instance (fill it in)
EXTERN_MEMORY_DEVICE
MemoryDeviceMsg_t MemoryDevice =
{
  MEM_FLASH_VER2_MAJ+0x0,       // Version of flash interface
                                // Magic number to identify flash driver
                                // interface
  { 0x01, 0x23, 0x45, 0x00, 0x00, 0x54, 0x32, 0x10 },
  (uint32_t)&__load_base,         // Driver load address
  (uint32_t)&__image_size,        // Size of .text and .data
  (uint32_t)&__cache,             // RAM buffer location
  (uint32_t)&__cache_size,        // RAM buffer size
  (uint32_t)&__initial_sp,        // Stack top
  (uint32_t)&__stack_size,        // Stack size
  (uint32_t)&__opmap_val,         // Bitmap of available operations - 0 = everything there
  &FlashDevice,                   // Flash Device configuration
  ServiceMessages,                // Service mailbox flash operation message
  0                               // Reserved
};

  MemoryDevice有一个成员是ServiceMessages()函数,这个函数能够说是算法最灵魂的部分了,它才是MCUXpresso IDE调试器调用Flash擦写API的真正入口,调试器经过传入msg参数(所谓Mailbox结构)让算法来执行具体Flash操做并获得执行结果。这种特殊的设计可能也是MCXPpresso IDE算法仅能在CMSIS-DAP类型仿真器下使用的缘由吧。

  至此,MCUXpresso IDE开发环境下i.MXRT的串行NOR Flash下载算法设计痞子衡便介绍完毕了,掌声在哪里~~~

欢迎订阅

文章会同时发布到个人 博客园主页CSDN主页知乎主页微信公众号 平台上。

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

相关文章
相关标签/搜索