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


  你们好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给你们介绍的是Keil MDK工具下i.MXRT的串行NOR Flash下载算法设计html

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

1、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)。github

  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的相关软件支持包。api

2、使用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写了详尽的文档,但这种方式更适合芯片原厂去作):ui

  搞定了合适的下载算法文件,最后还须要检查下两个地址范围,一个是Flash对应的实际映射地址空间,另外一个是下载算法文件运行RAM地址空间。这点跟上一篇介绍的J-Link算法JLinkDevices.xml文件里须要填的两个地址空间设计是一致的。.net

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

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