STM32 BootLoader 刷新项目 (五) 获取软件版本号-命令0x51

STM32 BootLoader 刷新项目 (五) 获取软件版本号-命令0x51

下面我们来讲解第一个指令,获取软件版本号命令-0x51.

在BootLoader中获取软件版本号的操作有多个重要的作用,具体如下:

  1. 版本管理

    • 识别当前版本:通过获取软件版本号,可以识别当前运行的固件版本。这对于调试、维护和升级都是至关重要的。
    • 追踪更新:版本号能够帮助开发团队和用户追踪软件的更新历史,确保每次升级都是有计划和可追溯的。
  2. 兼容性检查

    • 与硬件兼容性:在一些情况下,不同的软件版本可能对硬件有不同的要求。BootLoader可以根据版本号决定是否继续启动或提示用户进行升级。
    • 与其他软件模块兼容性:某些软件模块可能只有在特定版本的固件上才能正常运行。通过检查版本号,BootLoader可以确保所有模块的兼容性。
  3. 固件升级管理

    • 升级条件判断:在执行固件升级时,BootLoader可以根据当前版本号决定是否需要进行升级,或者是否需要强制进行某些重要升级。
    • 回滚机制:如果新的固件版本出现问题,BootLoader可以通过版本号识别和恢复到之前的稳定版本。
  4. 日志记录和故障诊断

    • 问题追踪:在记录系统日志和诊断故障时,版本号是一个关键参考信息。它可以帮助开发者快速定位问题所在版本,进而更有效地进行修复。
    • 客户支持:在提供客户支持时,通过获取软件版本号,可以更准确地了解客户正在使用的版本,从而提供更有针对性的支持和解决方案。
  5. 安全性

    • 固件验证:在某些安全敏感的应用中,BootLoader需要验证固件的完整性和来源。版本号可以作为验证过程的一部分,确保固件未被篡改或替换。
    • 防止回滚攻击:通过检查版本号,可以防止系统被降级到存在已知漏洞的老版本,从而提高系统的整体安全性。

总的来说,BootLoader中获取软件版本号的操作在版本管理、兼容性检查、升级管理、故障诊断和安全性等方面都起着至关重要的作用,是确保嵌入式系统稳定、可靠和安全运行的重要手段。

前面我们讲过了整个BootLoader的方案、架构以及协议,下面我们来具体讲解每一个命令该如何编程。

下面我们来讲解第一个指令,获取软件版本号命令-0x51.

主机发送命令码BootLoader回复备注
BL_GET_VER0x51BootLoader版本号(1 byte)从MCU中读BootLoader的版本号

下面是上位机的命令菜单:

image-20240713104433991

输入1,则通过上位机发送指令:发送的数据为0x05, 0x51, 0xe7, 0xe9, 0xab, 0x7c.

启动第一个字节,为接下来要发送数据的长度,即为5个字节,第二个字节为0x51,即为上面获取软件版本号的指令,后四位为前两位的CRC校验位。

image-20240714162041966

BL_GET_VER指令为获取软件版本号:

image-20240714102542277

下面是用Python写的上位机代码:

def decode_menu_command_code(command):ret_value = 0data_buf = []for i in range(255):data_buf.append(0)if(command  == 0 ):print("\n   Exiting...!")raise SystemExitelif(command == 1):print("\n   Command == > BL_GET_VER")COMMAND_BL_GET_VER_LEN              = 6data_buf[0] = COMMAND_BL_GET_VER_LEN-1 data_buf[1] = COMMAND_BL_GET_VER crc32       = get_crc(data_buf,COMMAND_BL_GET_VER_LEN-4)crc32 = crc32 & 0xffffffffdata_buf[2] = word_to_byte(crc32,1,1) data_buf[3] = word_to_byte(crc32,2,1) data_buf[4] = word_to_byte(crc32,3,1) data_buf[5] = word_to_byte(crc32,4,1) Write_to_serial_port(data_buf[0],1)for i in data_buf[1:COMMAND_BL_GET_VER_LEN]:Write_to_serial_port(i,COMMAND_BL_GET_VER_LEN-1)ret_value = read_bootloader_reply(data_buf[1])

通过读取上位机终端输入的“1”,知道是要获取软件版本号的命令,则按照规定先发送数据长度5,在发送命令指令0x51,在计算前两位的CRC值,总共6byte的数据发送给下位机。下位机收到数据按协议进行相应的解析。

下面通过bootloader_uart_read_data()函数,首先读出上位机发送过来的0x05,表示后续要接收5个字节的数据。后续则按5个字节的数据来接收数据。

之后收到的数据是: 0x51, 0xe7, 0xe9, 0xab, 0x7c.

通过switch语句,判断0x51,则进入bootloader_handle_getver_cmd(bl_rx_buffer),来回去软件版本号的函数。

void  bootloader_uart_read_data(void)
{uint8_t rcv_len=0;printmsg_Host("BL_DEBUG_MSG: Receive CMD\n\r");while (1){memset(bl_rx_buffer, 0, 200);//here we will read and decode the commands coming from host//first read only one byte from the host , which is the "length" field of the command packetHAL_UART_Receive(C_UART,bl_rx_buffer,1,HAL_MAX_DELAY);rcv_len= bl_rx_buffer[0];HAL_UART_Receive(C_UART,&bl_rx_buffer[1],rcv_len,HAL_MAX_DELAY);switch(bl_rx_buffer[1]){case BL_GET_VER:bootloader_handle_getver_cmd(bl_rx_buffer);break;default:printmsg("BL_DEBUG_MSG:Invalid command code received from host \n");break;}}}

进入到bootloader_handle_getver_cmd()函数来获取软件版本号,首先计算排除后四位CRC数据前面收到数据的CRC值。如果计算出CRC的值,在和之前上位机发送的CRC,如果正确则进行软件版本号。

/*Helper function to handle BL_GET_VER command */
void bootloader_handle_getver_cmd(uint8_t *bl_rx_buffer)
{uint8_t bl_version;// 1) verify the checksumprintmsg("BL_DEBUG_MSG:bootloader_handle_getver_cmd\n");//Total length of the command packetuint32_t command_packet_len = bl_rx_buffer[0]+1 ;//extract the CRC32 sent by the Hostuint32_t host_crc = *((uint32_t * ) (bl_rx_buffer+command_packet_len - 4) ) ;if (! bootloader_verify_crc(&bl_rx_buffer[0],command_packet_len-4,host_crc)){printmsg("BL_DEBUG_MSG:checksum success !!\n");// checksum is correct..bootloader_send_ack(bl_rx_buffer[0], 1);bl_version = get_bootloader_version();printmsg("BL_DEBUG_MSG:BL_VER : %d %#x\n",bl_version,bl_version);bootloader_uart_write_data(&bl_version,1);}else{printmsg("BL_DEBUG_MSG:checksum fail !!\n");//checksum is wrong send nackbootloader_send_nack();}
}

下面则通过HAL库中计算CRC的值。

/* This verifies the CRC of the given buffer in pData. */
uint8_t bootloader_verify_crc (uint8_t *pData, uint32_t len, uint32_t crc_host)
{uint32_t uwCRCValue = 0xff;for (uint32_t i=0 ; i < len ; i++){uint32_t i_data = pData[i];uwCRCValue = HAL_CRC_Accumulate(&hcrc, &i_data, 1);}/* Reset CRC Calculation Unit */__HAL_CRC_DR_RESET(&hcrc);if( uwCRCValue == crc_host){return VERIFY_CRC_SUCCESS;}return VERIFY_CRC_FAIL;
}

通过下面的函数返回软件版本号。

/* Just returns the macro value. */
uint8_t get_bootloader_version(void)
{return (uint8_t)BL_VERSION;
}

如果正确的传输,则发送ACK让上位机接收。

/* This function sends ACK if CRC matches along with "len to follow" */
void bootloader_send_ack(uint8_t command_code, uint8_t follow_len)
{//here we send 2 byte.. first byte is ack and the second byte is len valueuint8_t ack_buf[2];ack_buf[0] = BL_ACK;ack_buf[1] = follow_len;HAL_UART_Transmit(C_UART, ack_buf,2, HAL_MAX_DELAY);}

如果错误的话,则传输NACK给上位机传输。

/* This function sends NACK */
void bootloader_send_nack(void)
{uint8_t nack = BL_NACK;HAL_UART_Transmit(C_UART, &nack, 1, HAL_MAX_DELAY);
}

下面则为执行命令1,0x51命令,则正确返回软件版本号。

image-20240714162041966

至此,获取软件版本号命令0x51的整个流程已经梳理完成。

往期文章请参考:

STM32 BootLoader 刷新项目 (一) STM32CubeMX UART串口通信工程搭建

STM32 BootLoader 刷新项目 (二) 方案介绍

STM32 BootLoader 刷新项目 (三) 程序框架搭建及刷新演示

STM32 BootLoader 刷新项目 (四) 通信协议

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

AI+折叠屏,荣耀的创新周期论

文&#xff5c;刘俊宏 编&#xff5c;王一粟 2024年&#xff0c;AI和折叠屏的演进路线&#xff0c;已经成为了手机行业的共识。 首先&#xff0c;手机市场的新增量已经被折叠屏所接管。据Counterpoint Research数据显示&#xff0c;中国2024年第一季度折叠屏手机销量同比增长…

BUUCTF逆向wp [HDCTF2019]Maze

第一步 查壳&#xff0c;本题是32位&#xff0c;有壳&#xff0c;进行脱壳。 第二步 这里的 jnz 指令会实现一个跳转&#xff0c;并且下面的0EC85D78Bh被标红了&#xff0c;应该是一个不存在的地址&#xff0c;这些东西就会导致IDA无法正常反汇编出原始代码&#xff0c;也称…

【系统架构设计】数据库系统(一)

数据库系统&#xff08;一&#xff09; 数据库模式与范式数据库的结构与模式数据模型关系代数数据的规范化反规范化 数据库设计事务管理备份与恢复分布式数据库系统数据仓库数据挖掘NoSQL大数据 数据库模式与范式 数据库的结构与模式 数据库技术中采用分级的方法将数据库的结…

萝卜快跑无人出租车是有人远程代驾? 客服:没有人操控

ChatGPT狂飙160天&#xff0c;世界已经不是之前的样子。 更多资源欢迎关注 近期“萝卜快跑”无人驾驶网约车相关话题引发网友热议。 有网传图片显示&#xff0c;萝卜快跑机器人智控中心&#xff0c;有真人坐在带有方向盘的屏幕前&#xff1b; 有网友认为所谓的无人网约车&am…

【设计模式】【创建型模式】【02工厂模式】

系列文章 可跳转到下面链接查看下表所有内容https://blog.csdn.net/handsomethefirst/article/details/138226266?spm1001.2014.3001.5501文章浏览阅读2次。系列文章大全https://blog.csdn.net/handsomethefirst/article/details/138226266?spm1001.2014.3001.5501 目录 系…

C++链接FTP服务器并下载数据(在qt中编写)

.pro文件 #------------------------------------------------- # # Project created by QtCreator 2024-07-16T13:19:03 # #-------------------------------------------------QT core gui networkgreaterThan(QT_MAJOR_VERSION, 4): QT widgetsTARGET untitled TE…

通过SchedulingConfigurer 接口完成动态定时任务

通过SchedulingConfigurer 接口完成动态定时任务 一.背景 在Spring中&#xff0c;除了使用Scheduled注解外&#xff0c;还可以通过实现SchedulingConfigurer接口来创建定时任务。它们之间的主要区别在于灵活性和动态性。Scheduled注解适用于固定周期的任务&#xff0c;一旦任…

【C++数据结构】二叉搜索树(超详细图解操作过程,超详细讲解代码实现)

目录 01.二叉搜索树的概念 02.二叉搜索树的操作过程 03.二叉搜索树的代码实现 &#xff08;1&#xff09;基本框架 &#xff08;2&#xff09;树的创建与销毁 &#xff08;3&#xff09;元素的查找 &#xff08;4&#xff09;元素的插入 &#xff08;5&#xff09;元素的…

Day71 代码随想录打卡|回溯算法篇---全排列

题目&#xff08;leecode T46&#xff09;&#xff1a; 给定一个不含重复数字的数组 nums &#xff0c;返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 方法&#xff1a;全排列是数学中的基础问题&#xff0c;也是回溯算法能解决的经典问题。全排列因为每个元素都会…

卷积神经网络学习问题总结

问题一&#xff1a; 深度学习中的损失函数和应用场景 回归任务&#xff1a; 均方误差函数&#xff08;MSE&#xff09;适用于回归任务&#xff0c;如预测房价、预测股票价格等。 import torch.nn as nn loss_fn nn.MSELoss() 分类任务&#xff1a; 交叉熵损失函数&…

AI算法19-偏最小二乘法回归算法Partial Least Squares Regression | PLS

偏最小二乘法回归算法简介 算法概述 偏最小二乘法模型可分为偏最小二乘回归模型和偏最小二乘路径模型。其中偏最小二乘回归模型是一种新型的多元统计方法&#xff0c;它集中了主成分分析、典型相关分析和线性回归的特点&#xff0c;特别在解决回归中的共线性问题具有无可比拟…

PX4 运行 make px4_sitl_default gazebo 报错

报错原因&#xff1a;最开始我把依赖一直都是在base环境下安装的&#xff0c;没有conda deactivate&#xff0c;而pip install的东西应该装在系统环境&#xff0c;不能装在base环境下&#xff0c;sudo apt 是装在系统环境的 1.检查ros 用鱼香ros安装 wget http://fishros.…

日活2.5亿的Twitter 使用了哪些数据库?

Twitter 使用什么数据库存储用户每天发送的数亿条推文&#xff1f;是 SQL、NoSQL 还是其它持久化存储系统&#xff1f; Twitter 使用什么数据库&#xff1f; 任何一个稍微有点规模的系统其存储层绝不会只使用一种数据库&#xff0c;服务于数以亿计用户的Twitter更是如此。Twit…

《YOLOv10改进实战专栏》专栏介绍 专栏目录

《YOLOv10改进实战专栏》介绍及目录 YOLOv10官方仓库地址 专栏地址&#xff1a;点击跳转 专栏导航如下&#xff1a; &#x1f380;基础入门篇&#x1f380; 万字长文&#xff0c;小白新手怎么开始做YOLO实验&#xff0c;从零开始教&#xff01;整体思路在这里&#xff0c;科研指…

Vue学习---vue cli 项目创建

使用的编辑工具webStorm 创建例子: hello vue create hello 选择 vue3 进行创建 运行 npm run serve 测试访问&#xff1a;http://localhost:8080 改动内容重新编译&#xff1a; npm run build dist 目录就是编译后的可运行内容

浅谈C嘎嘎类与对象

本篇文章与大家浅谈一下C嘎嘎的类与对象知识点 类的定义 关键字&#xff1a;class 语法格式&#xff1a; class 类名 { }&#xff1b;//这里的分号不能少 此外&#xff0c;class有三个属性分别是private、public、protected&#xff0c;这三个属性是干啥的&#xff0c;相…

MSPM0G3507——时钟主频拉到80MHZ

先点开使用时钟树 在配置时钟界面这样配置

Ghost Browser指纹浏览器年+IPXProxy代理IP组合:SheIn卖家必看

SheIn是一家时尚电商公司&#xff0c;其用户数量近年来增长迅速&#xff0c;在全球的知名度越来越高。SheIn跨境电商卖家想要提升店铺曝光和排名&#xff0c;从而增加销量和信誉的话&#xff0c;就需要满足独立IP、模拟设备参数、独立环境等条件。同时满足这些条件的话就需要用…

生成式人工智能(AI)的未来

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

windows qt编译报错 无法打开包括文件: “EGL/egl.h”: No such file or directory

windows mingw32 qt creator QtAV 推荐ffmpeg依赖包 QT5.14.2 如果出现&#xff1a;无法打开包括文件: “EGL/egl.h”: No such file or directory 可能是Qt6的问题.在QT5上安装。 编译步骤&#xff1a; git clone https://github.com/wang-bin/QtAV.git cd QtAV &&…