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

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

一、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支持情况如下:

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

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

二、为当前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的算法。

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

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

三、NOR Flash下载算法设计

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

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主页知乎主页微信公众号 平台上。

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

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

  1. 痞子衡嵌入式:恩智浦i.MX RT1xxx系列MCU硬件那些事(2.4)- 串行NOR Flash下载算法(Keil MDK工具篇)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是Keil MDK工具下i.MXRT的串行NOR Flash下载算法设计. 在i.MXRT硬件那些事系列之<在串行NOR Flash ...

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

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是IAR开发环境下i.MXRT的串行NOR Flash下载算法设计. 在i.MXRT硬件那些事系列之<在串行NOR Flash XI ...

  3. 痞子衡嵌入式:恩智浦i.MX RT1xxx系列MCU硬件那些事(2.3)- 串行NOR Flash下载算法(J-Link工具篇)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是J-Link工具下i.MXRT的串行NOR Flash下载算法设计. 在i.MXRT硬件那些事系列之<在串行NOR Flash X ...

  4. 痞子衡嵌入式:恩智浦i.MX RT1xxx系列MCU启动那些事(13.A)- LPSPI NOR启动时间(RT1170)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是恩智浦i.MX RT1170 1bit SPI NOR恢复启动时间. 本篇是i.MXRT1170启动时间评测第三弹了,前两篇分别给大家评 ...

  5. 痞子衡嵌入式:恩智浦i.MX RT1xxx系列MCU启动那些事(11.3)- FlexSPI NOR连接方式大全(RT1010)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是恩智浦i.MX RT1010的FlexSPI NOR启动的连接方式. 在写完 <FlexSPI NOR启动连接方式(RT1015/ ...

  6. 痞子衡嵌入式:恩智浦i.MX RT1xxx系列MCU启动那些事(11.0)- FlexSPI NOR启动时间(RT1170)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是恩智浦i.MX RT1170 FlexSPI NOR启动时间. 痞子衡刚刚拿到i.MXRT1170 B0版本的芯片,迫不及待地在上面跑了 ...

  7. 痞子衡嵌入式:恩智浦i.MX RT1xxx系列MCU启动那些事(11.1)- FlexSPI NOR连接方式大全(RT1015/1020/1050)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是恩智浦i.MX RT1015/1020/1050三款MCU的FlexSPI NOR启动的连接方式. 由于i.MXRT内部没有非易失性存储 ...

  8. 痞子衡嵌入式:恩智浦i.MX RT1xxx系列MCU启动那些事(11.B)- FlexSPI NOR连接方式大全(RT1160/1170)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是恩智浦i.MXRT1160/1170两款MCU的FlexSPI NOR启动的连接方式. 这个 i.MXRT FlexSPI NOR 启动 ...

  9. 痞子衡嵌入式:飞思卡尔Kinetis系列MCU启动那些事(1)- KBOOT架构

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是飞思卡尔Kinetis系列MCU的KBOOT架构. Bootloader是嵌入式MCU开发里很常见的一种专用的应用程序,在一个没有Boo ...

随机推荐

  1. Linux 学习笔记03丨Linux文件系统、文件基本属性、目录处理及文件查看

    Chapter 2. 文件系统 2.1 Linux 系统目录结构 命令窗口下输入命令: $ ls /,能够看到根目录下的全部目录及文件 树状目录结构为: 最顶级的目录: / :根目录 / 是根目录,~ ...

  2. redis cluster可用性测试

    上一节,我们用三台redis组成了cluster,现在我们停掉一台试试: 比较奇怪的是,在停掉其中一台服务器之前建立的链接仍然可以正常执行命令,当我们断开重连时,命令就都被拒绝了: 关联知识: 什么时 ...

  3. 【mq读书笔记】mq消息存储

    comitlog文件 ConsumerQueue文件 IndexFile文件 RocketMQ将所有主题的消息存储在同一个文件中,确保消息发送时顺序写文件. 为了提高消息消费的效率RocketMQ引入 ...

  4. SpringIOC循环依赖

    目录 1. 什么是循环依赖 注意: 这⾥不是函数的循环调⽤,是对象的相互依赖关系. 循环调⽤其实就是⼀个死循环,除⾮有终结 条件. 2. 循环依赖处理机制 2.1 演示场景: 2.2 处理机制简图 总 ...

  5. 【Usaco 2009 Gold 】JZOJ2020年9月19日提高B组T2 电视游戏问题

    [Usaco 2009 Gold ]JZOJ2020年9月19日提高B组T2 电视游戏问题 题目 Description 农夫约翰的奶牛们游戏成瘾!本来FJ是想要按照陶叫兽的做法拿她们去电击戒瘾的,可 ...

  6. MinIO

    MinIO 是一个非常轻量的基于 Apache License v2.0 开源协议的对象存储服务.它兼容亚马逊 S3 云存储服务接口,非常适合于存储大容量非结构化的数据,例如图片.视频.日志文件.备份 ...

  7. JavaWeb知识梳理

    目录 JavaWeb Web服务器 技术讲解 Web服务器 Tomcat Http Maven pom.xml Servlet HelloServlet Servlet原理 Mapping Servl ...

  8. PyQt(Python+Qt)学习随笔:print标准输出sys.stdout以及stderr重定向QTextBrowser等图形界面对象

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 <在Python实现print标准输出sys.stdout.st ...

  9. pandas 聚合求和等操作

    参考:https://blog.csdn.net/m0_38139979/article/details/106606633 result1= result.groupby(['user_id', ' ...

  10. 【题解】The Last Hole! [CF274C]

    [题解]The Last Hole! [CF274C] 传送门:\(\text{The Last Hole!}\) \(\text{[CF274C]}\) [题目描述] 给出平面上 \(n\) 个圆的 ...