IAR环境下的FlashLoader设计

目录

1.为什么要Flash Loader

2.Flash Loader设计细节

2.1 简单的代码框架

2.2 迷人的宏使用

2.3 关键的配置文件

3.dmac和mac文件 

4.小结


搞国产车规芯片,IAR是必不可少的编译调试集成工具,历史背景不赘述,今天主要聊聊基于IAR的Flash Loader设计关键点。

1.为什么要Flash Loader

MCU基本都带eFlash,如果想基于Flash进行调试,直接通过Debug口去擦写Flash,指定是行不通的,因为每家芯片的Flash IP不一样,控制器、命令序列也不尽相同;

因此需要一小段基于各家芯片Flash定制的驱动程序来实现代码的刷写,这个程序就是Flash Loader,逻辑和汽车ECU的Bootloader一样,只是在这里IAR充当了上位机,所以Flash Loader就需要满足IAR的一些定制要求。

有兴趣的可以读一读IAR关于FlashLoader文档《Flash Loader Development Guide》。

具体流程可以简单总结为下图:

  1. IAR Debugger组件C-SPY 首先将Flash Loader下载到目标板的RAM中,剩余的RAM用于Buffer存放镜像文件。
  2. Image被下载到RAM Buffer;Flash Loader调用相关驱动将Image刷写至Flash,直到所有Image被刷进Flash;
  3. C-SPY清空RAM,将PC指向用户程序入口,设置SP,开始进行调试。

2.Flash Loader设计细节

2.1 简单的代码框架

IAR提供了关于Flash Loader的模板文件,路径如下:IAR Systerms\arm\src\flashloader\framework2,主要包含如下五个文件:

  • flash_config.h:Flash Loader的配置文件,用于设定C-SPY和驱动函数的参数等;
  • flash_loader_extra.h:额外的框架声明,不过没咋关注;
  • flash_loader_asm.s:基于MCU内核的启动源码,几乎不用大改,唯一要注意就是SP设置;
  • flash_loader.c:包含了框架代码,不能修改;
  • flash_loader.h:框架原型声明;
  • flash_loader_ram.c:真正需要添加具体驱动的文件。

flash_loader_ram.c里设置好了框架,具体函数接口如下表所示:

源码如下:

很明显,对于Flash,代码实现的擦写方式显然是不可取的,所以我们需要做的就是在上述函数里实现基于特定MCU的驱动,如果芯片厂家接口已经封装好了,直接拿来主义即可。 如下所示: 

2.2 迷人的宏使用

代码框架看起来一点也不复杂,但是如果我们遇到了flash、optionByte默认受到保护的情况,那么就需要提前去干一些事情,IAR提供了Macro这个功能,用于串联起C-SPY和目标硬件,我们以Debug in Flash流程为例:

图片来源: IAR C-SPY® Debugging Guide 

在C-SPY与目标MCU连接、下载Code的过程中,可通过执行上述宏,来实现我们想要的功能;例如,在C-SPY下载完Flash Loader到RAM后,紧接着就可以执行execUserFlashReset(),在里面我们可以根据语法添加任意代码,执行完成后C-SPY设置PC到Flash Loader入口,开始执行擦写Flash的功能,其余Macro用法依次类推。

设计Flash Loader时要熟悉这个流程,才能让每个Macro在合适的时机发挥作用。

2.3 关键的配置文件

上面全是流程的东西,到现在还没有讨论到最关键的几个地方:C-SPY如何知道要刷Flash的地址映射空间?上述宏在哪里定义?Flash Loader编译出来放到哪里?

我们直接看看芯驰E3104关于Flash Loader的配置文件,路径如下:

其中

  • .board文件,XML格式,是Flash memory系统的配置文件,告诉了IAR目标板Flash相关属性文件,它长这样:

  • .flash文件,同样是XML格式,告知IAR flash loader程序的路径、flash memory基地址、flash memory page、block大小等,一个board文件可以包含多个.flash文件,这样一次可刷写多个image;

  • .mac文件,包含辅助宏,也就是前面那种图里的各种函数,如下:

那么.out文件是干的呢?就是flash loader工程编译过后的产物。

有兴趣的朋友可以到 路径\arm\src\flashloader中看看NXP、Infineon、GD等flash loader的源码。

最后,就是如何在调试界面使用flash loader,点击Project->Option->Debugger,选择目标.board文件,即可加载flash相关信息;

 点击Debugger->Setup,选择.mac文件即可。

3.dmac和mac文件 

有一个容易搞混淆的就是,在安装目录下Debugger文件夹里有个dmac文件,在整个调试过程中它里面的宏也会被调用,我们常用来开关MPU、操作看门狗等等,如下:

实际上在运行Flash loader的时候,dmac文件里的函数也会被调用,因此我们在设计mac文件里的函数时,也需要参考dmac里已实现的内容,我们可以打开对应硬件的调试log系统,来观察mac和dmac中的函数调用顺序。

 4.小结

到这里,基于IAR的Flash Loader设计思路就梳理完毕了,剩下的就是开始接收各种调试bug,就酱!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/934079.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

一些硬件知识【2024/12/6】

MP6924A: 正点原子加热台拆解: PMOS 相比 NMOS 的缺点: 缺点描述迁移率低PMOS 中的空穴迁移率约为电子迁移率的 1/3 到 1/2,导致导通电流较低。开关速度慢由于迁移率较低,PMOS 的开关速度比 NMOS 慢,不适合高速数字电…

在本地运行大语言模型

1,打开下面网站下载,软件 lm studio 2, 设置模型下载路径 3,没有魔法条件的人,去镜像网站下载模型的镜像文件 、 4,

【单片机】ESP32-S3+多TMC2209控制步进电机系列3 使用TMC2209库实现UART通讯

目录 1.下载TMC2209.h库2.代码部分3.效果展示 1.下载TMC2209.h库 在Arudino环境中,有两个不错的库可以驱动TMC2209。 TMC2209库TMCStepper库 TMC2209库只针对TMC2209驱动器,而TMCStepper库除了能够支持TMC2209驱动器,还能够支持其他TMC的驱…

【服务器部署应用由http协议切换为https】

文章目录 服务器部署应用由http协议切换为https1. 下载openssl及其配置1.1 下载1.2 无脑下一步即可1.3 环境变量配置1.4 验证配置以及生成证书证书路径 2. nginx配置修改 服务器部署应用由http协议切换为https 1. 下载openssl及其配置 1.1 下载 openssl下载地址 根据系统选择…

Linux——管理用户和用户组

一、用户有哪些 root用户 定义:root用户是Linux系统中的最高权限用户,具有对系统所有资源的完全控制权。特性:root用户可以执行系统中的任何操作,包括修改系统配置文件、安装软件、管理系统服务等。由于其拥有最高权限&#xff0c…

synchronized的特性

1.互斥 对于synchronized修饰的方法及代码块不同线程想同时进行访问就会互斥。 就比如synchronized修饰代码块时,一个线程进入该代码块就会进行“加锁”。 退出代码块时会进行“解锁”。 当其他线程想要访问被加锁的代码块时,就会阻塞等待。 阻塞等待…

如何在树莓派上安装Arduino IDE

git clone https://github.com/JetsonHacksNano/installArduinoIDE.git cd installArduinoIDE ./installArduinoIDE.sh sudo reboot sudo shutdown -h now

【JAVA项目】基于ssm的【汽车在线销售系统】

【JAVA项目】基于ssm的【汽车在线销售系统】 技术简介:采用JSP技术、B/S架构、SSM框架、MySQL技术等实现。 系统简介:首页汽车在线销售系统模块如下:首页、汽车信息、新闻资讯、留言反馈、我的收藏管理等功能。管理员输入个人的账号、密码登录…

【代码随想录】刷题记录(66)-修剪二叉搜索树

题目描述: 给你二叉搜索树的根节点 root ,同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树,使得所有节点的值在[low, high]中。修剪树 不应该 改变保留在树中的元素的相对结构 (即,如果没有被移除,原有的父…

《蓝桥杯比赛规划》

大家好啊!我是NiJiMingCheng 我的博客:NiJiMingCheng 这节课我们来分享蓝桥杯比赛规划,好的规划会给我们的学习带来良好的收益,废话少说接下来就让我们进入学习规划吧,加油哦!!! 一、…

Vue3+Vite项目从零搭建+安装依赖+配置按需导入

环境准备 Vscode/HBuilder等任何一种前端开发工具node.js&npm本地开发环境 源代码管理:Git 技术栈 项目构建 创建项目 npm create vite 依次运行最后三行出现,成功启动项目 在浏览器输入 http://localhost:5173/ 可以显示页面 src别名的配置…

小程序维护外包流程和费用

由于某些原因很多老板想要跟换掉小程序原来合作的开发公司,重新把小程序系统维护外包新的公司。小程序系统外包维护是一个涉及多个方面的过程,需要从需求明确、选择团队到持续优化等多个环节进行细致管理。以下就是小程序系统外包维护主要包括几个关键步…

Meta Llama 3.3 70B:性能卓越且成本效益的新选择

Meta Llama 3.3 70B:性能卓越且成本效益的新选择 引言 在人工智能领域,大型语言模型一直是研究和应用的热点。Meta公司最近发布了其最新的Llama系列模型——Llama 3.3 70B,这是一个具有70亿参数的生成式AI模型,它在性能上与4050…

【数字图像处理】期末实验,基于直方图均衡化实验, 空间域图像增强, 数字图像傅里叶变化、频域图像处理,基于Hough变换的边缘检测

关注作者了解更多 我的其他CSDN专栏 过程控制系统 工程测试技术 虚拟仪器技术 可编程控制器 工业现场总线 数字图像处理 智能控制 传感器技术 嵌入式系统 复变函数与积分变换 单片机原理 线性代数 大学物理 热工与工程流体力学 数字信号处理 光电融合集成电路…

01_Node.js入门 (黑马)

01_Node.js入门 知识点自测 从 index.js 出发&#xff0c;访问到 student/data.json 的相对路径如何写? A&#xff1a;../public/teacher/data.json B&#xff1a;./public/student/data.json C&#xff1a;../student/data.json <details><summary>答案</sum…

React第十七章(useRef)

useRef 当你在React中需要处理DOM元素或需要在组件渲染之间保持持久性数据时&#xff0c;便可以使用useRef。 import { useRef } from react; const refValue useRef(initialValue) refValue.current // 访问ref的值 类似于vue的ref,Vue的ref是.value&#xff0c;其次就是vu…

ThinkPHP知识库文档系统源码

知识库文档系统 一款基于ThinkPHP开发的知识库文档系统&#xff0c;可用于企业工作流程的文档管理&#xff0c;结构化记录沉淀高价值信息&#xff0c;形成完整的知识体系&#xff0c;能够轻松提升知识的流转和传播效率&#xff0c;更好地成就组织和个人。为部门、团队或项目搭…

TIM输入捕获---STM

一、简介 IC输入捕获 输入捕获模式下&#xff0c;当通道输入引脚出现指定电平跳变时&#xff0c;当前CNT的值将被锁存在CCR中&#xff0c;可用于测量PWM波形的频率、占空比、脉冲间隔、电平持续时间等参数 每个高级定时器和通用定时器都拥有4个输入捕获通道 可配置为PWMI模…

Spring Data JPA 入门

文章目录 前言、Spring Data JPA 是什么&#xff1f;1、背景2、优势3、Spring Data JPA 和 MyBatis-Plus 对比4、Spring Data JPA 与 JPA 的关系是什么&#xff1f; 一、准备1、依赖引入Spring Boot 框架依赖引入&#xff1a;非 Spring Boot 框架依赖引入&#xff1a; 2、定义实…

【Nacos03】消息队列与微服务之Nacos 集群部署

集群部署 集群部署说明 因此开源的时候推荐用户把所有服务列表放到一个vip下面&#xff0c;然后挂到一个域名下面 http://ip1:port/openAPI 直连ip模式&#xff0c;机器挂则需要修改ip才可以使用。 http://SLB:port/openAPI 挂载SLB模式(内网SLB&#xff0c;不可暴露到公网…