silicon labs平台通过串口升级固件方案

9 篇文章 13 订阅
订阅专栏

开发环境

  • windows
  • simplicity studio 5
  • geck sdk 4.1

一 bootloader

新建BGAPI UART DFU工程
在这里插入图片描述

  1. 工程新建完成以后看一下linkerfile.ld文件的flash和ram的配置跟自己的application工程是否对应得上
    在这里插入图片描述
  2. 配置串口波特率和引脚
    在这里插入图片描述
  3. 默认使用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

下载MinGW有困难的可以直接下载这个 bt_host_uart_dfu.exe

三 升级

升级的过程如下图:
在这里插入图片描述

  1. 固件(APP)收到 bt_host_uart_dfu.exe 发过来的升级指令:20 00 FF 02,固件收到改指令以后重启并进入bootloader模式
  2. bootloader接收 bt_host_uart_dfu.exe 发送过来的新固件。
  3. bootloader将新固件直接写到APP区域

全部写完以后直接启动APP,在升级过程中如果被中断了,那么设备将一直处于bootloader模式。

首先,当前固件需要能够接收串口发送过来的数据。

将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模式。

4.1 升级过程描述

通过下面几步操作可以实现双区更新,并且升级过程被中断还可以启动老的固件。
在这里插入图片描述

  1. 固件(APP)收到 bt_host_uart_dfu.exe 发过来的升级指令:20 00 FF 02,固件收到改指令以后重启并进入bootloader模式
  2. bootloader接收 bt_host_uart_dfu.exe 发送过来的新固件。
  3. bootloader将新固件写到APP_bak区域。

一直重复步骤2和3直到所有固件都接收完成

  1. 新固件验证完成以后,bootloader将APP_bak区域的新固件搬运到APP区域,并启动新的APP

4.2 代码修改

  1. 修改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 boundary
  if (address % pageSize == 0UL) {
    flash_erasePage(address);
  }

  // Erase all pages that start inside the write range
  for (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);
}
  1. 修改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_length
      LOGD("all length: %d\n", app_length);
      install_application(app_length);
      app_length = 0;
      return;
  }


  // Check if addresses to write to are within writeable space
  if ((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);
}
  1. 修改btl_comm_bgapi_common.c的bootloader_bgapi_communication_main函数
    当收到更新完成指令后调用applicationCallback回调并传入len = 0xA5A5A5A5
else if (command.header.class == BGAPI_PACKET_CLASS_SYSTEM) {
      // BGAPI System command
      switch (command.header.command) {
        case SYSTEM_RESET:
          LOGD("Reset request\n");

          //ching: 长度传0xA5A5A5A5,新固件已经接收完成,开始搬运工作
          parseCb->applicationCallback(0, NULL, 0xA5A5A5A5, NULL);

         
          break;

完成以上步骤之后,bootloader就实现了双区更新的功能。

32f4 usb 升级程序_单片机通过串口升级固件
weixin_33510623的博客
01-11 1117
什么是在线升级?我们在开发阶段,调试单片机时更换程序,一般是通过下载器(仿真器),把保存程序的Flash擦除,再重新编程。那如果到了量产阶段,已经组装好成品了,或者已经到用户手上了,需要再次更新程序时,就没办法通过下载器去更新了。此时考虑通过外围的通信接口(UART/USB/SPI/I2C/CAN等)来实现升级。如何控制升级过程?为了保证升级的可重复性和安全性,从Flash中划分一小块区域作为升级...
STM32---串口实现在应用程序的固件更新(IAP)
weixin_41155462的博客
12-09 4749
STM32 IAP原理
CP210x USB驱动程序 - 兼容Windows 11
最新发布
gitblog_09703的博客
09-06 438
CP210x USB驱动程序 - 兼容Windows 11 项目地址:https://gitcode.com/open-source-toolkit/f0717 欢迎使用CP210x USB虚拟串口驱动程序! 资源简介 本仓库提供了最新的CP210x USB驱动程序,特别适用于Windows操作系统系列,包括最新的Windows 11平台。CP210x系列芯片是由Silicon Labs设计的高效...
STM32 IAP固件升级程序源代码。 STM32通过串口,接 收上位机、APP、或者服务器来的数据,更新设备的固件,也就是说上位机端(需用户自己编写)可以通过wifi转串口
m0_69262822的博客
04-07 4244
STM32 IAP固件升级程序源代码。 STM32通过串口,接 收上位机、APP、或者服务器来的数据,更新设备的固件,也就是说上位机端(需用户自己编写)可以通过wifi转串口,网口转串口,GPRS转串口模块等,给这个STM32设备端发送设备要升级固件程序(BIN文件)。 这是一个设备端(客户端)固件程序。 串口采用环形队列接收模式,超强处理。 :86100626557937528dgkghkgj ...
STM32 IAP应用开发——通过串口/RS485实现固件升级(方式1)
ShenZhen_zixian的博客
03-08 8702
IAP(In-Application Programming) 指MCU可以在系统中获取新代码并对自己重新编程,即可用程序来改变程序。在应用编程(IAP)是用户的应用代码对片内Flash存储器进行擦除/编程的方法。这种方式的典型应用就是用一小段代码来实现程序的下载,实际上单片机的ISP功能就是通过IAP技术来实现的,即片子在出厂前就已经有一段小的boot程序在里面,片子上电后,开始运行这段程序,当检测到上位机有下载要求时,便和上位机通信,然后下载数据到数据存储区,从而实现固件升级
如何使用串口更新固件V1.0
11-30
本文介绍【串口升级固件串口屏_如何使用串口更新固件V1.0
SILICON LABS(芯科)C8051F KEIL软件驱动
04-06
在使用KEIL软件开发C8051F系列单片机时,可能需要通过USB接口与目标板进行通信,例如下载固件或者进行串口调试。CP2102是一种常用的USB到UART桥接芯片,用于将PC的USB接口转换为标准的串行通信接口,以便与单片机...
SILICON LABS(芯科)单片机在电脑DOS下面刷flash/firmware.bin文件的efm8load.exe程序
03-29
SILICON LABS(芯科实验室)是一家知名的半导体公司,其产品线中包含了广泛的微控制器,其中EFM8系列是其专为各种嵌入式应用设计的8位单片机。在开发和调试过程中,经常需要对这些单片机进行固件更新,这通常涉及到...
Silicon Labs通过Wonder Gecko MCU开发套件加速DSP智能传感器系统设计.pdf
09-14
在设计智能系统时,设计师需考虑系统的性能、功耗、成本、稳定性和用户体验等多方面因素,通过硬件选择、软件算法优化、接口设计以及系统集成等手段,构建出满足特定需求的智能系统解决方案。 针对该文档中提到的...
元器件应用中的Silicon Labs扩大其领先业界的小型微控制器产品线
12-01
Silicon Labs是一家知名的半导体公司,专注于提供高性能的混合信号解决方案。在元器件应用领域,他们近期发布了C8051F33x系列微控制器,进一步增强了其在小型微控制器市场的领先地位。这一新系列包括C8051F332、C...
STM32通过串口升级程序
10-05
通过串口升级STM32应用程序,内含PC工具软件及代码的原理介绍
最新USB转串口驱动:Silicon Labs CP210x USB to UART Bridge
03-07
USB转串口驱动 Silicon Labs CP210x USB to UART Bridge VERSION:6.7.2.200 DATE:2015/11/20
STM32 IAP固件升级程序源代码。STM32通过串口,接 收上位机、APP、或者服务器来的数据
gZzqqAXFn的博客
11-21 349
在具体实现中,串口通信和固件升级是关键环节,需要根据不同应用场景选择合适的串口通信方式,并编写相应的固件升级程序,以实现固件的高效、稳定和安全升级。STM32通过串口,接 收上位机、APP、或者服务器来的数据,更新设备的固件,也就是说上位机端(需用户自己编写)可以通过wifi转串口,网口转串口,GPRS转串口模块等,给这个STM32设备端发送设备要升级固件程序(BIN文件)。在校验过程中,用户需使用CRC算法,计算固件的校验值,并与固件包中的校验值进行比对,以确保固件的完整性和正确性。
升级固件生成器_Silicon Labs升级无线MCU——新的EFR32系列2芯片提高了性能和物联网安全性...
weixin_39550379的博客
12-17 324
翻译自Linley Group的高级分析师兼《微处理器报告》的高级编辑Tom R. Halfhill,原文链接https://www.silabs.com/documents/public/white-papers/the-linley-group-microprocessor-report-silicon-labs-upgrades-wireless-mcus.pdf Ha...
为STM32写bootloader 使用串口,实现程序IAP升级
xing_huo95的博客
08-04 5429
欢迎转载,请注明出处! ©MrWang_tju 2019.8.1 BootLoader是在操作系统内核运行之前运行的,主要功能是初始化硬件设备、建立内存空间映射图,从而将系统的软硬件环境带到一个合适状态,以便为最终调用操作系统内核准备好正确的环境。BIOS是windows的bootloader,u-boot等为常见的Linux开发版的bootloader。ARM内核芯片下载程序方式可分为三类;...
思科交换机升级步骤
qq_64795994的博客
01-16 2630
升级思科交换机的基本步骤
Bootload远程升级(转)
xuhao0258的博客
09-22 1382
《前言》   自己曾经的一个车上can总线的项目,因为是项目前期,客户也只是要几个demo件,于是我为了速战速决,做了个不带bootload的样件,没想到的是,客户要了300多的样件,当时发完货,我就知道完了,果不其然,几个月后,出现了一些需求的对接错误及更改,别人主机bootload在线就可以升级,我的没做bootload,于是我被派出去烧程序了!好在那次的工程车没有发往全国各种,不然真的全国飞去烧程序了!   在实际项目开发中,因功能更改或bug修正等原因,需要重新编程是很常见的。但是使用外部编程器又比
写文章

热门文章

  • 无线信号的调制方式 OOK、ASK、FSK、GFSK 58741
  • BLE蓝牙的连接和配对过程 45451
  • Cortex-M0和Cortex-M0+简介 27025
  • 加速度计和陀螺仪区别 14136
  • Silicon EFR32BG22低功耗蓝牙开发入门篇 12221

分类专栏

  • 工具 4篇
  • 语言 8篇
  • silicon 9篇
  • wifi 3篇
  • freeRTOS
  • Nordic 17篇
  • BLE 18篇
  • Cortex-M 4篇
  • java 1篇
  • mesh
  • Windows编程 2篇
  • 嵌入式 13篇
  • Android 5篇

最新评论

  • Protocol Buffer在MCU上的实现--C语言

    我写的程序没BUG: 去官网下载压缩包,博主提供的这个链接不太适用

  • 三 蓝牙低功耗(BLE)协议栈 之 HCI层

    helloworld128: LE_Scan_Window 这里小于翻译成了大于,搞得难理解。。。

  • BLE的传输速率

    汤米爱学习: Mark一下

  • BLE蓝牙的连接和配对过程

    汤米爱学习: Mark一下,学习

  • keil生成的map文件全面分析

    明天的云: 全局数组 int array[10] = {0}; 被初始化了, 应该是存在data段啊, 你的图里面也是显示 Data段啊

最新文章

  • Source Insight提示has line endings that are not consistent.Do you want to normalize it
  • C语言实现一个先进先出的队列
  • VMware能识别usb设备,但无法连接(灰色)的问题解决办法
2023年3篇
2022年13篇
2021年17篇
2020年36篇
2019年8篇
2017年1篇
2016年1篇
2015年3篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

玻璃钢生产厂家亳州步行街玻璃钢雕塑深圳玻璃钢鹿雕塑厂家南京商场新年美陈河南商业商场美陈费用广场标识玻璃钢仿铜雕塑加工陕西玻璃钢仿铜雕塑小品攀枝花玻璃钢雕塑定制黄山玻璃钢雕塑厂家哪家好广东户外玻璃钢雕塑供应商玻璃钢雕塑订做 昆明商场休闲区美陈安徽酒店艺术玻璃钢雕塑大量销售玻璃钢雕塑怎么翻出空心雕塑周口哪里有玻璃钢雕塑厂家清远玻璃钢仿铜人物雕塑造型厂家云南玻璃钢雕塑安装南通商场圣诞美陈杭州常见玻璃钢雕塑摆件各种玻璃钢雕塑图片武威玻璃钢花盆湛江玻璃钢彩绘骆驼雕塑陆川玻璃钢泡沫雕塑厂家玻璃钢雕塑公司一平方玻璃钢雕塑重多少动漫玻璃钢雕塑安装珠海玻璃钢人物雕塑哪家便宜金华玻璃钢海豚雕塑厂家邯郸玻璃钢彩绘雕塑生产湖南玻璃钢西瓜雕塑上海玻璃钢广场雕塑定制香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化