痞子衡嵌入式:恩智浦i.MX RT1xxx系列MCU硬件那些事(2.4)- 串行NOR Flash下载算法(Keil MDK工具篇)
大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是Keil MDK工具下i.MXRT的串行NOR Flash下载算法设计。
在i.MXRT硬件那些事系列之《在串行NOR Flash XIP调试原理》一文中,痞子衡简单提了一下串行NOR Flash下载算法的概念,并没有介绍具体设计细节,关于NOR Flash下载算法每个IDE/工具都有自己的一套设计,虽然基本设计理念是一样的,但是细节方面还是有区别。上一篇痞子衡介绍了《J-Link下算法设计》,今天痞子衡就来细聊Keil MDK下的NOR Flash下载算法:
一、Keil MDK5对i.MXRT的支持
Keil μVision可以说是MCU开发者最熟悉的IDE了,大部分人刚开始入行嵌入式学MCS-51系列单片机应该都是用得Keil C51环境(Keil μVision2),早期的Keil还只是一个小型的独立软件公司。2005年ARM收购了Keil,并于2006年集成了RealView编译器开始支持ARM Cortex-M处理器,这便是后来的Keil MDK(Keil μVision3)。
2013年Keil μVision5发布,与Keil MDK4及之前版本不同,Keil MDK5分成MDK Core和Software Packs两部分。MDK Core主要包含uVision5 IDE集成开发环境和ARM Compiler5。Software Packs则可以在不更换MDK Core的情况下,单独管理(下载、更新、移除)设备支持包和中间件更新包。
因此首次安装的Keil MDK5并没有直接支持i.MXRT,需要通过Software Packs组件来单独安装i.MXRT的相关软件支持包。
二、使用Pack Installer添加新i.MXRT型号支持
Keil MDK5里默认集成了Pack Installer,在IDE里可以直接打开其界面,手动添加所需的MCU主控相关软件包。软件包主要有两个:Device Family Pack (DFP)和Board Support Pack (BSP) ,前者是对MCU芯片本身的支持,后者是对MCU开发板的支持。
如果你不主动安装MCU软件包也行,当你打开SDK里的任何一个例程(以i.MXRT1060为例),如果该例程对应的MCU软件包没有安装,IDE会自动触发Pack的安装。DFP是必须要安装的,BSP要看你具体使用哪块板卡,痞子衡用得官方i.MXRT1060-EVK,因此还需要再手动安装NXP::EVK-MIMXRT1060_BSP:
安装完MCU软件包后,便可以正常编译SDK工程,然后在Flash下载和调试了。痞子衡使用的是恩智浦官方EVK,板子上自带了DAPLink调试器,当然除了板载调试器,我们也可以外接J-Link调试器,在MDK工程选项里无论选择哪种调试器,其默认Flash下载算法是一样的,都来自于DFP包(\Keil_Packs\NXP\MIMXRT1062_DFP\12.2.0\arm\MIMXRT106x_QSPI_4KB_SEC.FLM)
如果默认选择的Flash下载算法文件不适用你的板子,那么你需要自己提供合适的算法文件(.FLM),并将其放入MDK安装目录下(\Keil_v5\ARM\Flash),重新打开工程选项,新增的算法会自动刷新到待选算法列表(还有另一种添加方式,即做一个完整的DFP包,包里包含下载算法,虽然ARM写了详尽的文档,但这种方式更适合芯片原厂去做):
搞定了合适的下载算法文件,最后还需要检查下两个地址范围,一个是Flash对应的实际映射地址空间,另一个是下载算法文件运行RAM地址空间。这点跟上一篇介绍的J-Link算法JLinkDevices.xml文件里需要填的两个地址空间设计是一致的。
三、NOR Flash下载算法设计
Keil MDK下Flash下载算法是开源的,有较详细的文档,文档在arm-software的github主页,根据这些文档,我们基本可以了解其下载算法设计细节。
3.1 下载算法模板工程
Keil MDK提供了一个Flash下载算法的基础模板工程,工程在\Keil_v5\ARM\Flash\_Template\NewDevice.uvprojx,该工程仅支持MDK(不支持MDK-Lite)编译,除了工程设置外,该模板工程仅包含四个文件:
\Keil_v5\ARM\Flash\FlashOS.h
\Keil_v5\ARM\Flash\_Template\FlashDev.c
\Keil_v5\ARM\Flash\_Template\FlashPrg.c
\Keil_v5\ARM\Flash\_Template\Target.lin
拿到基础模板工程,我们需要根据目标MCU内核类型在工程选项里将默认的ARMCM0内核改掉,然后在FlashDev.c和FlashPrg.c里将算法API函数全部实现(默认是空的),最后编译工程生成.FLM即是我们要的算法文件(最终.FLM其实是通过After Build里的脚本命令将.axf直接改名的,FLM文件本质上就是axf格式文件)。
3.2 下载算法结构设计
算法本身结构其实很简单,在FlashDev.c文件中有一个名为FlashDevice的结构体常量,其原型定义在FlashOS.h中。该结构体主要给IDE提供必要的Flash信息,其值必须根据实际板卡情况填写正确。
struct FlashDevice const FlashDevice = {
FLASH_DRV_VERS, // Driver Version, do not modify!
"New Device 256kB Flash", // Device Name
ONCHIP, // Device Type
0x00000000, // Device Start Address
0x00040000, // Device Size in Bytes (256kB)
1024, // Programming Page Size
0, // Reserved, must be 0
0xFF, // Initial Content of Erased Memory
100, // Program Page Timeout 100 mSec
3000, // Erase Sector Timeout 3000 mSec
// Specify Size and Address of Sectors
0x002000, 0x000000, // Sector Size 8kB (8 Sectors)
0x010000, 0x010000, // Sector Size 64kB (2 Sectors)
0x002000, 0x030000, // Sector Size 8kB (8 Sectors)
SECTOR_END
};
除了FlashDevice之外,最核心当然是FlashPrg.c里的7个API函数,这些API函数提供了实际的Flash擦写验功能,IDE会自动按需调用这些API去实现在线下载。这些API原型是固定的,但具体函数实现是因板卡而异的。
关于算法工程还有一个不得不提的设计,那就是工程选项C/C++(包括Asm)下都勾选了Read-Only Position Independent 和 Read-Write Position Independent,表明下载算法本身不是使用固定地址链接,而是位置无关链接(也叫相对地址链接),算法代码机器码是可以被放到任意地址去执行的,这也是为什么你可以在例程选项里去指定RAM for Algorithm。
3.3 下载算法API调用流程
当在IDE里启动在线下载时,IDE会先将算法文件.FLM里的可执行机器码加载进指定的RAM空间,然后组合调用来实现最重要的Flash擦除和写入,只要用户App被正确写入Flash,IDE就能正常读取Flash里代码指令进行单步调试了。如下图便是擦除和写入操作的实际API组合调用流程:
下一篇文章,痞子衡将带大家继续探究IAR EWARM下的下载算法设计,让我们把主流Cortex-M集成开发环境的算法设计思路全部撸一遍,看看哪家更巧妙。
至此,Keil MDK工具下i.MXRT的串行NOR Flash下载算法设计痞子衡便介绍完毕了,掌声在哪里~~~
欢迎订阅
文章会同时发布到我的 博客园主页、CSDN主页、知乎主页、微信公众号 平台上。
微信搜索"痞子衡嵌入式"或者扫描下面二维码,就可以在手机上第一时间看了哦。

痞子衡嵌入式:恩智浦i.MX RT1xxx系列MCU硬件那些事(2.4)- 串行NOR Flash下载算法(Keil MDK工具篇)的更多相关文章
- 痞子衡嵌入式:恩智浦i.MX RT1xxx系列MCU硬件那些事(2.5)- 串行NOR Flash下载算法(IAR EWARM篇)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是IAR开发环境下i.MXRT的串行NOR Flash下载算法设计. 在i.MXRT硬件那些事系列之<在串行NOR Flash XI ...
- 痞子衡嵌入式:恩智浦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 ...
随机推荐
- python appium app ui 自动化
1.下载Android-SDK.夜神安卓模拟器.Appium.adb命令执行包并配置环境变量 2.打开夜神 3.打开Appium进行配置,配置如下 4.启动命令,到夜神bin目录下执行 adb con ...
- Spring中同一个service中方法相互调用事务不生效问题解决方案
问题描述: 我们在用Spring框架开发Web项目过程中,经常需要用同一个service中的一个方法调用另一个方法,如果此时调用方没有添加事务注解@Transactional,而在被调用方添加事务注解 ...
- k8s部署使用Dashboard(十)
安装Dashboard 前面博客Kubernetes 所有的操作我们都是通过命令行工具 kubectl 完成的.为了提供更丰富的用户体验,Kubernetes 还开发了一个基于 Web 的 Dashb ...
- Spark Job-Stage-Task实例理解
Spark Job-Stage-Task实例理解 基于一个word count的简单例子理解Job.Stage.Task的关系,以及各自产生的方式和对并行.分区等的联系: 相关概念 Job:Job是由 ...
- 关于windows服务器wsus客户端配置的修改
本文环境如下: 服务器:Windows Server 2012 R2 Standard 由于公司服务器是加了域环境的,又需要将wsus客户端指向另一台wsus服务器,修改本地组策略.可能会被域控给修改 ...
- 栈帧的内部结构--动态返回地址(Return Address)
每个栈帧中包含: 局部变量表(Local Variables) 操作数栈(Opreand Stack) 或表达式栈 动态链接 (Dynamic Linking) (或指向运行时常量的方法引用) 动态返 ...
- (转)ServletConfig与ServletContext
出处:http://blog.csdn.net/cl05300629/article/details/9362601 作者:伫望碧落 一.Servlet配置对象(ServletConfig):Serv ...
- System Verilog随笔(1)
测试文件该怎么写? 首先看一个简单代码案例: `timescale 1ns/10ps //1 module test; //2 intput wire[15:0] a; output reg[15 ...
- Linux等待队列(Wait Queue)
1. Linux等待队列概述 Linux内核的等待队列(Wait Queue)是重要的数据结构,与进程调度机制紧密相关联,可以用来同步对系统资源的访问.异步事件通知.跨进程通信等.在Linux中,等待 ...
- 万字长文 | 23 个问题 TCP 疑难杂症全解析
每个时代,都不会亏待会学习的人. 在进入今天主题之前我先抛几个问题,这篇文章一共提出 23 个问题. TCP 握手一定是三次?TCP 挥手一定是四次? 为什么要有快速重传,超时重传不够用?为什么要有 ...