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

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

3天内不再提示

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

454398 来源:alpha007 作者:alpha007 2022-12-23 13:15 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

今天给大家介绍的是 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 信息,其值必须根据实际板卡情况填写正确。

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 里代码指令进行单步调试了。

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

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

审核编辑 黄昊宇

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

    关注

    0

    文章

    256

    浏览量

    35191
  • keil
    +关注

    关注

    69

    文章

    1224

    浏览量

    171778
  • MDK
    MDK
    +关注

    关注

    4

    文章

    211

    浏览量

    33455
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    CW32L012实现外部flash下载算法

    外部flash或者内置的片上flash,都是编译器通过调用写好的FLM文件来实现下载,单片机内部的安装pack包就会有(官方实现),外部flash的情况比较复杂,例如用的哪种
    的头像 发表于 10-09 17:38 1162次阅读
    CW32L012实现外部<b class='flag-5'>flash</b><b class='flag-5'>下载</b><b class='flag-5'>算法</b>

    studio有没有通过更改下载算法,同时下载到内部flash和外部flash

    我现在使用的stm32h750,内部flash很小,需要使用外部qspiflash来储存程序。 studio可以像mdk一样设置两个下载算法吗? 这样才能一个程序使用两个
    发表于 09-26 07:04

    【RA4E2开发板评测】1、从开箱到点亮 LED

    MDK 中修改 Flash 下载算法地址: 点击 Keil 的魔法棒选项 (Options for Target)。 转到 \"Debug
    发表于 09-05 17:37

    【RA4E2开发板评测】RACS配置+MDK编程+RA Flash Programmer下载程序测试LED经验分享

    中可以解决低版本编译错误的问题,仍旧有报警,但是也遇到过再添加代码后编译错误的问题。测试过几个版本的MDK,最终建议还是去官网下载MDA最新版的社区版。 RA的编程思路也是采用硬件抽象层的的编程方法
    发表于 08-31 14:50

    【RA4L1-SENSOR】电压检测器1。开箱+Keil环境搭建

    模拟比较器、温度传感器 8 x 48 段码 LCD 驱动器 12 通道电容式触摸 串行音频接口 (SSI) 。 ** 。* 准备操作系统(win10) 开发板软件(mdk5) 使用在Github上
    发表于 06-19 09:25

    请问CYPM1011-24LQXI能否直接在keil MDK中开发呢?

    抱歉打扰一,请问这款芯片CYPM1011-24LQXI能否直接在keil MDK中开发呢
    发表于 05-30 06:20

    Keil MDK到IAR EWARM:通过工程迁移实现项目资产的更好管理

    对于需要统一开发环境或涉及多核架构(如Cortex-A/R)的项目,越来越多的用户选择从Keil MDK迁移到IAR EWARM。这就会面临着需要将之前的Keil MDK工程迁移到IA
    的头像 发表于 05-08 09:03 995次阅读
    从<b class='flag-5'>Keil</b> <b class='flag-5'>MDK</b>到IAR EWARM:通过工程迁移实现项目资产的更好管理

    【RA-Eco-RA4M2开发板评测】RA-Eco-RA4M2 Keil 开发环境搭建

    MDK for ARM版本有Keil 4和Keil 5:使用Keil 5建议安装5.38以上版本。笔者的MDK是5.38a。 从
    发表于 04-27 22:54

    瑞萨RA8系列教程 | 基于 Keil 开发 RA8单片机

    本文结合瑞萨Cortext-M85单片机RA8D1、Keil MDK,以及瑞萨自家的代码初始化工具(Smart Configurator)给大家描述一,快速在Keil
    的头像 发表于 04-22 17:41 1050次阅读
    瑞萨RA8系列教程 | 基于 <b class='flag-5'>Keil</b> 开发 RA8单片机

    基于APM32F407如何制作I2C EEPROM(AT24C02型号)的MDK-Keil下载算法

    基于APM32F407如何制作I2C EEPROM(AT24C02型号)的Keil下载算法,这样在我们下载代码时可以一键把数据烧录到EEPROM中。
    的头像 发表于 04-11 11:06 1753次阅读
    基于APM32F407如何制作I2C EEPROM(AT24C02型号)的<b class='flag-5'>MDK-Keil</b><b class='flag-5'>下载</b><b class='flag-5'>算法</b>

    Keil uVision 5安装包下载,详细安装教程~

    安装包获取见文末~ 1、下载Keil uVision 5后,右键单击软件压缩包,选择\"解压到Keil5\"。 2、进入解压文件夹,双击打开MDK511文件夹。 3、运行
    发表于 03-15 12:10

    求助,求分享STM32F429用IAR做的外部SPIFLASH下载算法例程

    你好,请问可不可以提供一STM32F429用IAR做的外部SPIFLASH(例如W25Q128)下载算法例程,现在我的下载算法是能
    发表于 03-11 07:40

    用TouchGFX生成的工程,再使用STM32CubeMX生成MDK工程,下载时报错是怎么回事?

    我在用TouchGFX生成的工程,再使用STM32CubeMX生成MDK工程,编译后没有出错,再是在下载时报错: 如果不加载这个算法文件,那么按键图标就是乱码。
    发表于 03-11 06:50

    Stm32CubeIDE能像Keil一样指定不同文件的代码编译到不同的FLASH地址吗?

    Stm32CubeIDE能像Keil一样指定不同文件的代码编译到不同的FLASH地址吗?比如部分代码存放到内部FLASH,另一部分存放到外部QSPI的
    发表于 03-07 08:09

    【正点原子STM32H7R3开发套件试用体验】+02-如何使用正点原子的开发板进行开发

    下:C:\\\\Keil_v5\\\\ARM\\\\Flash(具体目录根据自己的安装情况而定) 这样的话就可以在KEIL软件选择了。 3:选择
    发表于 12-11 11:07