IAR下载算法制作

2023-05-16

IAR下载算法制作

作者 Lucas
时间 2020-12-06 17:06:18

摘要

本文档主要介绍如何在IAR环境下制作QSPI下载算法。
本文使用到的硬件、软件如下

编译器:IAR 8.32
单片机:STM32H750VBT6
外部Flash:W25Q64

背景

我们为什么需要下载算法,下载算法是在哪里使用的?这是我们首先需要了解的问题。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8XuKbJzv-1607255762238)(./Pic/IAR下载流程.png)]

如上图所示,我们想通过C-SPY将固件直接下载到Flash是不被允许的,那我们怎么才能实现将固件下载进Flash呢?IAR官方文档《FlashLoaderGuide.ENU.pdf》告诉我们说,我们需要先将固件放在RAM缓存里面,然后通过一个名叫"Flash Loader"的小程序,将代码不断的从RAM搬运到Flash(这里的Flash可以是内部Flash,也是可以是外部Flash)。
上文中提到的"Flash Loader"就是需要我们针对不同的硬件去分别实现的代码,也就是所谓的Flash下载算法。

知识介绍

IAR下载算法一共包括4个文件(.out文件、.flash文件、.board文件、.mac文件)。

  1. .out文件是由"Flash Loader"代码生成的,里面包含了我们对QPSI管脚的定义,函数FlashInit()、函数FlashWrite()、函数FlashErase()的实现。
  2. .flash文件是一个XML文件,里面包含了一些必要的元素和一些不必要的元素,仅针对必要元素做一个简单介绍
  • exe:指向.out文件
  • flash_base:Flash的基础地址
  • page:Flash每页的大小
  • block:对应Flash有多少个扇区,每个扇区多大。(block元素对应Flash的扇区还是块,待考证)
  1. .board文件同样也是一个XML文件。可以由<pass> *** </pass>进行多个.flash文件设置。每个pass内包含了两个必要的属性
  • range:表面了Flash的起始地址及结束地址
  • loader:当前pass调用那个下载算法的路径
  1. IAR每次仿真下载完程序是从当前工程的main函数开始运行的。如果我们将代码下载到了0x90000000地址处,我们并没有开启内存映射,是不可以仿真的。这时候就需要采样.mac文件作为一个启动脚本,当程序仿真下载完成后,跳转到0x08000000处开始运行。在0x08000000处进行内存映射,然后马上跳转到0x90000000处,就可以进行仿真了。

制作思想

  1. 下载"Flash Loader"开源代码
  2. 创建一个空工程,将"Flash Loader"开源代码里面的文件添加到工程
  3. 完成函数FlashInit()、函数FlashWrite()、函数FlashErase()。
  4. 生成.out文件
  5. 制作.flash文件
  6. 制作.borad文件
  7. 根据需要制作.mac文件

制作流程

上面已经介绍了下载算法制作的一些基础知识及制作思想,下面我们正式开始动手制作下载算法。

  1. 下载FlashLoder开源代码,传送门。下载后的文件内容如下图所示
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DfFXNotZ-1607255762240)(./Pic/FlashLoader源码.png)]

“flash_loader.c”、“flash_loader.h”、“flash_loader_asm.s”、"flash_loader_extra.h"四个文件是供C-SPY调用的,我们不应该去修改文件内容。真正需要我们去修改的内容是"template"文件夹下的"flash_loader_ram.c"文件。

  1. 为了方便,我找到IAR安装路径(“C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.3\arm\src\flashloader\ST”)下的"FlashSTM32H7xx_QSPI"文件夹,对这个文件内容进行更改。我们将"FlashLoder"代码添加进去,并添加相应的路径。(注:“flash_loader_ram.c"文件当前工程下被改名为"FlashSTM32H7xx_QSPI.c”)。

    • 补充FlashInit函数内容
      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TpEk9nUY-1607255762243)(./Pic/FlashInit_C.png)]

    • 补充FlashWrite函数内容
      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LuPOf1vq-1607255762245)(./Pic/FlashWrite_C.png)]

    • 补充FlashErase函数内容
      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-12uN4Idv-1607255762247)(./Pic/FlashErase_C.png)]

  2. 生成.out文件由三个需要注意的地方

    • 我们需要将代码下载到RAM里面执行,IAR->Option->Linker->Config配置如下
      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uALPFKDF-1607255762248)(./Pic/Config配置.png)]

    • IAR->Option->Linker->Output配置的是输出.out文件的内容
      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Mpu0mp3u-1607255762249)(./Pic/output.png)]

    • 当前工程没有main函数,程序运行的第一个函数将是FlashInit函数,对IAR->Option->Linker->Library配置如下
      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pzsQeSPk-1607255762249)(./Pic/library.png)]

  3. 制作.flash文件,如下图
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mQpCmTmK-1607255762250)(./Pic/FlashXml.png)]

  4. 制作.board文件,如下图
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VAnRTsnJ-1607255762251)(./Pic/board.png)]

  5. 对于H750内存映射外部Flash还需要制作.mac文件,内容如下
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8lv7FdqU-1607255762252)(./Pic/MacXml.png)]

    文件内容就很好理解了,下载完成后,pc指针指向中断向量表的Reset_Handler函数,堆栈指针指向程序运行的首地址。这样每次程序仿真下载完成后,就从0x08000000处开始运行。我们可以把Boot程序放在这个地址,Boot程序里面进行内存映射,然后跳转到0x90000000处。

效果展示

我们制作好上诉四个文件过后,创建一个工程(该工程要运行在0x90000000处),对这个工程进行简单配置。

  • IAR->Option->Debugger->Download下,配置如下
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MkuqUuKy-1607255762253)(./Pic/BoardUse.png)]

  • IAR->Option->Debugger->Setup下,配置如下
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AtH3xHSv-1607255762254)(./Pic/MacUse.png)]

  • IAR->Option->Linker->Edit下,配置如下
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SqaBtpjL-1607255762254)(./Pic/LinkUse.png)]

  • 在代码初始的地址,还需要加上中断向量表地址SCB->VTOR = 0x90000000;

做完上诉配置后,我们进行仿真下载,如下图所示,我们可以看到main函数已经存在与0x90003588处,并且可以进行仿真,说明我们配置是正确的。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JQ3pz2Oz-1607255762255)(./Pic/Main.png)]

将代码全速运行,可以看见串口显示正式我们程序设置的输出。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3rsBioAH-1607255762256)(./Pic/UsartShow.png)]

至此,关于IAR下下载算法的制作与验证就全部介绍完了。

参考资料

  • FlashLoaderGuide.ENU.pdf
  • EWARM_DebuggingGuide.ENU.pdf
  • FlashLoader源码

资料获取

链接:https://pan.baidu.com/s/1g69nFW3aUg2MKzLy1TtZBQ
提取码:4w2w
复制这段内容后打开百度网盘手机App,操作更方便哦–来自百度网盘超级会员V3的分享

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

IAR下载算法制作 的相关文章

  • 【IAR】错误:Error while running Linker

    IAR ZStack CC2530单播 错误 xff1a Error e27 Entry 34 GenericApp HandleKeys relay 34 in module EndDevice D Projects CC2530DB C
  • IAR教程之IAR安装

    IAR安装 1 下载 1 1打开官网 1 2找到要下载的版本 1 3下载 同学们除了可以下载最新版本尝鲜之外 xff0c 还可以下载之前的版本 低版本IAR打开高版本IAR工程 xff0c 工程配置会错乱 xff0c 导致编译报错问题 xf
  • IAR for ARM 无法烧写

    一直用的IDE都是Keil xff0c 最近需要用到的一款芯片只有IAR这一种环境可以从Demo里直接用 xff0c 所以用到了IAR xff0c 但发现自己装好了IAR xff08 版本8 32 1 xff09 并破解后 xff0c 编绎
  • IAR下载报错 “Fatal error: Failed to connect to CPU Session aborted!”

    当IAR下载程序进入单片机运行时出现这个弹窗之后就再也下载不进去程序了 xff0c 报以下错误 解决办法 xff1a 这时候就需要对单片机进行复位了 xff0c 一般是先看电路有没有复位按键如果没有复位按键则需要找到复位电路然后找到电路中的
  • Keil AC5/Keil AC6/IAR指定数据绝对存储地址

    文章目录 1 前言2 实现方法3 例子 1 前言 编译过程中 xff0c 指定数据绝对存储地址在实际项目中会经常使用到或者必须用到 xff0c 这样使得项目实现某些功能可以非常灵活 xff0c 常用的场景有 xff1a IAP升级时候 xf
  • IAR ARM Cortex-M3下载程序至RAM中运行

    默认icf文件中ROM地址为0x0800 0000 xff0c 通过修改其中地址可实现将代码下载到RAM中 新建Configuration 新建Configuration用于区分 Project gt Edit Configurations
  • IAR 中如何调用EmEditor

    IAR 中如何调用EmEditor 文本编辑器我一直都用EmEditor Emeditor是一款很优秀的纯文本编辑器 xff0c 它对中日韩等亚洲字符集支持的很好 xff0c 不仅有语法高亮显示功能 xff0c 搜索替换功能也是近乎可爱的强
  • IAR代码界面配色和字体修改

    IAR代码界面配色和字体修改 IAR编写代码的界面实在让人难以恭维 所以就自己改了一下编写代码的界面 让写代码变的没那么难受 效果图 打开IAR 点开tools中的options一栏 配置editor中的属性 设置配色方案 展开编辑中col
  • 高版本IAR打开低版本编译的程序出现的问题

    山外KEA程序一打开就出现这个 The project file vcan Kinetis ewp is in an old format Would you like to convert it for use with this ver
  • S5PV210开发系列五_sd卡驱动实现

    S5PV210开发系列五 sd卡驱动实现 象棋小子 1048272975 SD卡 Secure Digital Memory Card 具有体积小 容量大 数据传输快 可插拔 安全性好等优点 被广泛应用于便携式设备上 例如作为数码相机的存储
  • IAR 编译优化 #pragma optimize

    在IAR工具菜单栏中 点击 help gt Serach 搜索optimize 说明 单独指定的优化等级优先级高于编译器统一指定的优化 1 格式 pragma optimize goal level vectorize disable Pa
  • MSP432学习笔记:IAR的环境配置(官方demo程序的测试)

    近来入手一块MSP432 折腾了一天 终于把官方demo程序导入IAR 可以愉快的写代码了 以下是我个人的解决办法 首先 如果要使用IAR对TI的单片机进行开发 首先要下载对应的单片机型号的MSPWARE 本人目前使用的是TI的MSP432
  • Error[Pe147] in IAR

    系统 win10 IDE IAR MCU cc2530 Error Error Pe147 declaration is incompatible with banked func xdata reentrant void UartSend
  • Fatal Error[Cp001]: Copy protection check, No valid license found for this product [24]

    解决方法 1 卸载IAR 2 以管理员身份打开IAR安装包 3 以管理员身份打开IAR注册机 4 正常安装即可 5 安装完成后以管理员身份打开IAR 编译程序就会正常
  • IAR指定FLASH地址定义常量

    需求 IAP中 需要在HEX文件里增加版本号 软件 IAR8 3 notepad IAR代码格式 root前面是两个下划线 注意不要再 h文件里定义 防止多次编译 root const char HardwareDate 0x807F900
  • 使用一种编译器创建的静态 C 库是否与另一种编译器兼容?

    就我而言 我有一个使用代码源 gcc 构建的库 目标是arm cortex m4 然后我尝试将该库链接到使用 IAR 编译器编译的项目中 是否可以做到这一点 或者是否必须使用新工具重建库 哪些因素影响这个 静态库是几个目标文件的捆绑 这些目
  • 与(有符号)枚举值的按位运算

    我正在使用标志的枚举值 typedef enum a 0x00 b 0x01u the u has no influence as expected c 0x02u the u has no influence as expected en
  • ARM Data Abort错误异常调试

    所以现在我明白我遇到了 ARM 数据中止异常 我了解了如何捕获异常本身 STL 库中的错误地址 但我想在异常之前返回堆栈帧 我正在使用 IAR 工具链 它告诉我异常后调用堆栈不可用 有没有一种技巧可以说服工具向我显示调用堆栈 感谢您的快速帮
  • 如何停止优化器丢弃未使用的变量?

    我想调试我的代码 但无法访问进程中的内部层 因为这会干扰与硬件的通信 在监视列表会干扰基本读取访问的情况下执行易失性操作 因此 我正在测试接口的返回值 但 IAR 编译器甚至会优化未使用的易失性变量 和这样的声明 i object foo
  • 如何在 IAR EWARM 5.4 中抑制警告(从错误转换)

    我有一个用于日志记录的宏 它接受可变数量的参数 该宏将由 GCC 在非嵌入式上下文中处理 并扩展为有效的 C 代码 尽管如此 无论我在何处调用宏 数千个位置 IAR EWARM 都会给出错误 Pe054 宏调用中的参数太少 EWARM 确实

随机推荐

  • 自动驾驶仿真工具之AirSim简介

    简介 开源 xff0c 跨平台 xff0c 支持Linux Windows PX4 xff0c 基于Unreal Engine xff0c 有Unity版本 xff08 实验版 xff09 Github链接 多种语言API xff0c 包括
  • MobaXterm 远程linux服务器图像界面打不开

    如图所示 xff0c 本人用的是 MobaXterm软件 远程连接linux系统 xff0c 但是显示图形界面的时候 这里无法显示 xff0c 报错 xff1a demo 895 Gtk WARNING 23 06 41 170 canno
  • linux+opencv 将摄像头视频通过UDP协议发送给服务器端并显示

    我这边有一块rock3a开发板 xff0c 并童工USB接口外接一个USB 海康威视高清摄像头 200万像素 首先源码编译aarch版本的opencv xff0c 之前的博客中有讲 xff0c 这里不再赘述 进入linux开发界面 xff0
  • ROS入门之Cmakelist说明

    Cmakelist http wiki ros org catkin CMakeLists txt 1 Overall Structure and Ordering Your CMakeLists txt file MUST follow
  • DELL 暗夜精灵无法进入BIOS系统

    1 1 开始菜单 设置 2 单击 更新和安全 3 单击右边列表项中的 恢复 4 单击左侧的 立即重启 xff0c 这时电脑就会立即重启 xff0c 所以单击前请保存好未保存文件 5 当电脑重启之后会进入如下界面 xff0c 单击 疑难解答
  • Simulink永磁同步电机控制仿真系列八:使用自抗扰控制(adrc)实现速度闭环以及扰动估计

    引言 最近对环路进行了一些思考 xff0c 我们知道对于永磁同步电机的电流环控制 xff0c 往往假定电流环的控制对象是电阻和电感的串联 xff0c 这样的一个系统开环响应类似于一阶惯性系统 xff0c 适合使用pi控制 xff0c 并且可
  • STM32之RTC实时时钟

    RTC实时时钟简介 STM32的RTC外设 实质是一个掉电后还继续运行的定时器 从定时器的角度来看 相对于通用定时器TIM外设 它的功能十分简单 只有计时功能 也可以触发中断 但是从掉电还能继续运行来看 它是STM32中唯一一个具有这个功能
  • VS2019 错误 MSB8066 自定义生成已退出,代码为 3

    最近使用VS2019调试一个项目 xff0c 一直遇到以下错误 xff1a 严重性 代码 说明 项目 文件 行 禁止显示状态 错误 MSB8066 D MyItems CDMatrix Build CMakeFiles 3800edc586
  • RTOS与linux区别

    一句话解释 xff1a linux是分时系统 xff0c 不过可以通过配置内核改成实时 嵌入式Linux 系统是在原来Linux的发行版本之上进行了优化和改进的 xff0c 用于嵌入式的移动终端等设备的嵌入式Linux系统现在基本上都是实时
  • QT绘图控件QWT的安装及配置

    1 QWT库下载 解压下载的压缩包 xff0c 我们可以看到里面包含多个文件夹 有源码 有参考程序 有说明文档等等 xff0c 有时间建议把参考程序都看一下 xff0c 这样都每个控件有什么功能都很熟悉 2 QWT编译 网上介绍QWT编译有
  • QT多线程的使用(moveToThread方法)

    QT有两种实现多线程的方法 xff0c 一种是 子类化QThread xff0c 然后去重写run函数 xff0c 实现多线程 一种是 子类化QObject xff0c 然后使用moveToThread函数实现多线程 由于QT官方推荐使用第
  • 嵌入式Linux学习1——Linux常用指令1

    写在前面 xff1a Linux本系列的所有学习内容都是我在购买 正点原子Alpha Linux开发板 后 xff0c 根据官方提供的资料 整理而来 后面将不再做介绍 目录 ls xff1a 用于显示当前目录下的内容 a xff1a 显示当
  • 嵌入式Linux学习2——Linux常用指令2

    目录 touch xff1a touch命令用来创建空文件 cp xff1a cp命令用来复制文件或目录 rm xff1a rm命令用于删除一个文件或者目录 mkdir xff1a 用于创建文件夹 mv xff1a mv命令用来为文件或目录
  • 基于STM32分析栈、堆、全局区、常量区、代码区、RAM、ROM

    目录 总体介绍 栈区 xff08 stack xff09 堆区 xff08 heap xff09 全局区 xff08 静态区 xff09 bss段 data段 常量区 代码区 RAM和ROM Flash Memory的物理特性 RAM RO
  • VS2013(Visual Studio 2013)官方中文旗舰版安装激活方法

    dio 2013旗舰版 VS2013 xff08 Visual Studio 2013 xff09 官方中文旗舰版安装激活方法 1 下载后得到的是ISO文件 xff0c 直接解压缩或用虚拟光驱加载运行都可以 2 无所不藏在这里直接解压 xf
  • git服务器(gitea)安装说明

    需要用到的软件 需要用到的软件有 gitea 1 12 3 windows 4 0 amd64 exenssm exeGit 2 28 0 64 bit exe 这些软件的具体功能在后面安装的时候会提及 软件都已经放到了 软件包 文件夹中
  • 实战篇 | 基于freeRTOS的多任务事件传输demo(附代码)

    之前分享了很多关于freeRTOS的知识 xff0c 那么我们怎么在实战中去写代码呢 xff1f 本篇文章重在对基于freeRTOS的架构代码的解析 整个功能如下图 xff1a 为什么要用freeRTOS 在实际项目中 xff0c 如果程序
  • FMCW-距离估计

    距离估计 FMCW雷达工作原理 如上图所示 xff0c 圈1是一个信号产生器 xff0c 用于产生一个线性调频脉冲信号 xff08 频率随时间义线性方式增长的正弦波 xff09 xff0c 经圈2发射天线发送出去 xff0c 并且和圈3接收
  • 卡尔曼滤波器从入门到放弃

    目录 前言 个人总结 总结卡尔曼滤波器使用流程 从一维卡尔曼滤波器 不带过程噪声的一维卡尔曼滤波器 EXAMPLE 5 ESTIMATING THE HEIGHT OF A BUILDING 数值例子 xff1a 一维卡尔曼滤波器的完整模型
  • IAR下载算法制作

    IAR下载算法制作 作者 Lucas 时间 2020 12 06 17 06 18 摘要 本文档主要介绍如何在IAR环境下制作QSPI下载算法 本文使用到的硬件 软件如下 编译器 xff1a IAR 8 32 单片机 xff1a STM32