当前位置: 首页 > news >正文

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

浅析Keil MDK下串行Flash的下载算法设计-电子发烧友网

今天给大家介绍的是 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 下载算法设计痞子衡便介绍完毕了,掌声在哪里~~~

审核编辑 黄昊宇

相关文章:

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

浅析Keil MDK下串行Flash的下载算法设计-电子发烧友网 今天给大家介绍的是 Keil MDK 工具下 i.MXRT 的串行 NOR Flash 下载算法设计。 在 i.MXRT 硬件那些事系列之《在串行 NOR Flash XIP 调试原理》一文中,痞子衡简单提了一下串行 NOR Flash 下载算法的概念&…...

springboot自动装配原理,手写一个starter。

文章目录 springboot自动装配原理手写starter手写starter总结: springboot自动装配原理 口述: springboot自动装配的话它其实就是只需要我们添加一个starter起步依赖,它就能完成这个依赖组件相关Bean的自动注入,其实就是自动的将…...

革命性的电子元件:RAD继电器 | 百能云芯

在现代电子和通信系统中,RAD继电器是一种关键的电子元件,它在各种应用中发挥着重要作用。RAD继电器(Reed-relay Actuated Device)是一种基于磁性原理的电子开关,其特点是极其高速、可靠、低功耗和长寿命。下面云芯将为…...

文献阅读:Deep Learning Enabled Semantic Communication Systems

目录 论文简介关于文章内容的总结引申出不理解的问题 论文简介 作者 Huiqiang Xie Zhijin Qin Geoffrey Ye Li Biing-Hwang Juang 发表期刊or会议 《IEEE TRANSACTIONS ON SIGNAL PROCESSING》 发表时间 2021.4 这篇论文由《Deep Learning based Semantic Communications: A…...

巨人互动|游戏出海游戏出海效果怎样?

游戏出海是指将原本面向国内市场的游戏产品进行调整和优化,以适应海外市场的需求,并进行推广和销售。下面小编讲讲关于游戏出海对于游戏效果的影响的一些讨论点。 1、市场扩大 通过游戏出海,可以将游戏产品的目标受众从国内扩展到全球范围内…...

二、GoLang输出HelloWorld、变量定义、数据类型的转换

一、输入Hello World go语言中,想要输出内容到控制台,package必须是main,包括方法名也必须是main, go语言输出的语法是 fmt 库。 package mainimport "fmt"func main() {// go语言中 输出内容 使用的库是 fmt库fmt.Pr…...

Mars3d图层树//图层管理加载时设置默认折叠的状态

问题:Mars3d图层树//图层管理加载时设置默认折叠的状态。 设置参考: 有个参数 open:false,写在对应的图层配置下,比如某个节点不展示,就对这个节点配置下。 如果全局,可以搜下这个widget内的代码&#xff…...

区块链技术|DApp与传统应用程序的关键区别

在数字时代,应用程序已经成为我们生活的一部分,无论是社交媒体、金融服务还是娱乐媒体,应用程序几乎无处不在。然而,随着区块链技术的崭露头角,一种新型应用程序——去中心化应用程序(DApp)正在…...

Python 加密解密技巧大揭秘:让你的数据安全无忧

建议食用原文链接效果更佳 Python 加密解密技巧大揭秘:让你的数据安全无忧 今天我们将探讨在 Python 中常见的加密解密算法,并通过代码案例来帮助大家更好地理解它们的实现。 在开始之前,请确保您已经安装了 pycryptodome 这个库。您可以使用…...

C#判断字符是否为utf16编码

unity截取显示微信昵称后,出现异常Error: UTF-16 to UTF-8 conversion failed because the input string is invalid,原因是截取字符串刚好截到了表情后面,解决思路是从截取到的索引向前遍历,找第一个不是utf16编码的字符&#xf…...

centos7上hive3.1.3安装及配置

1、安装背景; hive是基于hadoop的数据仓库软件,部署运行在linux系统之上,安装之前必须保证hadoop环境运行正常,hive本身不是分布式软件,它的分布式主要是借助hadoop实现,存储是hdfs,计算是mapr…...

Redis面试题(笔记)

目录 1.缓存穿透 2.缓存击穿 3.缓存雪崩 小结 4.缓存-双写一致性 5.缓存-持久性 6.缓存-数据过期策略 7.缓存-数据淘汰策略 数据淘汰策略-使用建议 数据淘汰策略总结 8.redis分布式锁 setnx redission 主从一致性 9.主从复制、主从同步 10.哨兵模式 服务状态监…...

iPhone 15 Pro展示设计:7项全新变化呈现

我们不应该再等iPhone 15 Pro在苹果9月12日的“Wonderlust”活动上发布了,而且可能会有很多升级。有传言称,iPhone 15 Pro将是自iPhone X以来最大的飞跃,这要归功于大量的新变化,从带有更薄边框的新钛框架到顶级A17仿生芯片和动作…...

【六袆 - Windows】PL/SQL instantclient安装包下载;PL/SQL双击登录配置

安装 PL/SQL 15 OMIT Oracle Instant Client Downloads for Microsoft Windows (x64) 64-bit https://www.oracle.com/database/technologies/instant-client/winx64-64-downloads.html 配置 # tnsnames.ora Network Configuration File:E:\oracle\product\10.2.0\db_1\ne…...

Springboot+mybatis-plus+dynamic-datasource 切换数据源失败问题总结

Springbootmybatis-plusdynamic-datasourceDruid 多数据源 切换数据源失败总结 文章目录 Springbootmybatis-plusdynamic-datasourceDruid 多数据源 切换数据源失败总结0.前言1. dynamic-datasource 切换数据源失败场景总结1. spring-batch整合情况下切换数据源异常解决办法&am…...

QuantLib学习笔记——InterestRate的应用

⭐️ 单利还是复利 巴菲特老爷子有句名言:“人生就像滚雪球,重要的是发现很湿的雪和很长的坡。” 很湿的雪,指的就是复利。很长的坡,指的就是时间。很湿的雪和很长的坡组合起来,就能滚成巨大的雪球。 哈哈&#xff0…...

记录--解决前端内存泄漏:问题概览与实用解决方案

这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 内存泄漏是前端开发中的一个常见问题,可能导致项目变得缓慢、不稳定甚至崩溃。在本文中,我们将深入探讨在JavaScript、Vue和React项目中可能导致内存泄漏的情况,并提…...

IP初学习

1.IP报文 首部长度指的是报头长度,用于分离报头和有效载荷 2.网段划分 IP地址 目标网络 目标主机 3.例子 4.特殊的IP地址 5.真正的网络环境 6.调制解调器 “猫”,学名叫宽带无线猫 7.NAT 源IP在内网环境不断被替换 8.私有IP不能出现在公网上 因…...

live5555 testProgs目录

文章目录 测试testProgs视频流直播流注意: 测试 testProgs 当涉及到许多示例程序时,解释每一个都可能会变得非常冗长。然而,我可以为你提供一些关键示例程序的简要解释,以帮助你了解每个示例的用途和功能: testOnDem…...

yolov5模型s,l,m,x的区别

yolov5s 是什么?yolov5系列最小的模型,s是small。 适合什么情况下使用?适合在计算资源有限的设备上使用。如移动设备或边缘设备。 速度和准确率:速度最快,准确率最低。 输入分辨率:通常为640x640 # Param…...

Springboot 实践(13)spring boot 整合RabbitMq

前文讲解了RabbitMQ的下载和安装&#xff0c;此文讲解springboot整合RabbitMq实现消息的发送和消费。 1、创建web project项目&#xff0c;名称为“SpringbootAction-RabbitMQ” 2、修改pom.xml文件&#xff0c;添加amqp使用jar包 <!-- RabbitMQ --> <dependency&g…...

YoloV8改进策略:轻量级Slim Neck打造极致的YoloV8

文章目录 摘要Yolov8官方结果源码改进方法测试结果总结摘要 论文链接:https://arxiv.org/ftp/arxiv/papers/2206/2206.02424.pdf 作者研究了增强 CNN 学习能力的通用方法,例如 DensNet、VoVNet 和 CSPNet,然后根据这些方法的理论设计了 Slim-Neck 结构。 使用轻量级卷积…...

使用java代码给Excel加水印,代码全,进阶版

以下代码&#xff0c;亲测可以跑通 1、上一篇博客用了Apache POI库3.8的版本的形式对Excel加了水印&#xff0c;但是最近主线版本用了4.1.2的形式&#xff0c;由于为了保持版本的兼容性&#xff0c;下面有开发了Apache POI的4.1.2的版本号的方案。 pom文件为&#xff1a; <d…...

day37:网编day4,多点通信和并发服务器

一、广播接收方&#xff1a; #include <myhead.h>#define ERR_MSG(msg) do{\ fprintf(stderr,"__%d__\n",__LINE__);\ perror(msg);\ }while(0)#define BRD_IP "192.168.114.255" #define BRD_PORT 8888int main(int argc, const char *argv[]) {//…...

STM32 硬件IIC 控制OLED I2C卡死问题

1. STM32L151C8T6 硬件IIC 控制OLED 屏&#xff0c;OLED 驱动IC CH1116G, 查阅OLED 数据手册 2. STM32 硬件IIC 初始化&#xff0c;用的标准库&#xff0c;固件库 // stm32l151c8t6 as master, oled control ic (CH1116G) as slave, and communicate by master iic2 void STM3…...

Redis图文指南

1、什么是 Redis&#xff1f; Redis&#xff08;REmote DIctionary Service&#xff09;是一个开源的键值对数据库服务器。 Redis 更准确的描述是一个数据结构服务器。Redis 的这种特殊性质让它在开发人员中很受欢迎。 Redis不是通过迭代或者排序方式处理数据&#xff0c;而是…...

C++17 std::string_view介绍与使用

std::string_view介绍 std::string_view是C17增加的新内容。它是一个轻量级的、只读的字符串视图&#xff0c;可以用来表示一个字符串或字符串的一部分。std::string_view可以提高代码的可读性、可维护性和性能。 std::string_view与std::string的主要区别在于&#xff0c;st…...

写得了代码,焊得了板!嵌入式开发工程师必修之代码管理方案(下)

目录 极狐GitLab嵌入式开发场景解决方案 3.1 高可用部署与灾备 3.2 组织管理 3.3 分支策略 3.4 分支保护 3.5 推送规则 3.6 代码评审 3.7 数据保护 3.8 其他相关 本文来自 武让 极狐GitLab 高级解决方案架构师 &#x1f4a1; 前两篇文章&#xff0c;作者介绍了嵌入式开…...

Matlab论文插图绘制模板第110期—水平双向柱状图

在之前的文章中&#xff0c;分享了很多Matlab柱状图的绘制模板&#xff1a; 进一步&#xff0c;再来看一种特殊的柱状图&#xff1a;水平双向柱状图。 先来看一下成品效果&#xff1a; 特别提示&#xff1a;本期内容『数据代码』已上传资源群中&#xff0c;加群的朋友请自行下…...

【广州华锐互动】VR全景工厂虚拟导览,虚拟现实技术提升企业数字化信息管理水平

随着工业4.0的到来&#xff0c;VR工厂全景制作成为了越来越多工业企业的选择。传统的工厂管理方式往往存在诸多问题&#xff0c;如信息不对称、安全隐患等。为了解决这些问题&#xff0c;VR工厂全景制作应运而生&#xff0c;它通过结合虚拟现实现实技术和数据采集技术&#xff…...