【STM32---IAP】基于CAN总线的BootLoader上下位机设计

2023-05-16

IAP开发---下位机STM32+上位机Linux

  • 一、准备工作
  • 二、IAP系统开发
    • 2.1 IAP简介
    • 2.2 IAP下位机开发
      • 2.2.1 刷写文件选择
      • 2.2.2 Bootloader程序框架
      • 2.2.3 Bootloader程序开发
        • 2.2.3.1 Bootloader Keil设置
        • 2.2.3.2 APP Keil设置
      • 2.2.4 Bootloader通信协议
      • 2.2.5 APP程序开发
    • 2.3 IAP上位机开发
    • 2.4 IAP系统功能测试
  • 三、总结总结总结总

唠叨两句,IAP功能应该是嵌入式开发中最常用的功能,而且这玩意开发完后可以后期无限复用,之前接触的IAP功能都是基于串口功能开发的,但是在比较安全的场景下,比如说在汽车里,一般都是通过UDS诊断服务进行相应的ECU刷写工作,作为普通的产品开发,也没必要用到那么复杂的逻辑,毕竟满足功能是最主要的,反正我们也不用进行汽车安全等级测试,所以我们这次稍微借鉴一下车里的通信方式,采用 CAN 通信的模式进行IAP升级,废话说了这么多,开干!

一、准备工作

ARM板:STM32F405RGT6,FLASH–1024KB,基本上能满足各种功能开发需求
LINUX:**X86架构(i3系统)及ARM架构(Xavier NX)**均测试通过,主要能在系统内正常调用CAN设备即可

二、IAP系统开发

2.1 IAP简介

IAP简单来说,就是通过软件实现在线电擦除和编程的方法。IAP技术是从结构上将Flash存储器映射为两个存储体,当运行一个存储体上的用户程序时,可对另一个存储体重新编程,之后将程序从一个存储体转向另一个。通过调整程序的起始地址,可以启动不同的系统程序。

2.2 IAP下位机开发

2.2.1 刷写文件选择

在一般的嵌入式开发中,除了通过IDE下载程序,一般使用HEX、BIN、S19文件进行刷写,HEX文件主要通过FlyMCU程序进行刷写,这是一个特别常用的功能,IAP中的Bootloader程序倒是可以用这种方式刷写,不过我们的关注点主要在APP程序上,APP程序在IAP功能中一般使用BIN文件或S19文件进行刷写,在安全性上来说,S19文件更为安全,但是,我们使用Keil开发,在这种情况下,BIN文件是一个较为方便的选择, 因为通过Keil可以直接生成BIN文件,这为我们刷写APP提供了极大的便利。

2.2.2 Bootloader程序框架

本系统STM32F405RGT6Flash分布
Flash
Bootloader程序应该算是IAP的核心,主要实现的功能包括通信接口的初始化、FLASH的操作、通信协议的制定及程序完善,说句题外话,正点原子上有很多可以借鉴的开发例程,哪怕例程功能距离你的开发功能有很大的差距,也可以从中找到相应的解决办法。

先说一下设计思路,Bootloader程序初始化首先检测内部FLASH程序标志位区域,根据标志位的不同进入Bootloader程序或APP程序,然后就是设置系统中断优先级分组,时钟初始化,CAN通信接口初始化,如果需要串口进行辅助开发,可以顺便初始化串口,不过一般CAN也可以实现这点功能。

2.2.3 Bootloader程序开发

2.2.3.1 Bootloader Keil设置

KEIL Target设置
target
Bootloader程序预留64K,KEIL Target设置如上图所示。

Bootloader程序下载地址范围
setting
依次点击Utilities —Setting,修改Bootloader程序下载地址范围如上图所示。

2.2.3.2 APP Keil设置

KEIL Target设置
在这里插入图片描述
APP程序预留448K,KEIL Target设置如上图所示。

中断向量表的重设
在这里插入图片描述
.bin文件生成
通过MDK自带的格式转换工具fromelf.exe,来实现.axf文件到.bin文件的转换。
fromelf.exe转换工具的语法格式为:fromelf [options] input_file。
通过在MDK点击Options for TargetUser选项卡,在After Build/Rebuild栏,勾选Run #1,并写入:C:\Keil_v5\ARM\ARMCC\bin\fromelf.exe –bin -o …\OBJ*.bin …\OBJ*.axf
MDK安装目录与程序名称请根据自己实际情况修改。

2.2.4 Bootloader通信协议

其实系统来说,这种功能的开发是使用查询式通信进行开发,也就是一路ID查询,另一路ID反馈,包括文件的传输也应该使用这种方式,可惜呢技术不到家,我采用了三种ID来实现该功能,首先两路ID Bcast_Add_ID + CMD_ACK_ID 实现IAP功能的查询及反馈,还有一路ID Boot_Add_ID 用来单独传输文件。其中Bcast_Add_ID + CMD_ACK_ID 使用一路can-fifo,Boot_Add_ID 使用另一路CAN-fifo用来接收文件,避免通信出错,接收文件的方法借鉴了原子哥的Uart接收bin文件的方法,我就不多啰嗦了。
IAP的查询式通信借鉴了汽车UDS的诊断服务,使用20/21/22/23等服务实现不同的功能。
例:20服务—01功能
Bcast_Add_ID Tx:20 01 02 00 02 00 00 00 (设定版本)
CMD_ACK_ID Rx:60 20 01 00 00 00 00 00 (设定成功返回)
CMD_ACK_ID Rx:80 20 01 00 00 00 00 00 (设定错误返回)

2.2.5 APP程序开发

APP程序开发中,除了前面介绍的重设中断向量外,一定要注意中断的有效性, 刚开始开发时大意的以为printf输出不同的参考值就以为开发完成了,结果中断全部失效。
在通信中断里设置APP程序跳转时不要直接使用IAP跳转程序,最好设置一个标志位,在主循环中根据标志位的不同进行程序跳转,而对于直接重启Bootloader程序,既可以使用标志位跳转,也可以使用NVIC_SystemReset() 函数进行跳转。

2.3 IAP上位机开发

IAP上位机其实只是简单开发实现功能,IDE使用的VSCode。

bin--------------生成可执行文件
build-----------执行cmake … & make
include--------头文件
src-------------cpp文件
setting--------config文件
update--------升级bin文件
框架
开发时主要注意下bin文件以及cfg文件的读取,其他的就是正常处理CAN通信功能。

can_start.sh
sh

2.4 IAP系统功能测试

上位机测试:
上位机
CAN Test数据查看
can

三、总结总结总结总

本系统安全性存在隐患,如介意请勿参考,文件的传输可以使用YModem协议,如果感兴趣可以自己查找资料开发,总之,就这样吧~
黎明就在眼前

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

【STM32---IAP】基于CAN总线的BootLoader上下位机设计 的相关文章

  • 物联网网关

    物联网网关是 连接物联网设备和互联网的重要桥梁 它负责将物联网设备采集到的数据进行处理 存储和转发 使其能够与云端或其它设备进行通信 物联网网关的作用是实现物联网设备与云端的无缝连接和数据交互 物联网网关功能 数据采集 物联网网关可以从物联
  • STM32F103概要

    The STM32F103x4 STM32F103x6 STM32F103xC STM32F103xD and STM32F103xE are a drop in replacement for STM32F103x8 B medium d
  • 硬件基础-电容

    电容 本质 电容两端电压不能激变 所以可以起到稳定电压作用 充放电 电容量的大小 想使电容容量大 使用介电常数高的介质 增大极板间的面积 减小极板间的距离 品牌 国外 村田 muRata 松下 PANASONIC 三星 SAMSUNG 太诱
  • 程序集 32 位打印显示在 qemu 上运行的代码,无法在真实硬件上运行

    我已经用 x86 汇编语言编写了一小段在裸硬件上运行的代码 此时 它已启用受保护的 32 位模式 然而 我遇到了与屏幕打印有关的问题 我读到 要在不中断的情况下执行此操作 可以将字符加载到特殊的内存区域 即 RAM 地址 0xb8000 知
  • Sparkfun Edge 引导加载程序问题

    今天终于到了 Sparkfun 板边板 遵循这个写得很好的指南 https codelabs developers google com codelabs sparkfun tensorflow 3 https codelabs devel
  • 1.69寸SPI接口240*280TFT液晶显示模块使用中碰到的问题

    1 69寸SPI接口240 280TFT液晶显示模块使用中碰到的问题说明并记录一下 在网上买了1 69寸液晶显示模块 使用spi接口 分辨率240 280 给的参考程序是GPIO模拟的SPI接口 打算先移植到FreeRtos测试 再慢慢使用
  • STM32的HAL中实现单按、长按和双按功能

    我正在尝试实现单击 双击和长按功能来执行不同的功能 到目前为止 我已经理解了单击和长按的逻辑 但我不知道如何检测双击 至于代码 我使用计数器实现了单击和长按 但代码仅停留在第一个 if 条件上 bool single press false
  • 无法使用 OpenOCD 找到脚本文件

    我正在尝试按照本教程将 OpenOCD 与我的 ST 发现板一起使用 https japaric github io discovery README html https japaric github io discovery READM
  • Freertos低功耗管理

    空闲任务中的低功耗Tickless处理 在整个系统运行得过程中 其中大部分时间都是在执行空闲任务的 空闲任务之所以执行 因为在系统中的其他任务处于阻塞或者被挂起时才会执行 因此可以将空闲任务的执行时间转换成低功耗模式 在其他任务解除阻塞而准
  • for循环延时时间计算

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 pandas是什么 二 使用步骤 1 引入库 2 读入数据 总结 前言 之前做led点亮的实验 好像是被delay函数影响了 因为delay参数设置的不对
  • NASM:磁盘读取超时

    尝试从磁盘 从同一文件 读取数据 将另外 2 个 512 字节扇区加载到内存中 磁盘读取功能如下 read DH sectors to ES BX from drive DL disk read push dx push bx Tried
  • 找出 x86 引导加载程序中引导了哪个驱动器

    我正在为 x86 编写游戏引导加载程序 在启动早期的某一时刻 我需要将启动驱动器中的一些扇区加载到内存中 我使用中断 0x13 ah 02 来执行此操作 当我在虚拟机中尝试它时 它就像一个魅力 然而 当我将映像刻录到 USB 驱动器时 机器
  • 核心耦合内存在 STM32F4xx 上可执行吗?

    尝试从 STM32F429s CCM 运行代码 但每当我命中 CCM 中的第一条指令时 我总是会遇到硬故障 并且 IBUSERR 标志被设置 该指令有效且一致 STM32F4xx 是否可能不允许从 CCM 执行 数据访问效果良好 alios
  • STM32 Nucleo 上的上升沿中断多次触发

    我正在使用 STM32 NUCLEO F401RE 微控制器板 我有一个扬声器 经过编程 当向上 向下推操纵杆时 可以按设定的量改变频率 我的问题是 有时 通常 当向上 向下推动操纵杆时 频率会增加 减少多次 这意味着 ISR 正在执行多次
  • 是否有 FAT FS 驱动程序希望引导扇区的字节 508 和 509 为零?

    在实施的同时我自己的引导扇区加载程序从 2012 年开始 https hg ulukai org ecm ldosboot rev 17884e6352e6 l1 255我确保将偏移量 508 和 509 处的字节清零 这些是标准 512
  • 编写一个简单的Bootloader HelloWorld - 错误函数打印字符串

    我尝试创建一个简单的引导加载程序来打印 hello world 当我调用一个仅打印 hello world 的函数时 我可以做到这一点 但是当我调用一个函数来打印特定字符串时 什么也没有发生 为此 我使用两个文件 第一个是 boot ld
  • 如何将 bin 文件(512 字节)写入软盘的第一个扇区(扇区 0)?

    如何将 bin 文件写入软盘 虚拟软盘 软盘映像的第一个扇区 我正在尝试启动一个简单的 512 字节引导加载程序 到处都显示 512 字节 的大小 所以我应该已经很好了 附加信息 引导加载程序仅显示一个字符串 我正在学习simple集会 有
  • ARM 的启动过程是怎样的?

    我们知道 对于X86架构 按下电源按钮后 机器开始执行0xFFFFFFF0处的代码 然后开始执行BIOS中的代码以进行硬件初始化 BIOS 执行后 它使用引导加载程序将操作系统映像加载到内存中 最后 操作系统代码开始运行 对于ARM架构 使
  • HAL_Delay() 陷入无限循环

    我被 HAL Delay 函数困住了 当我调用此函数 HAL Delay 时 控制陷入无限循环 在寻找问题的过程中 我发现了这个 http www openstm32 org forumthread2145 threadId2146 htt
  • stm32l0: 执行MI命令失败。使用 vFlashErase 数据包擦除闪存时出错

    我正在使用 Nucleo STM32L031 和 AC6 STM32 工作台 eclipse 我编写应用程序并进入调试模式 一切正常 直到我在应用程序中添加另一个功能 我注意到当我删除 评论 新函数 软件可以再次进入调试模式 但是当我添加

随机推荐

  • LinuxCNC学习-Machinekit手册介绍

    原文链接 http www machinekit io docs common user intro 1 Machinekit用户手册 1 1 关于手册 本手册的重点是如何 使用 Machinekit 安装并配置了Machinekit后 x
  • LinuxCNC学习-HAL库介绍

    原文链接 xff1a http www machinekit io docs hal intro 1 HAL库介绍 HAL代表硬件抽象层 在最高级别上 xff0c 它只是一种允许加载和互连多个 构建块 以组装复杂系统的方式 硬件 部分是因为
  • double float 类型在内存中的存储形式

    一 基础知识 浮点数分为 单精度和双精度 xff0c 在内存中都分为三部分 xff1b 符号位 xff1b 指数位 xff1b 尾数位 xff1b Float类型内存形式 xff1a 图1 float类型在内存中的形式 double类型内存
  • php array_walk break跳出循环的方法

    场景分析解决 场景 array walk使用的地方不要太多 xff0c 在某种情况眷下需要它跳出循环 分析 break 不是array walk的关键字return 不能达到break的效果 相当于foreach的 continue 歪个楼
  • gazebo黑屏打不开world的解决方法

    打开gazebo的时候会发现一直处于黑屏这种状态 xff0c 这是因为model库加载不正确导致的 cd gazebo mkdir p models cd gazebo models wget http file ncnynl com ro
  • JAVA Http的Post请求传参添加Authorization Basic Auth验证

    PostMan添加Authorization验证 pom xml添加依赖包 lt dependency gt lt groupId gt org apache commons lt groupId gt lt artifactId gt c
  • 一个字符串吧大写字母转换为小写字母

    709 转换成小写字母 难度简单140收藏分享切换为英文接收动态反馈 实现函数 ToLowerCase xff0c 该函数接收一个字符串参数 str xff0c 并将该字符串中的大写字母转换成小写字母 xff0c 之后返回新的字符串 示例
  • TX2/Linux下can总线的接收与发送命令和C程序实例

    本文博客深度参考了前辈的作品 xff1a TX2 Linux下can总线的接收与发送详解 xff01 https blog csdn net hhlenergystory article details 81976069 Linux CAN
  • ubuntu18.04 安装Qt交叉编译环境目标机为rk3288

    本文在虚拟机条件下安装成功 xff0c 采用Ubuntu18 04 64位镜像作为编译环境 需要准备材料 交叉编译器 xff1a 目标机器为64位的使用 gcc linaro 6 3 1 2017 05 x86 64 aarch64 lin
  • 使用matlab实现指定三维区域随机生成N个不相交球的函数

    自从写了这篇博客之后 xff0c 更多的人来问我这个问题了 简单写一个随机在一个三维区域生成球的matlab函数 风一样的航哥的博客 CSDN博客 comsol随机生成球体 上次简单写的功能 xff0c 可以实现一些比较稀疏的分布 xff0
  • 在嵌入式里面实现printf()类似的功能

    学习C语言大多数都是从printf 34 hello world 34 开始的 xff0c 对于printf的熟悉程度最高 xff0c 在嵌入式编程中 xff0c 实现printf函数有一种很标准的办法就是实现putch xff0c 绑定对
  • 我的第一个rust程序,感受一下

    周末了 xff0c 要学习一点让自己开心的东西 听说rust语言很年轻 xff0c 性能超过了C 43 43 xff0c 还能支持嵌入式编程 xff0c 作为一名未来要出名的代码工程师 xff0c 岂能错过 xff1f 于是上周开始学习这个
  • 走进他人内心的七项修炼

    本文是一篇读书笔记 xff0c 书名叫 我就是你啊 之所以看这本书 xff0c 是因为在结婚之后 xff0c 发现很多时候会吵架 xff0c 会发现自己情绪不好 xff0c 然后无能为力去解决 让我们来回顾一下 xff0c 化解一场纷争需要
  • 使用优先队列解决自己构造的数据类型

    在C 43 43 中优先队列有两种 xff0c 最大堆和最小堆 当数据类型为int的时候 xff0c 大家都会使用 xff0c 但是如果数据不是单一的 xff0c 比如数据是一个hashmap怎么办 xff1f 例子如下 xff1a You
  • curl header设置Authorization

    文章目录 场景解决 场景 接口设置了tymondesigns jwt auth 认证 xff0c 所以需要在请求的头部放置authorization 信息 解决 参考curl 官网 code class prism language php
  • python subprocess.Popen read阻塞问题解决

    python subprocess Popen read阻塞问题解决 背景 使用subprocess Popen打开一个子进程 xff0c 指定子进程的标准输入 xff0c 标准输出为subprocess PIPE xff0c 使用stdo
  • stm32 串口发送一帧数据(字符串版本和结构体版本)

    使用stm32串口发送一帧数据 具体程序如下 xff0c 相关知识点请自行脑补 1 串口发送字符串 发送一个字节 myUSARTx xff1a 具体串口 ch 一个8位的字节 void Debug SendByte USART TypeDe
  • 【通信总线】CAN 总线简介及应用

    CAN总线简介及应用 一 CAN总线简介二 CAN总线报文格式2 1 数据帧区分2 2 标准帧 11位2 3 扩展帧 29位 三 CAN测试工具四 CAN总线报文处理五 CAN应用 一 CAN总线简介 简单来说 xff0c CAN最早是由德
  • 【Linux---NX】基于Xavier NX模组安装Paho-MQTT C库及Json库并在ROS功能包中调用

    基于Xavier NX模组安装Paho MQTT C库及Json库并在ROS功能包中调用 一 系统环境二 Json 库下载编译三 Paho C库下载编译四 ROS中调用Paho C库及Json库 一 系统环境 Ubuntu 18 04 43
  • 【STM32---IAP】基于CAN总线的BootLoader上下位机设计

    IAP开发 下位机STM32 43 上位机Linux 一 准备工作二 IAP系统开发2 1 IAP简介2 2 IAP下位机开发2 2 1 刷写文件选择2 2 2 Bootloader程序框架2 2 3 Bootloader程序开发2 2 3