<source id="iwwjg"><wbr id="iwwjg"></wbr></source>

        1. <table id="iwwjg"></table>
          当前位置:首页 > 公众号精选 > strongerHuang
          [导读]关于NOR Flash下载算法每个IDE/工具都有自己的一套设计,虽然基本设计理念是一样的,但细节方面还是有区别。

          关注+星标公众,不错过精彩内容

          作者 | 痞子衡
          转自 | 痞子衡嵌入式
          今天转载痞子衡嵌入式的一篇文章,给大家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主页,根据这些文档,我们基本可以了解其下载算法设计细节。
          • 算法主页:https://arm-software.github.io/CMSIS_5/Pack/html/flashAlgorithm.html

          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组合调用流程:
          • 算法API详解:
          • https://arm-oftware.github.io/CMSIS_5/Pack/html/algorithmFunc.html
          至此,Keil MDK工具下i.MXRT的串行NOR Flash下载算法设计介绍完毕。

          ------------?END?------------

          推荐阅读:
          如何编写ARM处理器的Bootloader
          线程、进程、多线程、多进程 和 多任务 ?
          几款优秀的支持C、C++等多种语言的在线编译器

          关注 微信公众号『strongerHuang』,后台回复“1024”查看更多内容,回复“加群”按规则加入技术交流群。


          长按前往图中包含的公众号关注


          点击“ 阅读原文 ”查看更多分享,欢迎点分享、收藏、点赞、在看

          免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

          换一批

          延伸阅读

          [后端技术指南针] 图解!打工人看腾讯这道多线程面试题

          1. 骚动的周五 小黑是大白前同事,现在俩人在不同的公司,但是都做后端开发工作。 虽然两个人都在北京,但是距离不算近,一个在望京,一个在中关村,算是北京几大IT聚集圈之二了...

          关键字: C语言 嵌入式

          [小麦大叔] STM32如何高效接收串口数据?

          目录 USART3_DR的地址 DMA的通道 DMA的中断 USART接收回调函数 头文件源码 DMA的基本配置 环形队列接...

          关键字: 单片机 嵌入式

          [C语言与CPP编程] C语言最常用的贪心算法就这么被攻克了

          来源:大鱼机器人 01 基本概念 贪心算法是指在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,只做出在某种意...

          关键字: C语言 嵌入式

          [嵌入式ARM] 嵌入式为什么要编程模块化和代码复用?很多人都没真正理解!

          对很多人来,嵌入式软件开发过程中? 模块化 (Modularization)是一个海市蜃楼、是一个书面词汇、是一个过气的时尚——模...

          关键字: 编程 嵌入式

          技术子站

          关闭
          欧美裸体片A级