如何将普通应用更改为 OTA APP

1. 引言

客户在基于 BlueNRG-LP 设计产品时,code base 用的是 SDK 中某些不带 OTA 升级功能的参考示例,当客户完成其基本设计功能后,想要添加 OTA 的软件升级功能。在这个过程中往往会碰到一些问题。基于上述考虑,本文尝试阐述在 BlueNRG-LP_LPS DK 1.2.0 中默认参考示例“BLE_Security”添加 OTA 功能的过程,及其中需要注意的相关细节。

IDE 工具使用的是 KEIL。

2. BlueNRG-LP 方案中 OTA 软件升级功能简介。

BlueNRG-LP 方案中提供了 2 种 OTA 的软件框架,分别是 OTA Reset Manager 框架和OTA Service Manager 框架。不同框架下程序在 Flash 的分别位置和区域图 1 所示。

图1. OTA 软件升级框架
图1. OTA 软件升级框架

图 1 中中间部分代表 OTA Reset Manager 框架,由三段程序构成,分别是:

  • Reset Manager,负责程序的跳转,根据有效标志选择执行 Higher APP 还是 LowerAPP。
  • Higher APP 和 Lower APP 是客户不同版本的应用程序,同一时间运行其后一个升级的版本。Higher APP 和 Lower APP 都集成的 OTA 升级相关的 Service 和Characteristic,与支持 OTA 功能的主机端或手机 APP 进行交互,进行软件升级。也就是通过 Lower APP 可以将 Higher App 升级到芯片中并在后续芯片重启后一直运行的有效用户程序为 Higher APP, 反之,可通过 Higher App 来升级 LowerAPP。

图 1 中右边部分代表 OTA Service Manager 框架,由两段程序构成,分别是

  • OTA Service Manager:支持 OTA 功能,用来升级用户应用程序 User APP
  • User APP : 正常的 BLE 应用程序,不带 OTA 升级功能。
    NVM(4K) 区域是 Flash 给协议栈保留的存储区域,客户程序不能用。

2.1. OTA Reset Manager 和 OTA Service Manager 两种框架的优缺点

下图 2 中阐述了 OTA Reset Manager 和 OTA Service Manager 两种框架下的软件升级流程。

图2. OTA 软件升级流程
在这里插入图片描述

2.1.1. OTA Reset manager

优点:在升级新版本软件时,芯片中同时保存着老版本的软件,即使程序升级失败,模块还能正常工作。
缺点:相比于 Service Manager 方式应用程序的可用 Flash 空间较小。

2.1.2. OTA Service Manager

优点:程序空间相比于 Reset Manager 方式较大。
缺点:软件升级失败后,模块无法正常运行。

2.1.3. 如何选择合适的 OTA 升级方式?

根据客户程序的大小,优先使用 OTA Reset manager 框架的 Higher/Lower App 方式。

3. 软件更改前的准备

建议客户在实施软件更改前仔细阅读文档 AN5463 - The BlueNRG-LP (over-the-air) Firmware upgrade, 里面有关于 OTA 功能相关的详细介绍和不同 OTA 框架下软件更改的必要步骤。

4. 软件更改步骤

本例软件更改基于 SDK 中 BLE_Security 示例代码,在 Buliding Target “Slave_PassKey_Random”中添加 Higher/Lower APP OTA 功能。

4.1. 配置项目,添加相关宏定义:

  • a. 如要生成 Lower APP :
    -i. 添加预处理宏:CONFIG_OTA_LOWER 和CONFIG_SW_OTA_DATA_LENGTH_EXT.
    -ii. 在 Link 标签页中添加链接宏定义 : --predefine="-DCONFIG_OTA_LOWER=1 "
  • b. 如要生成 Higher APP :
    -i. 添加预处理宏:CONFIG_OTA_HIGHER 和CONFIG_SW_OTA_DATA_LENGTH_EXT.
    -ii. 在 Link 标签页中添加链接宏定义 : --predefine="-DCONFIG_OTA_HIGHER=1 "

图 3.项目配置窗口

在这里插入图片描述

4.2. 在项目中添加 OTA 代码文件

  • a. 添加模块 Middleware/OTA, 并在模块中添加 OTA_btl.c。
  • b. 在下图中“Include Paths”包含 OTA_btl.h 所在的路径。
  • c. OTA_btl.c/h 文件在 SDK 中目录
    “Middlewares\ST\BLE_Application\OTA\src”和
    “Middlewares\ST\BLE_Application\OTA\inc”下。

图 4. 添加 OTA 代码文件
在这里插入图片描述

4.3. 代码更改步骤:

  • a. 代码文件 P_main.c 中添加 :
    -i. 包含头文件 OTA_btl.h
    -ii. 在主循环中添加 OTA 的处理函数。
  • b. 代码文件 BLE_Security_Peripheral.c 中添加:
    -i. 包含头文件 OTA_btl.h,同上
    -ii. 修改函数 DeviceInit 函数,添加 OTA 相关的 service 和 characteristic。
    -iii. 修改 Make_Connection 函数中,增加主设备扫描时发送 scan response 返回 OTA 相关 UUID 功能。
    -iv. 修改 hci_disconnection_complete_event 函数,添加 BLE 断开连接后关闭OTA 跳转标志相关函数。
    -v. 在函数 aci_gatt_srv_attribute_modified_event 和aci_gatt_srv_read_event 中添加 OTA 功能相关数据交互函数。
    -vi. 在代码文件末尾添加事件回调函数:
    1. aci_hal_end_of_radio_activity_event
    2. aci_att_exchange_mtu_resp_event
    3. hci_le_data_length_change_event
    4. aci_gatt_srv_write_event
  • c. 为了加快 OTA 升级速度,必须支持数据长度扩展功能。
    -i. 由于原始项目中协议栈配置选项使用了“BLE_STACK_CUSTOM_CONFIG”
    -ii. 需要在协议栈配置头文件 custom_ble_stack_conf.h 使能编译开关CONTROLLER_DATA_LENGTH_EXTENSION_ENABLED
  • d. 增加 OTA 功能,就必须要在 GATT Database 中添加 OTA 相关的 Service、characteristic,但由于原始项目的配置头文件
    “BLE_Security_Peripheral_config.h”并未分配足够的 RAM 空间,会导致编译时出错。需要在配置头文件中做相应更改。

【注】:上述更改说明简单列举的更改的文件、函数及更改的原因内容,具体代码请参考附件代码压缩包。用户可比较 SDK1.2.0 中的原始代码和附件代码压缩包以找到对应更改的位置和响应代码。

5. 软件更改验证

  1. 1)验证 Lower APP:
    使用 FLASH UTILITY 工具,分别烧录程序:BlueNRG-LP_LPS DK
    1.2.0\Firmware\BLE_Examples\BLE_OTA_ResetManager\STEVAL-IDB011V1
    BLE_OTA_ResetManager.hex 和生成的 Lower APP.
    PC 端通过串口工具获取程序运行时的打印信息判断程序是否正常运行?
  2. 2)验证 OTA 功能:
    使用另一块 ST 评估板 STEVAL_IDB011V1,烧录 DTM 程序,通过 BlueNRG-GUI 工具来完成 Higher APP 的升级,从而验证 Lower APP 的 OTA 功能是否正常?
  3. 3)验证 Higher APP :
    如第(2)步验证通过,则说明 Higher APP 升级成功,此时通过 PC 端串口工具获取程序运行时的打印信息判断程序是否正常运行?
  4. (4) 可重复第(2)步过程,完成 Lower APP 的升级,验证 Higher APP 的 OTA 功能是否正常?

6. 小结

本文档说明了 BlueNRG-LP 设计方案中在不带 OTA 功能的应用程序中添加 OTA 功能所需要做的相关步骤,这些更改逻辑同样适用于 BlueNRG 系列中的其他芯片,如BlueNRG-1/2/LPS 以及后续的 LPF 芯片。唯一需要注意的是协议栈 API 的命令规则随着不同版本 SDK 的升级可能存在的变化。

参考文献

在这里插入图片描述

文档中所用到的工具及版本

BlueNRG GUI 4.3.0
RF-Flasher Utility 4.3.0

LAT 中的附件

BLE_Security_ADD_OTA_20230217.7z


本文档参考ST官方的《【应用笔记】LAT1280+如何将普通应用更改为OTA+APP》文档。
参考下载地址:https://download.csdn.net/download/u014319604/89087488

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《Java面试自救指南》(专题二)计算机网络

文章目录 力推的计网神课get请求和post请求的区别在浏览器网址输入一个url后直到浏览器显示页面的过程常用状态码session 和 cookie的区别TCP的三次握手和四次挥手七层OSI模型(TCP/IP协议模型)各种io模型的知识http协议和tcp协议的区别https和http的区别…

SpringBoot配置文件加载的优先级顺序

SpringBoot配置文件加载的优先级顺序 1.按文件类型2.按路径比较3.按命令行参数设置 1.按文件类型 SpringBoot的配置文件可以分为.properties .yml .yaml 在同一路径下(比如都在classpath下)三者的优先级顺序是.properties> .yml> .yaml 2.按路径…

【Vscode】无法将“python,pip,node,npm等”识别为cmdlet...问题

问题出现场景 新换个电脑,然后重新安装了软件,又复现一次又一次“老生常谈”的问题。 解决方法 网络答案吧五花八门,我采取一个我的场景解决可行的方案, 首先我的场景是,环境变量,配置路径都是没有问题…

idea开发 java web 配电室后台管理系统bootstrap框架web结构java编程计算机网页

一、源码特点 java 配电室后台管理系统是一套完善的完整信息系统,结合java web开发和bootstrap UI框架完成本系统 ,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主 要采用B/S模式开发。 前段主要技术 cs…

leetcode刷题-代码训练营-第7章-回溯算法1

回溯法模板 void backtracking(参数) {if (终止条件) {存放结果;return;}for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {处理节点;backtracking(路径,选择列表); // 递归回溯,撤销处理结果} }理解 从…

MybatisPlus总结

一、MyBatis回顾 (1)什么是MyBatis:MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映…

adobe stock会员开通付费付款订阅充值教程/adobe stock免费白嫖一个月

登录adobe stock的官网,点击你想要下载的视频,然后点击免费下载,我们点击免费试用按钮,可以看到非常贵,需要80美金一个月,用fomepay可以免费白嫖一个月 点击获取一张虚拟信用卡,就可以白嫖一个…

Android 代码自定义drawble文件实现View圆角背景

简介 相信大多数Android开发都会遇到一个场景,给TextView或Button添加背景颜色,修改圆角,描边等需求。一看到这样的实现效果,自然就是创建drawble文件,设置相关属性shap,color,radius等。然后将…

python 笔记

文章目录 pdbpdb开始调试pythonpdb设置断点单步执行进入到函数的内部执行到下一个断点或程序结束调用栈查看命令查看当前函数调用堆栈向上一层函数查看调用堆栈查看源代码 importimport 用法 numpy导入numpy模块numpy常用函数np.argmaxnp.sum range生成连续序列生成不连续序列 …

云服务器ECS租用价格表报价——阿里云

阿里云服务器租用价格表2024年最新,云服务器ECS经济型e实例2核2G、3M固定带宽99元一年,轻量应用服务器2核2G3M带宽轻量服务器一年61元,ECS u1服务器2核4G5M固定带宽199元一年,2核4G4M带宽轻量服务器一年165元12个月,2核…

wordpress全站开发指南-面向开发者及深度用户(全中文实操)--php函数

php函数 wordpress会封装一部分函数&#xff0c;比如bloginfo该函数的作用是直接调用你设置的你的网站的名称 示例 This is our amazing custom theme <?php echo 22; function myfirstfunction(){ echo 33; echo "<p>Hello ,this is my first function</…

指针(三)

一.数组名的理解 在前面的文章中&#xff0c;有这样的代码 int arr[10] {1,2,3,4,5,6,7,8,9,10}; int *p &arr[0]; 这里我们使用&arr[0]的方式拿到了数组的第一个元素的地址&#xff0c;但其实数组名就是数组首元素的地址。下面我们进行一个测试。 #include <…

Google视觉机器人超级汇总:从RT、RT-2到AutoRT、SARA-RT、RT-Trajectory

前言 随着对视觉语言机器人研究的深入&#xff0c;发现Google的工作很值得深挖&#xff0c;比如RT-2 ​想到很多工作都是站在Google的肩上做产品和应用&#xff0c;​Google真是科技进步的核心推动力&#xff0c;做了大量大模型的基础设施&#xff0c;服 故有了本文&#xf…

rust 面向对象编程特性、模式与模式匹配、高级特征

面向对象编程OOP 学习了结构体、枚举&#xff0c;它们可以包含自定义数据字段&#xff0c;也可以定义内部方法&#xff0c;它们提供了与对象相同的功能。 面向对象的四大特征&#xff1a;封装、继承、多态 通过pub标记为公有的结构体&#xff0c;在其他模块中可以访问使用这…

DFS深度优先搜索

DFS深度优先搜索 文章目录 DFS深度优先搜索1. 算法思想2. 步骤理解3. 例题3.1 **二叉树的最大深度**3.2 **将升序数组转化为平衡二叉搜索树**3.3 **判断是不是平衡二叉树**3.4 **二叉树的后序遍历**3.5 **二叉树的直径** 1. 算法思想 一直往深处走&#xff0c;无路可走&#x…

自动驾驶涉及相关的技术

当科幻走进现实&#xff0c;当影视照进生活&#xff0c;无数次憧憬的自动驾驶&#xff0c;正在慢慢的梦想成真。小时候天马星空的想象&#xff0c;现在正悄无声息的改变着我们的生活。随着汽车电动化进程的加快&#xff0c;自动驾驶技术映入眼帘&#xff0c;很多人可能感觉遥不…

学习 Git 基础知识 - 日常开发任务手册

欢迎来到我关于 Git 的综合指南&#xff0c;Git 是一种分布式版本控制系统&#xff0c;已经在软件开发中彻底改变了协作和代码管理方式。 无论你是经验丰富的开发者还是刚开始编程之旅的新手&#xff0c;理解 Git 对于正确掌控代码、高效管理项目和与他人合作至关重要。 在本…

深入浅出 -- 系统架构之微服务架构常见的六种设计模式

面向服务的架构&#xff08;SOA&#xff09; 面向服务的架构&#xff08;SOA&#xff09;是一种设计方法&#xff0c;也是一个组件模型&#xff0c;它将应用程序的不同功能单元&#xff08;称为服务&#xff09;通过这些服务之间定义良好的接口和契约联系起来。接口是采用中立的…

echarts 地图 自己圈地图 乡镇街道

这个是方式是我实在不愿意做的&#xff01; 如果有现成的最好&#xff0c;没有办法的情况下再用这个东西。 今天公司有一个项目&#xff0c;地方划分了一块区域&#xff0c;但是国家没有审核&#xff0c;但是项目里面用到了一个地图展示数据&#xff01;然后就需要我们自己把…

langchain 学习笔记-FunctionCalling三种方式

ChatGPT 基于海量的训练数据生成答案&#xff0c;所以它无法回答训练数据中没有的信息或搜索信息 。人们希望 ChatGPT 具有对话以外的各种功能&#xff0c;例如“我想管理我的待办事项列表”。 函数调用是对此类请求的响应。 通过使用函数调用&#xff0c;ChatGPT 现在可以在生…