浅析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内的代码ÿ…...
区块链技术|DApp与传统应用程序的关键区别
在数字时代,应用程序已经成为我们生活的一部分,无论是社交媒体、金融服务还是娱乐媒体,应用程序几乎无处不在。然而,随着区块链技术的崭露头角,一种新型应用程序——去中心化应用程序(DApp)正在…...
Python 加密解密技巧大揭秘:让你的数据安全无忧
建议食用原文链接效果更佳 Python 加密解密技巧大揭秘:让你的数据安全无忧 今天我们将探讨在 Python 中常见的加密解密算法,并通过代码案例来帮助大家更好地理解它们的实现。 在开始之前,请确保您已经安装了 pycryptodome 这个库。您可以使用…...
C#判断字符是否为utf16编码
unity截取显示微信昵称后,出现异常Error: UTF-16 to UTF-8 conversion failed because the input string is invalid,原因是截取字符串刚好截到了表情后面,解决思路是从截取到的索引向前遍历,找第一个不是utf16编码的字符…...

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的应用
⭐️ 单利还是复利 巴菲特老爷子有句名言:“人生就像滚雪球,重要的是发现很湿的雪和很长的坡。” 很湿的雪,指的就是复利。很长的坡,指的就是时间。很湿的雪和很长的坡组合起来,就能滚成巨大的雪球。 哈哈࿰…...

记录--解决前端内存泄漏:问题概览与实用解决方案
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 内存泄漏是前端开发中的一个常见问题,可能导致项目变得缓慢、不稳定甚至崩溃。在本文中,我们将深入探讨在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…...

现代密码学 | 椭圆曲线密码学—附py代码
Elliptic Curve Cryptography 椭圆曲线密码学(ECC)是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础,例如椭圆曲线数字签…...

12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...
关于 WASM:1. WASM 基础原理
一、WASM 简介 1.1 WebAssembly 是什么? WebAssembly(WASM) 是一种能在现代浏览器中高效运行的二进制指令格式,它不是传统的编程语言,而是一种 低级字节码格式,可由高级语言(如 C、C、Rust&am…...
爬虫基础学习day2
# 爬虫设计领域 工商:企查查、天眼查短视频:抖音、快手、西瓜 ---> 飞瓜电商:京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空:抓取所有航空公司价格 ---> 去哪儿自媒体:采集自媒体数据进…...
Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?
Redis 的发布订阅(Pub/Sub)模式与专业的 MQ(Message Queue)如 Kafka、RabbitMQ 进行比较,核心的权衡点在于:简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...
服务器--宝塔命令
一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行! sudo su - 1. CentOS 系统: yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!
简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求,并检查收到的响应。它以以下模式之一…...

回溯算法学习
一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...

免费数学几何作图web平台
光锐软件免费数学工具,maths,数学制图,数学作图,几何作图,几何,AR开发,AR教育,增强现实,软件公司,XR,MR,VR,虚拟仿真,虚拟现实,混合现实,教育科技产品,职业模拟培训,高保真VR场景,结构互动课件,元宇宙http://xaglare.c…...
BLEU评分:机器翻译质量评估的黄金标准
BLEU评分:机器翻译质量评估的黄金标准 1. 引言 在自然语言处理(NLP)领域,衡量一个机器翻译模型的性能至关重要。BLEU (Bilingual Evaluation Understudy) 作为一种自动化评估指标,自2002年由IBM的Kishore Papineni等人提出以来,…...