大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是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. Codeforces Round #661 (Div. 3) D、E1 题解

    D. Binary String To Subsequences #贪心 #构造 题目链接 题意 给定一个\(01\)串\(s\),完全分割成若干子序列(注意,不要混淆子串与子序列的概念),其中的子序 ...

  2. C++基础练习1

    1 /* 2 //读入一个双精度浮点数,保留12位小数输出这个浮点数. 3 #include<iostream> 4 #include <iomanip> 5 using na ...

  3. 五. Webpack详解

    1. 什么是Webpack 1.1 引入 什么是webpack?这个webpack还真不是一两句话可以说清楚的. 我们先看看官方的解释:At its core, webpack is a static ...

  4. Docker 入门介绍

    Docker是什么 从发布到现在 docker一直很受关注,在一定程度是改变了软件行业 如果你还不知道 docker 是什么是不是有点out了,接下来我们来介绍docker是什么,解决了什么问题,好处 ...

  5. linux查看内存及磁盘使用情况

    1.查看当前目录 命令:   df -h       (统一每个目录下磁盘的整体情况) 2.查看指定目录 在命令后直接放目录名,比如查看"usr"目录使用情况: 命令:   df ...

  6. LeetCode 044 Wildcard Matching

    题目要求:Wildcard Matching Implement wildcard pattern matching with support for '?' and '*'. '?' Matches ...

  7. docker镜像无法删除 Error:No such image:xxxxxx

    前言 docker镜像无法删除,通过 docker images 查看镜像明明存在就是删除不了. 删除提示:Error:No such image:xxxxxxx 具体截图内容如下: 解决方法 进入目 ...

  8. Spring Boot 统一返回结果及异常处理

    在 Spring Boot 构建电商基础秒杀项目 (三) 通用的返回对象 & 异常处理 基础上优化.调整 一.通用类 1.1 通用的返回对象 public class CommonReturn ...

  9. 通过sql 语句将多行数据拼接到一行中

  10. PyQt(Python+Qt)学习随笔:QTreeView树形视图的uniformRowHeights属性

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 uniformRowHeights属性用于控制视图中所有数据项是否保持相同高度,所有高度都与视图中第 ...