0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Keil MDK工具下i.MXRT的串行NOR Flash下载算法设计

Q4MP_gh_c472c21 来源:痞子衡嵌入式 作者:痞子衡嵌入式 2020-11-16 16:21 次阅读

大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是Keil MDK工具下i.MXRT的串行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_PacksNXPMIMXRT1062_DFP12.2.0armMIMXRT106x_QSPI_4KB_SEC.FLM)

如果默认选择的Flash下载算法文件不适用你的板子,那么你需要自己提供合适的算法文件(.FLM),并将其放入MDK安装目录下(Keil_v5ARMFlash),重新打开工程选项,新增的算法会自动刷新到待选算法列表(还有另一种添加方式,即做一个完整的DFP包,包里包含下载算法,虽然ARM写了详尽的文档,但这种方式更适合芯片原厂去做):

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

三、NOR Flash下载算法设计

Keil MDK下Flash下载算法是开源的,有较详细的文档,文档在arm-software的github主页,根据这些文档,我们基本可以了解其下载算法设计细节。

算法主页:https://arm-software.github.io/CMSIS_5/Pack/html/flashAlgorithm.html

3.1 下载算法模板工程

Keil MDK提供了一个Flash下载算法的基础模板工程,工程在Keil_v5ARMFlash\_TemplateNewDevice.uvprojx,该工程仅支持MDK(不支持MDK-Lite)编译,除了工程设置外,该模板工程仅包含四个文件:

Keil_v5ARMFlashFlashOS.h Keil_v5ARMFlash\_TemplateFlashDev.c Keil_v5ARMFlash\_TemplateFlashPrg.c Keil_v5ARMFlash\_TemplateTarget.lin

拿到基础模板工程,我们需要根据目标MCU内核类型在工程选项里将默认的ARMCM0内核改掉,然后在FlashDev.c和FlashPrg.c里将算法API函数全部实现(默认是空的),最后编译工程生成.FLM即是我们要的算法文件(最终.FLM其实是通过After Build里的脚本命令将.axf直接改名的,FLM文件本质上就是axf格式文件)。

3.2 下载算法结构设计

算法本身结构其实很简单,在FlashDev.c文件中有一个名为FlashDevice的结构体常量,其原型定义在FlashOS.h中。该结构体主要给IDE提供必要的Flash信息,其值必须根据实际板卡情况填写正确。

structFlashDeviceconstFlashDevice={ FLASH_DRV_VERS,//DriverVersion,donotmodify! "NewDevice256kBFlash",//DeviceName ONCHIP,//DeviceType 0x00000000,//DeviceStartAddress 0x00040000,//DeviceSizeinBytes(256kB) 1024,//ProgrammingPageSize 0,//Reserved,mustbe0 0xFF,//InitialContentofErasedMemory 100,//ProgramPageTimeout100mSec 3000,//EraseSectorTimeout3000mSec //SpecifySizeandAddressofSectors 0x002000,0x000000,//SectorSize8kB(8Sectors) 0x010000,0x010000,//SectorSize64kB(2Sectors) 0x002000,0x030000,//SectorSize8kB(8Sectors) 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组合调用流程:

算法API详解: https://arm-software.github.io/CMSIS_5/Pack/html/algorithmFunc.html

下一篇文章,痞子衡将带大家继续探究IAR EWARM下的下载算法设计,让我们把主流Cortex-M集成开发环境的算法设计思路全部撸一遍,看看哪家更巧妙。

至此,Keil MDK工具下i.MXRT的串行NOR Flash下载算法设计痞子衡便介绍完毕了,掌声在哪里~~~

责任编辑:lq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • FlaSh
    +关注

    关注

    10

    文章

    1547

    浏览量

    146626
  • 算法
    +关注

    关注

    23

    文章

    4448

    浏览量

    90720
  • keil
    +关注

    关注

    68

    文章

    1195

    浏览量

    165254

原文标题:浅析Keil MDK下的串行Flash下载算法设计

文章出处:【微信号:gh_c472c2199c88,微信公众号:嵌入式微处理器】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    MCUXpresso IDE使用J-Link下载算法Flash调试注意事项

      大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是MCUXpresso IDE使用J-Link下载算法Flash调试注意事项。  痞子衡前段时间写过一篇小文《为
    发表于 11-04 09:02

    i.MXRT设计更新Segger J-Link Flash下载算法文件

    给大家分享的是为i.MXRT设计更新Segger J-Link Flash下载算法文件。  想要在Flash中调试,基本是离不开
    发表于 12-15 06:11

    i.MXRT系列FlexSPI驱动Flash页编程执行时间

      大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是i.MXRT系列FlexSPI驱动Flash页编程执行时间。  痞子衡之前写过一篇文章 《串行NOR
    发表于 12-21 07:30

    i.MXRTxxx系列ROM中灵活的串行NOR Flash启动硬复位引脚选择

    今天痞子衡给大家介绍的是i.MXRTxxx系列ROM中灵活的串行NOR Flash启动硬复位引脚选择。  关于 i.MXRT 系列 Boot
    发表于 12-21 06:34

    i.MXRT上使能NOR Flash的Continuous read模式在软复位后无法正常启动怎么解决?

    i.MXRT上使能NOR Flash的Continuous read模式在软复位后无法正常启动怎么解决?
    发表于 01-19 07:19

    IAR开发环境i.MXRT串行NOR Flash下载算法设计

      大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是IAR开发环境i.MXRT串行NOR Flash
    发表于 01-26 07:46

    i.MXRT上使能NOR Flash的Continuous read模式在软复位后无法正常启动问题的解决

    串行NOR Flash的Continuous read模式软复位后i.MXRT无法启动问题解决方案之RESET#》,利用RESET#引
    发表于 01-26 06:52

    Keil MDK下的串行Flash下载算法设计

    大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是Keil MDK工具i.MXRT串行
    的头像 发表于 10-23 14:30 2526次阅读
    <b class='flag-5'>Keil</b> <b class='flag-5'>MDK</b>下的<b class='flag-5'>串行</b><b class='flag-5'>Flash</b><b class='flag-5'>下载</b><b class='flag-5'>算法</b>设计

    浅析Keil MDK串行Flash下载算法设计

    今天给大家介绍的是 Keil MDK 工具i.MXRT串行 NOR
    的头像 发表于 12-23 13:15 1099次阅读

    J-Link工具i.MXRT串行NOR Flash下载算法设计

    大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是 J-Link 工具i.MXRT串行 NOR Flash
    的头像 发表于 12-08 10:07 775次阅读

    Flash不支持SFDP,如何下载适用i.MXRT

    大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是导致串行 NOR Flashi.MXRT 下无法正常下载 / 启动的常
    的头像 发表于 10-30 10:30 407次阅读

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

      大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是IAR开发环境下i.MXRT串行NOR Flash下载
    发表于 12-02 09:06 7次下载
    痞子衡嵌入式:恩智浦i.MX RT1xxx系列MCU硬件那些事(2.5)- <b class='flag-5'>串行</b><b class='flag-5'>NOR</b> <b class='flag-5'>Flash</b><b class='flag-5'>下载</b><b class='flag-5'>算法</b>(IAR EWARM篇)...

    痞子衡嵌入式:串行NOR Flash的Continuous read模式下软复位后i.MXRT无法启动问题解决方案之SW Reset...

    串行NOR Flash的Continuous read模式下软复位后i.MXRT无法启动问题解决方案之RESET#》,利用RESET#引脚复位功能是痞子衡找到的第一种解决方案,今天
    发表于 12-02 12:51 1次下载
    痞子衡嵌入式:<b class='flag-5'>串行</b><b class='flag-5'>NOR</b> <b class='flag-5'>Flash</b>的Continuous read模式下软复位后<b class='flag-5'>i.MXRT</b>无法启动问题解决方案之SW Reset...

    如何为MCU灵活选择NOR Flash去量产?

    大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是一种灵活的i.MXRT下多串行NOR Flash型号选择的量产方案。
    的头像 发表于 11-07 11:48 804次阅读

    深入i.MXRT1050系列ROM中串行NOR Flash启动初始化流程

    我们知道外部串行NOR Flash是接到i.MXRT的FlexSPI外设引脚上,有时串行NOR
    的头像 发表于 06-02 17:43 991次阅读
    深入i.<b class='flag-5'>MXRT</b>1050系列ROM中<b class='flag-5'>串行</b><b class='flag-5'>NOR</b> <b class='flag-5'>Flash</b>启动初始化流程