silicon labs平台通过串口升级固件方案
开发环境
- windows
- simplicity studio 5
- geck sdk 4.1
一 bootloader
新建BGAPI UART DFU工程
- 工程新建完成以后看一下linkerfile.ld文件的flash和ram的配置跟自己的application工程是否对应得上
- 配置串口波特率和引脚
- 默认使用PB0进入bootloader模式,这里改成None
二 准备bt_host_uart_dfu.exe
geck sdk里面提供了bt_host_uart_dfu.exe的源码,但是需要自己编译。windows环境需要使用MinGW工具,linux使用make指令直接就可以编译出可执行文件。
2.1 安装MinGW
下载地址: https://sourceforge.net/projects/mingw-w64/files/
MinGW-W64-install.exe是在线安装,经常会提示错误,在这里建议直接下载x86_64-win32-seh。
下载完之后直接解压出来即可。
将bin的路径设置到环境变量Path中
在cmd界面中执行gcc -v,显示版本号说明安装成功。
2.2 编译
bt_host_uart_dfu的源码在gecko_sdk\app\bluetooth\example_host\bt_host_uart_dfu目录下
在该目录下使用shell power执行命令 mingw32-make 生成exe
不出意外在exe目录下生成了一个bt_host_uart_dfu.exe
三 升级
首先,当前固件需要能够接收串口发送过来的数据。
将bt_host_uart_dfu.exe 和 application.gbl放在同一个文件夹里面,在该文件夹下打开power shell执行如下指令
.\bt_host_uart_dfu.exe -u COM14 -f -l 4 -b 115200 .\application.gbl
- -u指定串口号
- -f 表示禁止使用流控
- -l 4 指定log日志级别
- -b 指定波特率
特别注意:bt_host_uart_dfu.exe默认是开启流控的,如果你的bootloader没有开启流控,一定要加上-f参数,否者你会看到数据发出来了但是对方却怎么也收不到
bt_host_uart_dfu.exe 执行的最初会发送指令20 00 FF 02,固件收到这个数据之后就进入bootloader模式。
#define BOOTLOADER_RESET_REASON_BOOTLOAD 0x0202u
#define BOOTLOADER_RESET_SIGNATURE_VALID 0xF00Fu
#define SRAM_BASE (0x20000000UL)
void bootloader_mode(void)
{BootloaderResetCause_t *cause = (BootloaderResetCause_t *) (SRAM_BASE);cause->reason = BOOTLOADER_RESET_REASON_BOOTLOAD;cause->signature = BOOTLOADER_RESET_SIGNATURE_VALID;CHIP_Reset();
}
之后不出意外就可以升级成功了。
四 改进bootloader
BGAPI默认是单区更新的,也就是bootloader会把收到的新固件直接覆盖掉原来的固件。如果在升级的过程中被中断了,那么设备将一直处于bootloader模式。
通过下面几步操作可以实现双区更新,并且升级过程被中断还可以启动老的固件。
- 修改btl_bootloader.c的flashData函数
static void flashData(uint32_t address,uint8_t data[],size_t length)
{const uint32_t pageSize = (uint32_t)FLASH_PAGE_SIZE;//ching: 默认是写到了0x4000地址,这里改成0x5C000地址处,address传过来的地址默认以0x4000为基地址address += 360448;//0x5C000 - 0x4000 = 360448, 加360448偏移到0x5C000地址处// Erase the page if write starts at a page boundaryif (address % pageSize == 0UL) {flash_erasePage(address);}// Erase all pages that start inside the write rangefor (uint32_t pageAddress = (address + pageSize) & ~(pageSize - 1UL);pageAddress < (address + length);pageAddress += pageSize) {flash_erasePage(pageAddress);}flash_writeBuffer_dma(address, data, length, SL_GBL_MSC_LDMA_CHANNEL);
}
- 修改btl_bootloader.c的bootload_applicationCallback函数
#define PACK_LEN 1024
/*** @ching:* @brief 将0x5C000地址处的固件全部搬运到0x4000地址处* @param length 已经接收到的新固件长度*/
static void install_application(uint32_t length)
{const uint32_t pageSize = (uint32_t)FLASH_PAGE_SIZE;uint32_t bak_address = 0x5C000;uint32_t write_address = 0x4000;uint8_t buffer[PACK_LEN];uint16_t seg = length / PACK_LEN;if(length % PACK_LEN){seg += 1;}LOGD("seg: %d\n", seg);for(int i = 0; i < seg; i++){LOGD("write_address: %08x\n", write_address);if(write_address % pageSize == 0){flash_erasePage(write_address);}memset(buffer, 0, PACK_LEN);memcpy(buffer, (uint32_t *)(bak_address + i * PACK_LEN), PACK_LEN);flash_writeBuffer(write_address, buffer, PACK_LEN);write_address += PACK_LEN;}
}
void bootload_applicationCallback(uint32_t address,uint8_t data[],size_t length,void *context)
{static uint32_t app_length = 0;(void)context;//ching: 使用一个特殊的长度值来判断是否进行搬运工作if(length == 0xA5A5A5A5){//copy 0x5C000内容到0x4000 长度 app_lengthLOGD("all length: %d\n", app_length);install_application(app_length);app_length = 0;return;}// Check if addresses to write to are within writeable spaceif ((address < (uint32_t)(mainBootloaderTable->startOfAppSpace))|| ((address + length)> (uint32_t)(mainBootloaderTable->endOfAppSpace))) {BTL_DEBUG_PRINT("OOB 0x");BTL_DEBUG_PRINT_WORD_HEX(address);BTL_DEBUG_PRINT_LF();return;}//ching: 记录新固件的长度app_length += length;flashData(address, data, length);
}
- 修改btl_comm_bgapi_common.c的bootloader_bgapi_communication_main函数
当收到更新完成指令后调用applicationCallback回调并传入len = 0xA5A5A5A5
else if (command.header.class == BGAPI_PACKET_CLASS_SYSTEM) {// BGAPI System commandswitch (command.header.command) {case SYSTEM_RESET:LOGD("Reset request\n");//ching: 长度传0xA5A5A5A5,新固件已经接收完成,开始搬运工作parseCb->applicationCallback(0, NULL, 0xA5A5A5A5, NULL);break;
完成以上步骤之后,bootloader就实现了双区更新的功能。
相关文章:

silicon labs平台通过串口升级固件方案
开发环境 windowssimplicity studio 5geck sdk 4.1 一 bootloader 新建BGAPI UART DFU工程 工程新建完成以后看一下linkerfile.ld文件的flash和ram的配置跟自己的application工程是否对应得上 配置串口波特率和引脚 默认使用PB0进入bootloader模式,这里改成Non…...

MySQL 派生表产生关联索引auto_key0导致SQL非常的慢
相同的SQL在maridb运行0.5秒,在MySQL8.0.26中运行要19秒 官方MySQL在处理子查时,优化器有个优化参数derived_merge,MySQL7开启添加,默认on.很多情况可以自动优化派生表,避免创建临时索引auto_key0和生成临时表数据做…...

计算机网络期末复习汇总(附某高校期末真题试卷)
文章目录一、选择题二、填空题三、名词解析四、简答题五、高校期末真题一、选择题 1、传输延迟时间最小的交换方法是( A ) A.电路交换 B.报文交换 C.分组交换 D.信元交换 2、在OSI七层结构模型中,处于数据链路层与运输层之间的是( B) A、物…...

2月,还是不要跳槽
新年已经过去,马上就到金三银四跳槽季了,一些不满现状,被外界的“高薪”“好福利”吸引的人,一般就在这时候毅然决然地跳槽了。 在此展示一套学习笔记 / 面试手册,年后跳槽的朋友可以好好刷一刷,还是挺有必…...

科技爱好者周刊之爱好者记录
前言 平时浏览的内容杂七杂八,说好听一些叫做“内容丰富,涉猎甚广”,实际一些则是受到主流大环境的冲击加之自身的控制力尚且不足。 有过类似经历的人大多知道,碎片化的信息除了填充大脑的冗余空间,在短期时间内就会被…...

C++入门:函数重载
目录 一. 函数重载的概念和分类 1.1 什么是函数重载 1.2 函数重载的分类 1.3 关于函数重载的几点注意事项 二. C实现函数重载的底层逻辑(为什么C可以实现函数重载而C语言不能) 2.1 编译器编译程序的过程 2.2 为什么C可以实现函数重载而C语言不能 …...

每天10个前端小知识 【Day 16】
👩 个人主页:不爱吃糖的程序媛 🙋♂️ 作者简介:前端领域新星创作者、CSDN内容合伙人,专注于前端各领域技术,成长的路上共同学习共同进步,一起加油呀! ✨系列专栏:前端…...
23美赛D题:确定联合国可持续发展目标的优先级(ICM)思路Python代码
问题D(交叉网络建模题):确定联合国可持续发展目标的优先级(ICM) 赛题目的:对联合国制定的17个可持续发展目标进行关系网络的构建同时评估其可能存在的影响赛题解读&解题思路链接:交叉网络回归路径分析,如何寻找到能代表可持续发展目标的数值是这道题的难点。背景 联…...

高校房产管理系统有哪些管理功能范围?
数图互通高校房产管理系统是基于公司自主研发的FMCenterV5.0平台,是针对中国高校房产的管理特点和管理要求,研发的一套标准产品;通过在中国100多所高校的成功实施和迭代,形成了一套成熟、完善、全生命周期的房屋资源管理解决方案。…...

ACM MM 相关内容的整理+汇总
目录一、网址二、重要时间点三、论文篇幅要求四、征稿主题五、论文格式相关要求六、论文模板修改成投稿模式上述参考七、模板使用相关八、关于图片方面的问题九、Review and Rebuttal十、ACM MM2022相关论文参考arxiv上 ACM MM2022 论文汇总一、网址 ACM MM2023 主页࿱…...

前段时间公司招人,面了一个要20K的,一问自动化只会点皮毛···
前段时间公司要招2个自动化测试,同事面了几十个候选人,发现了一个很奇怪的现象,面试的时候,如果问的是框架api、脚本编写这些问题,基本上个个都能对答如流,等问到实际项目的时候,类似“怎么从0开…...

链表:反转链表、快慢指针、删除链表【零神基础精讲】
来源0x3f:https://space.bilibili.com/206214 文章目录反转链表[206. 反转链表](https://leetcode.cn/problems/reverse-linked-list/)[92. 反转链表 II](https://leetcode.cn/problems/reverse-linked-list-ii/)[25. K 个一组翻转链表](https://leetcode.cn/proble…...
SQlServer 定时执行sql语句作业的制定
1、打开【SQL Server Management Studio】,在【对象资源管理器】列表中选择【SQL Server 代理】; 2、鼠标右击【SQL Server 代理】,选择【启动(S)】,如已启动,可以省略此步骤; 3、展开【SQL Server 代理】列…...

Windows安装VMware虚拟机+配置Ubuntu的详细步骤以及解决配置过程中报错的问题(完整版)
目录 引言: 过程: 安装VMware虚拟机: 在VMware虚拟机中配置Ubuntu: 在VMware虚拟机中安装Ubuntu: VMware中启动虚拟机时报错问题的解决: 正式开始安装Ubuntu: 参考资料: 引言: 在学习计…...
103.第十九章 MySQL数据库 -- MySQL的备份和恢复、MySQL主从复制(十三)
mysqldump 常见通用选项: -A, --all-databases #备份所有数据库,含create database -B, --databases db_name… #指定备份的数据库,包括create database语句 -E, --events:#备份相关的所有event scheduler -R, --routines:#备份所有存储过程和自定义函数 --triggers:#备…...
SSH免密登录以及IP别名配置(保姆级教程)
目录 设置免密登录 客户端生成密钥 将公钥上传到服务器 创建别名 创建config配置 配置说明 保持SSH连接不断 方案一 方案二 设置免密登录 客户端生成密钥 在终端输入如下命令,进行回车即可完成后会在用户目录下的.ssh目录下生成公钥id_rsa.pub和私钥id_r…...

测试开发之Django实战示例 第十二章 创建API
第十二章 创建API在上一章里,创建了一个学生注册系统和选课系统。然后创建了展示课程内容的视图,以及学习了如何使用Django缓存框架。在这一章里有如下内容:建立RESTful API管理API视图的认证与权限建立API视图集和路由1创建RESTful API你可能…...

Yakit实战技巧:用MITM热加载任意修改流量
背景 用户在使用 Yakit MITM 功能的时候,经常会遇到一些特殊需求: 我的数据包需要携带一些特征变量才能访问,但是浏览器无法做到,我可以批量修改流量新增某一个 Header 吗? 我可以在代理层面在所有流量中新增一个参数…...
如何搭建自己的MQTT服务器?跟我来,一行代码搞定!
如何搭建自己的MQTT服务器?跟我来,一行代码搞定!什么是mosquitto?如何使用mosquitto云服务器注意事项MQTT客户端软件下载在文章开始之前,你首先需要有一台服务器,我这里用的是阿里云的轻量级云服务器&#…...

遇到的问题
一、axios 请求 1、axios post 提交的请求的 content-type 为 json 默认情况下,axios将JavaScript对象序列化为JSON,再发送数据application/x-www-form-urlencoded格式相反,您可以使用URLSearchParamsAPI,也就是支持在绝大多数…...
零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?
一、核心优势:专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发,是一款收费低廉但功能全面的Windows NAS工具,主打“无学习成本部署” 。与其他NAS软件相比,其优势在于: 无需硬件改造:将任意W…...

高频面试之3Zookeeper
高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制࿰…...

Psychopy音频的使用
Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...
Matlab | matlab常用命令总结
常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...

【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习
禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...

算法:模拟
1.替换所有的问号 1576. 替换所有的问号 - 力扣(LeetCode) 遍历字符串:通过外层循环逐一检查每个字符。遇到 ? 时处理: 内层循环遍历小写字母(a 到 z)。对每个字母检查是否满足: 与…...
如何配置一个sql server使得其它用户可以通过excel odbc获取数据
要让其他用户通过 Excel 使用 ODBC 连接到 SQL Server 获取数据,你需要完成以下配置步骤: ✅ 一、在 SQL Server 端配置(服务器设置) 1. 启用 TCP/IP 协议 打开 “SQL Server 配置管理器”。导航到:SQL Server 网络配…...

2025-05-08-deepseek本地化部署
title: 2025-05-08-deepseek 本地化部署 tags: 深度学习 程序开发 2025-05-08-deepseek 本地化部署 参考博客 本地部署 DeepSeek:小白也能轻松搞定! 如何给本地部署的 DeepSeek 投喂数据,让他更懂你 [实验目的]:理解系统架构与原…...
计算机系统结构复习-名词解释2
1.定向:在某条指令产生计算结果之前,其他指令并不真正立即需要该计算结果,如果能够将该计算结果从其产生的地方直接送到其他指令中需要它的地方,那么就可以避免停顿。 2.多级存储层次:由若干个采用不同实现技术的存储…...

以太网PHY布局布线指南
1. 简介 对于以太网布局布线遵循以下准则很重要,因为这将有助于减少信号发射,最大程度地减少噪声,确保器件作用,最大程度地减少泄漏并提高信号质量。 2. PHY设计准则 2.1 DRC错误检查 首先检查DRC规则是否设置正确,然…...