痞子衡嵌入式:恩智浦i.MX RT1xxx系列MCU硬件那些事(2.5)- 串行NOR Flash下载算法(IAR EWARM篇)
大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是IAR开发环境下i.MXRT的串行NOR Flash下载算法设计。
在i.MXRT硬件那些事系列之《在串行NOR Flash XIP调试原理》一文中,痞子衡简单提了一下串行NOR Flash下载算法的概念,并没有介绍具体设计细节,关于NOR Flash下载算法每个IDE都有自己的一套设计,虽然基本设计理念是一样的,但是细节方面还是有区别。在前面的文章里,痞子衡分别介绍过《J-Link下算法设计》、《Keil MDK下算法设计》,今天痞子衡就来细聊IAR下的NOR Flash下载算法:
一、IAR各版本对i.MXRT的支持
IAR跟Keil一样都是非常经典的MCU开发IDE,可以说是难分伯仲,痞子衡求学期间就用IAR开发过MSP430单片机,但是只是浅尝辄止,因为搞ARM Cortex-M就切换到更熟悉的Keil下了,直到毕业后加入恩智浦才一直在用IAR。这么多年过去了,IAR还是当初那个独立小公司,没有被收购,而且依然保持竞争力,这一波RISC-V浪潮估计会让它超越被ARM束缚的Keil。
从IAR官网上看,目前最新的IAR EWARM版本是v8.50.6,其能够支持目前所有已量产的i.MXRT系列。如果你安装的不是最新版本,比如安装了v8.40,从 IAR历史各版本Release Note 上看,v8.40版本不支持RT500和RT600,那么如果想要支持新芯片(比如RT600),是不是一定要重新安装最新IAR呢?其实未必!
IAR对新MCU型号的支持并不是与自身版本严格绑定的,其增加新芯片的方式很灵活,只需要按要求打上相应芯片的patch包即可。
二、为当前IAR增加新i.MXRT型号支持
在 IAR历史各版本Release Note 页面点击 8.50 进入这个版本的专属页面,往下翻你会找到专门的i.MXRT600 patch包,直接下载这个包(ewarm850-nxp-imxrt5xx-6xx-patch4.zip文件)。
有了patch包之后,打patch就相当简单了,直接将ewarm850-nxp-imxrt5xx-6xx-patch4.zip包解压放到IAR安装目录下即可,patch包的文件目录结构与IAR下安装目录结构是一样的。
patch包里的文件很多,其中跟下载算法相关的一共如下四个文件:.board和.flash是xml文件,其功能类似JLink下的JLinkDevices.xml文件。.mac是预加载文件,功能类似JLink下的.JLinkScript文件,.out文件就是真正的下载算法可执行文件。
\arm\config\flashloader\NXP\FlashIMXRT600_EVK_FLEXSPI.board
\arm\config\flashloader\NXP\FlashIMXRT600_EVK_FLEXSPI.flash
\arm\config\flashloader\NXP\FlashIMXRT600_EVK_FLEXSPI.mac
\arm\config\flashloader\NXP\FlashIMXRT600_EVK_FLEXSPI.out
两个xml文件里的代码含义在 \IAR Systems\Embedded Workbench 8.50.6\arm\doc\FlashLoaderGuide.ENU.pdf 文档的 The flash memory configuration file 和 The flash memory system configuration file 两小节里有详细解释。
2.1 .board文件代码分析
.board顾名思义就是板级描述文件,每个.board文件可以指向多个.flash文件(如果这块板子存在多块flash)。让我们试着分析 FlashIMXRT600_EVK_FLEXSPI.board 文件中那些模板代码的含义:.board文件里可以有多个<pass>块,每个pass对应一种flash类型。在每个<pass>里最多有如下6个参数(其中loader参数是必须的,其他是可选):
loader -- 指示.flash文件路径。
range -- Flash在芯片内存中的映射空间范围。
abs_offset -- 当被下载的app链接地址与往Flash中下载的映射地址不同时,指示Flash下载地址。
rel_offset -- 作用与abs_offset类似,但是指示链接地址与下载地址间的偏移,可正可负。
flash_base -- Flash在芯片内存中的映射基地址,会覆盖.flash文件中同名参数。
args -- 传入下载算法FlashInit()函数,类argc/argv格式。
2.2 .flash文件代码分析
.flash就是flash描述文件了,这些信息最终会提供给调试器。让我们继续分析 FlashIMXRT600_EVK_FLEXSPI.flash 文件中那些模板代码的含义:.flash文件里最多有如下12个参数(其中前四个参数是必须的,其他是可选):
exe -- 指示下载算法文件(.out)路径。
flash_base -- Flash在芯片内存中的映射基地址。
page -- Flash的页大小。
block -- Flash的块数量及大小。
gap -- 标示Flash中块的无效区间,C-SPY会检查并返回错误。
macro -- 指示预加载文件(.mac)路径。
online -- 指示下载算法是否支持Flash断点。
filler -- 下载时的padding内容,默认255(0xFF).
checks -- 设为0则强制检查下载算法中函数(比如FlashWrite)的返回值,不启用这些检查能提升下载性能。
aggregate -- 如果Flash块大小明显小于RAM缓冲区,该参数设为1,可指示C-SPY高效使用RAM缓冲区去下载(比如将多个block数据放到RAM缓冲区)。
args -- 传入下载算法FlashInit()函数,类argc/argv格式。
args_doc -- args参数的描述字段(IDE里会显示)。
2.3 使用下载算法
随便打开一个i.MXRT600 SDK工程,在工程Option里找到Debugger,然后进入Flashloader配置,在界面里你可以看到前面介绍的.board和.flash文件,以及可以直接设置这些xml文件里的部分参数。如果安装的Flash下载算法文件不适用你的板子,那么你需要自己提供合适的算法文件(.out),并修改.flash文件里相应路径以及参数即可。
三、NOR Flash下载算法设计
IAR下Flash下载算法是开源的,\IAR Systems\Embedded Workbench 8.50.6\arm\doc\FlashLoaderGuide.ENU.pdf 文档有非常详细的介绍,篇幅不长,只有47页,建议全部读一遍。
3.1 下载算法模板工程
IAR提供了一个Flash下载算法的基础模板,可从官网下载,也可以在IAR安装目录下找到,这个模板只是通用的算法源文件,没有相应模板工程,并且源文件只是算法框架,没有具体芯片相关的Flash驱动实现。
- 模板官网下载:https://files.iar.com/public/cmsis/IAR_flashloader_framework_200.zip
- IAR下模板路径:\IAR Systems\Embedded Workbench 8.50.6\arm\src\flashloader\framework2
该算法基础模板包含四个文件,我们需要根据模板源文件创建具体目标芯片的算法工程,然后将flash_loader.h里声明的算法API函数根据芯片去具体实现。
\IAR\arm\src\flashloader\framework2\flash_loader.c
\IAR\arm\src\flashloader\framework2\flash_loader.h
\IAR\arm\src\flashloader\framework2\flash_loader_asm.s
\IAR\arm\src\flashloader\framework2\flash_loader_extra.h
算法总共定义了如下5个API函数,其中关于初始化以及擦写的API函数(FlashInit、FlashWrite、FlashErase)是必须要实现的,另外两个是可选的。
其实在IAR安装目录下也提供了生成最终算法文件的IAR工程,我们可以直接在这个工程基础上修改生成新算法文件。i.MXRT系列有四个算法源工程。
3.2 下载算法结构设计
算法本身结构相比MDK下算法设计相对来说稍微复杂一点,仅以FlashInit相关的代码来介绍。flash_loader_asm.s文件中定义了FlashInitEntry()入口,这个入口是直接由调试器来调用的。
;---------------------------------
; FlashInitEntry()
;---------------------------------
SECTION .text:CODE:ROOT(2)
THUMB
FlashInitEntry:
BL Fl2FlashInitEntry
BL FlashBreak
FlashInitEntry()函数功能非常简单,主要就是跳转到Fl2FlashInitEntry()函数中,这个Fl2FlashInitEntry()函数原型在flash_loader.c文件中。Fl2FlashInitEntry()还是只是个架子,其主要是将theFlashParams全局变量的一些Flash属性相关内容传入最关键的也是由用户来实现的FlashInit()函数。theFlashParams内容由调试器根据xml文件中设置来初始化。
FlashInit()函数有两个版本,__argc和__argv参数可带也可不带,实际上这个可选参数就是为i.MXRT系列单独加的,主要用于传递外接Flash的信息(比如2.3节图片里的 --MxicOct )。其余两个重要函数FlashWrite、FlashErase与FlashInit代码结构类似,不予赘述。
// parameter passing structure
typedef struct {
uint32_t base_ptr;
uint32_t count;
uint32_t offset_into_block;
void *buffer;
uint32_t block_size;
} FlashParamsHolder;
__root __no_init FlashParamsHolder theFlashParams;
__no_init int __argc;
__no_init char __argvbuf[MAX_ARG_SIZE];
#pragma required=__argvbuf
__no_init const char* __argv[MAX_ARGS];
void Fl2FlashInitEntry()
{
#if USE_ARGC_ARGV
theFlashParams.count = FlashInit((CODE_REF)theFlashParams.base_ptr,
theFlashParams.block_size, // Image size
theFlashParams.offset_into_block,// link adr
theFlashParams.count, // flags
__argc,
__argv);
#else
theFlashParams.count = FlashInit((CODE_REF)theFlashParams.base_ptr,
theFlashParams.block_size, // Image size
theFlashParams.offset_into_block,// link adr
theFlashParams.count); // flags
#endif
}
让我们再打开FlashIMXRT1060_FlexSPI示例算法工程,可以看到这个工程既包含了算法基础模板源文件,也包含了用户实现的i.MXRT1060的FlexSPI驱动。关于这个工程,有一个跟MDK下算法工程比较大的区别就是,IAR算法工程并没有启用位置无关的编译,它更接近标准的嵌入式应用程序工程。
3.3 下载算法API调用流程
\IAR Systems\Embedded Workbench 8.50.6\arm\doc\FlashLoaderGuide.ENU.pdf 文档的 The IAR Flash Loader process 小节里对于下载算法调用过程有详细解释。痞子衡将其简要整理在了下面这张图里:
至此,IAR开发环境下i.MXRT的串行NOR Flash下载算法设计痞子衡便介绍完毕了,掌声在哪里~~~
欢迎订阅
文章会同时发布到我的 博客园主页、CSDN主页、知乎主页、微信公众号 平台上。
微信搜索"痞子衡嵌入式"或者扫描下面二维码,就可以在手机上第一时间看了哦。

痞子衡嵌入式:恩智浦i.MX RT1xxx系列MCU硬件那些事(2.5)- 串行NOR Flash下载算法(IAR EWARM篇)的更多相关文章
- 痞子衡嵌入式:恩智浦i.MX RT1xxx系列MCU硬件那些事(2.4)- 串行NOR Flash下载算法(Keil MDK工具篇)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是Keil MDK工具下i.MXRT的串行NOR Flash下载算法设计. 在i.MXRT硬件那些事系列之<在串行NOR Flash ...
- 痞子衡嵌入式:恩智浦i.MX RT1xxx系列MCU硬件那些事(2.3)- 串行NOR Flash下载算法(J-Link工具篇)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是J-Link工具下i.MXRT的串行NOR Flash下载算法设计. 在i.MXRT硬件那些事系列之<在串行NOR Flash X ...
- 痞子衡嵌入式:恩智浦i.MX RT1xxx系列MCU硬件那些事(2.6)- 串行NOR Flash下载算法(MCUXpresso IDE篇)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是MCUXpresso IDE开发环境下i.MXRT的串行NOR Flash下载算法设计. 在i.MXRT硬件那些事系列之<在串行N ...
- 痞子衡嵌入式:恩智浦i.MX RT1xxx系列MCU启动那些事(13.A)- LPSPI NOR启动时间(RT1170)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是恩智浦i.MX RT1170 1bit SPI NOR恢复启动时间. 本篇是i.MXRT1170启动时间评测第三弹了,前两篇分别给大家评 ...
- 痞子衡嵌入式:恩智浦i.MX RT1xxx系列MCU启动那些事(11.3)- FlexSPI NOR连接方式大全(RT1010)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是恩智浦i.MX RT1010的FlexSPI NOR启动的连接方式. 在写完 <FlexSPI NOR启动连接方式(RT1015/ ...
- 痞子衡嵌入式:恩智浦i.MX RT1xxx系列MCU启动那些事(11.0)- FlexSPI NOR启动时间(RT1170)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是恩智浦i.MX RT1170 FlexSPI NOR启动时间. 痞子衡刚刚拿到i.MXRT1170 B0版本的芯片,迫不及待地在上面跑了 ...
- 痞子衡嵌入式:恩智浦i.MX RT1xxx系列MCU启动那些事(11.1)- FlexSPI NOR连接方式大全(RT1015/1020/1050)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是恩智浦i.MX RT1015/1020/1050三款MCU的FlexSPI NOR启动的连接方式. 由于i.MXRT内部没有非易失性存储 ...
- 痞子衡嵌入式:恩智浦i.MX RT1xxx系列MCU启动那些事(11.B)- FlexSPI NOR连接方式大全(RT1160/1170)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是恩智浦i.MXRT1160/1170两款MCU的FlexSPI NOR启动的连接方式. 这个 i.MXRT FlexSPI NOR 启动 ...
- 痞子衡嵌入式:飞思卡尔Kinetis系列MCU启动那些事(1)- KBOOT架构
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是飞思卡尔Kinetis系列MCU的KBOOT架构. Bootloader是嵌入式MCU开发里很常见的一种专用的应用程序,在一个没有Boo ...
随机推荐
- [web安全原理分析]-文件上传漏洞基础
简介 前端JS过滤绕过 待更新... 文件名过滤绕过 待更新 Content-type过滤绕过 Content-Type用于定义网络文件的类型和网页编码,用来告诉文件接收方以什么形式.什么编码读取这个 ...
- [原题复现]-HITCON 2016 WEB《babytrick》[反序列化]
前言 不想复现的可以访问榆林学院信息安全协会CTF训练平台找到此题直接练手 HITCON 2016 WEB -babytrick(复现) 原题 index.php 1 <?php 2 3 inc ...
- kali 系列学习12-使用Wifite破解无线网络
一些破解无线网络程序是使用Aircrack-ng工具集,并添加了一个图形界面或使用文本菜单的形式来破解无线网络.这使得用户使用它们更容易,而且不需要记住任何命令.本节将介绍使用命令行工具Wifite, ...
- Fruity Parametric EQ 2使用说明(二)——FL Studio插件教程
Fruity Parametric EQ 2均衡器,是一款我们在FL Studio制作音乐时经常会用到的插件,它是EQ中的战斗鸡,它不仅有一个高级的 7 波段参数均衡器,还具有声谱分析能力.我们在对很 ...
- 有什么好用的Mac数据恢复软件
对于第一次上手苹果电脑的人来说,使用起来难免有点小难受,因为对苹果电脑操作系统不熟练,发生误删数据的事情也是屡见不鲜. 那么对于这种情况我们该怎么办呢?不用担心,今天小编就为大家推荐一款好用的苹果数据 ...
- Redis设计与实现一之简单的动态字符串
简单的动态字符串 Redis没有直接使用C语言中的字符串,而是自己构建了SDS这样的一种简单动态字符串,并且将他作为Redis中字符串的默认的表示. 但是并未完全抛弃C语言字符串,只不过是在C语言字符 ...
- python基础之条件语句
检查相等和不等 多个检查条件 age1 = 22 age2 = 19 s1 = age1 > 21 and age2 > 19 print(s1) s2 = age1 > 21 or ...
- django搭建完毕运行显示hello django
1.使用pycharm打开工程,进入工程配置解释器路径 2.视图和url 视图:处理我们从业务的地方,可以理解为函数 url:进行路由匹配的地方,先在主工程bookpro中进行匹配,如果匹配ok,那么 ...
- SpringBoot 整合邮件oh-my-email 实现发送邮件功能
导读 最近手头上要负责整个Message Gateway服务的搭建,涉及到:微信推送(点我直达).短信.邮件等等,到github上发现有个微型的开源邮件框架,整理下来,以备项目中使用到,到时候应该会使 ...
- CentOS下关于集群同步/LB/HA 的尝试
Zookepper 集群同步 下载解压 wget http://apache.fayea.com/zookeeper/stable/zookeeper-3.4.8.tar.gz tar xvf zoo ...