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,也就是支持在绝大多数…...
线程没有被终止的异常的处理
process Runtime.getRuntime().exec(command); process.waitFor(); // 这个调用比较关键,就是等当前命令执行完成后再往下执行 if (!file.exists()) { Ulog.error("html转pdf执行失败"); } else { …...
RocketMQ 初步了解
RocketMQ 初步了解 前言: 近期,因公司使用 RocketMQ 作为消息队列中间件,特此了解。 RocketMQ 是阿里巴巴在 2012 年开发的分布式消息中间件,专为万亿级超大规模的消息处理而设计,具有高吞吐量、低延迟、海量…...
Mac下PyCharm快捷键
Mac键盘符号和修饰键说明 ⌘ Command⇧ Shift⌥ Option⌃ Control↩︎ Return/Enter⌫ Delete⌦ 向前删除键(FnDelete)↑ 上箭头↓ 下箭头← 左箭头→ 右箭头⇞ Page Up(Fn↑)⇟ Page Down(Fn↓)Home Fn …...
城市管网监测系统,保障城市血管生命线!
各种不同的管网线路组成了城市的供血管道,管网对于维持正常的社会生活、生产秩序和公共安全至关重要。我国城市平均漏损率达到38%,部分城市甚至超过50%,远超发达国家的平均水平(10%)。对于管道状态的监测,是…...
Web3中文|1月数据显示复苏迹象,涉及NFT、DeFi、Dapp、链游……
本期看点 1、Dapp行业概述 2、DeFi的TVL增长26.8%,有回暖迹象 3、NFT市场数据飙升,交易额达9.46亿美元 4、链游使用量占行业48% 5、与去年相比,1月份区块链漏洞损失最低 区块链领域正在多元化发展,2023年1月,从各…...
MySQL索引的介绍以及优缺点
1.索引简介 索引是一种用于快速查询和检索数据的数据结构,其本质可以看成是一种排序好的数据结构。 使用索引可以快速找出在某个或多个列中有一特定值的行,所有MySQL列类型都可以被索引,对相关列使用索引是提高查询操作速度的最佳途径。 索…...
Java_小项目书城
1.概述 书城的基本功能: 展示书籍上新书籍下架书籍退出应用 书城项目所涉及到的知识点: 用户交互–键盘录入分支结构,循环结构面向对象的思维,封装对象集合的使用 2.菜单的编写 这部分代码就是读取用户键盘的录入࿰…...
Unreal Engine08:Pawn的实现
写在前面 Pawn继承于Actor,增加了一些用于控制和提供玩家视角的功能,这里主要是介绍一下Pawn类的实现。 一、创建一个Pawn的C类 创建的C类也是放在Source文件夹中的Public和Private文件夹中;选择Pawn作为继承的父类;头文件中除…...
408强化(二)线性表纯享版
目录 一、顺序表(数组)和链表总览 二、考情分析 2.1 从历年考情可以看出,如果一个方法出现了第2次,一般是以下情况: 2.2 没有考过的地方 三、 共同操作或考法 3.1 多指针后移 3.2 逆置 3.3 空间换时间的操作 3.…...
ubuntu下如何使用wireshark抓包,保姆级教程
Wireshark(前称Ethereal)是一个网络封包分析软件。网络封包分析软件的功能是截取网络封包,并尽可能显示出最为详细的网络封包资料。Wireshark使用WinPCAP作为接口,直接与网卡进行数据报文交换。 一、安装wireshark 打开终端&…...
做游戏特效的网站/自媒体平台注册入口官网
摘 要 在以互联网为背景的时代笼罩之下,教育行业迈向新模式的今天,人们的温饱问题已不再是威胁生命安全的源头,我国随着义务教育的普及,教育水品的不断提高,高校师生队伍不断壮大,实验室安全事故代替温饱问…...
注册公司网站模板下载/深圳短视频seo教程
后端(路由)主要是获取客户端发来的请求(request),然后给他response。 //本地访问地址,http://127.0.0.1:8085/test.txt?namezhang&age27#li nodejs自带URL模块 var urlrequire(url) http.createServer…...
找人做事的网站/google seo 优化招聘
前言JDK的并发包中提供了几个非常有用的工具类,这些工具类给我们在业务开发过程中提供了一种并发流程控制的手段,本文会基于实际应用场景介绍如何使用Semaphore,以及内部实现机制。Semaphore是什么Semaphore也叫信号量,在JDK1.5被…...
做网站好处/今日最火的新闻
pandas DataFrame 数据转化为 列表 list的方法 大家好,我叫亓官劼(q guān ji ),在CSDN中记录学习的点滴历程,时光荏苒,未来可期,加油~博客地址为:亓官劼的博客 本文原创为亓官劼&am…...
爱看视频的网站/站长网站
to_date("要转换的字符串","转换的格式") 两个参数的格式必须匹配,否则会报错。 即按照第二个参数的格式解释第一个参数。 to_char(日期,"转换格式" ) 即把给定的日期按照“转换格式”转换。 转换的格式: 表示year的&am…...
wordpress如何实时刷新数据库/河北seo平台
最近在数据库优化的时候,看到一些表在设计上使用了text或者blob的字段,单表的存储空间已经达到了近100G,这种情况再去改变和优化就非常难了一、简介为了清楚大字段对性能的影响,我们必须要知道innodb存储引擎的处理方式࿱…...