增加BDW01-STM32L496VG开发板

This commit is contained in:
sunlikun
2020-11-18 18:05:05 +08:00
parent 65e5b9fe84
commit abcf43d131
199 changed files with 50338 additions and 0 deletions

View File

@@ -0,0 +1,120 @@
# 开发板BDW01入门介绍
---
## 1. 开发板特性
BDW01物联网开发板的板载资源如下
![](./image/board.png)
主控芯片采用STM32L4VGTxFlash空间大小1MBSRAM空间大小320KB
- 板载中移物联NB-IOT模组M5313
- 板载中科微北斗定位模组ATGM336H
- 板载环境光检测传感器TMD27713;
- 板载压力传感器BMP280;
- 板载温湿度传感器SHT3X;
- 板载3D加速度陀螺仪传感器LSM6DSL;
- 板载磁力计传感器MMC3680KJ;
- 板载E43接口可扩展其他无线通信模块
- 板载E32接口可扩展其他定位模块
- 板载E53传感器标准接口方便连接各种E53传感器
- 板载0.91'OLED显示屏幕
- 板载新塘语离线音识别模块ISD9160
- 板载TF卡卡座方便扩展存储空间
- 板载MINI PCIE接口方便连接4G通信模块
- 板载18650锂电池插座方便移动时正常供电
- 板载CH340转串口连接可以使用一根USB线连接至电脑查看串口日志
关于开发板硬件电路的更多信息和详解请查看文档BDW01主板规格书和文档物联网开发板原理图。
## 2. 开发板硬件准备
### 2.1 连接LOG USB线
![](./image/logusb.png)
### 2.2 连接ST-Link烧录器
对照烧录器引脚图和开发板原理图找到开发板上的网络标号SW11,连接如下:
**注意电源正负极不要接反接错避免烧掉MCU和烧录器。**
![](./image/st-link.png)
- 开发板VCC(3v3) ---> STlink  3.3V
- 开发板ST_SWDIO ---> STlink  SWDIO
- 开发板ST_SWCLK ---> STlink  SWCLK
- 开发板GND ---> STlink  GND
## 3. 开发软件的环境准备
### 3.1 软件开发工具的下载安装
我们使用的软件开发工具是Keil公司的MDK(Microcontroller Development kit)MDK官网下载地址[http://www2.keil.com/mdk5](http://www2.keil.com/mdk5)
下载的版本最好在5.24或5.24以上本次介绍以5.25版本为例双击MDK524应用程序文件接着点击next>>。
![](./image/mtkdl01.png)
在I agree前面的小方框打勾表示同意该安装协议再点击next>>。
![](./image/mtkdl02.png)
选择安装路径默认情况下会安装在系统盘C盘建议在其他盘建立单独的文件夹并选择安装到该文件夹下。点击next>>。
![](./image/mtkdl03.png)
填上我们的信息后继续next>>。
![](./image/mtkdl04.png)
然后等待安装完成后点击Finish,接着会跳出器件支持包安装界面点OK再把弹框都叉掉后续再介绍。最后要激活MDK导入License,激活MDK后就可以使用了。
![](./image/mtkdl05.png)
特别提示一定要输入License激活MDK软件建议购买正版License。
### 3.2 安装器件支持包
MDK V4版本安装包里集成了器件的支持包而MDK V5版本是独立出来的可以自己下载安装。安装完开发工具MDK V5后我们需要安装开发板主芯片型号对应的芯片器件支持包。
#### 3.2.1 安装方式一
登录官网:[http://www.keil.com/dd2/pack/](http://www.keil.com/dd2/pack/)
下载Keil.STM32L4xx_DFP.x.x.x.pack 完成后,双击打开安装。
#### 3.2.2 安装方式二
MDK软件上在线安装一般下载速度会比较慢更新时间很长不推荐。
打开软件在导航栏打开Pack安装界面弹出包安装提示点击ok选项。
![](./image/mtkins01.png)
进入在线安装界面选择STM32L4XX Pack,点击Install进行安装。
![](./image/mtkins02.png)
### 3.3 CH340串口驱动安装
BDW01开发板板载USB转串口芯片所以使用USB线将开发板连接到电脑就在串口调试助手查看串口输出的LOG信息。使用串口调试助手之前需要下载安装CH340转串口芯片的驱动。直接在网上搜索下载CH340转串口芯片的驱动下载完成后打开驱动安装程序点击安装即可。
![](./image/ch340ins01.png)
### 3.4 串口调试助手的安装与使用
工具下载网址:[http://www.daxia.com/download/sscom.rar](http://www.daxia.com/download/sscom.rar)
下载完成后,解压,双击打开串口调试助手执行程序,直接使用。
![](./image/ch340ins02.png)
使用USB线一端接开发板LOG USB串口另一端连接到电脑前面安装完CH340转串口芯片的驱动打开电脑的设备管理器就可以在端口列表查看PC与开发板之间连接端口号然后在串口调试助手-端口号处选择PC和开发板之间的连接端口(我这里显示的是COM15所以要在串口调试助手中选择COM15)。
![](./image/ch340ins03.png)
再根据开发板串口波特率设置串口调试助手-波特率开发板程序波特率设置为115200所以在串口调试助手中选择115200波特率。最后打开串口就可以使用了。
### 3.5 ST-Link驱动的下载与安装
前面2.2介绍过开发板与ST-Link烧录器的接线方式在使用烧录器将程序烧录到开发板之前需要安装烧录器的驱动。
在ST官网下载ST-Link驱动STSW-LINK009下载网址
[https://www.st.com/content/st_com/zh/products/development-tools/software-development-tools/stm32-software-development-tools/stm32-utilities/stsw-link009.html](https://www.st.com/content/st_com/zh/products/development-tools/software-development-tools/stm32-software-development-tools/stm32-utilities/stsw-link009.html)
再根据电脑系统安装驱动32位电脑系统安装dpinst_x86.exe64位电脑系统安装dpinst_amd64.exe 。 
![](./image/st-link-dl01.png)
运行对应的驱动执行程序开始安装ST-Link V2驱动最后点击完成。
![](./image/st-link-dl02.png)
安装完成后, 将开发板电源打开将连着开发板的烧录器通过USB接口连至电脑。
打开电脑上的设备管理器。若可以看到通用串行总线设备-STM32 STLink,表示驱动安装成功,如下图所示。
![](./image/st-link-dl03.png)
## 4. 开发与调试
前面的软硬件工作准备好之后接下来就可以进行开发与调试了。示例工程hello_world的主要功能是创建两个任务两个任务循环输出打印 。
路径TencentOS-tiny\board\BDW01-STM32L496VG\KEIL\hello_world。
打开示例工程hello_world进入到MDK keil5主窗口界面
![](./image/helloword00.png)
点击 Build Target 编译工程目标:
![](./image/helloword01.png)
编译完成后查看消息窗口0 Error(s),表示代码没有语法错误。
![](./image/helloword02.png)
LOG USB线和烧录器ST-Link/v2都连接到电脑串口调试助手也配置好并打开。
点击 Download 下载程序到开发板。
下载完成后,在开发板上按下复位按钮,查看串口调试助手上接收数据的显示。
![](./image/helloword03.png)

View File

@@ -0,0 +1,32 @@
# TCP Socket 通讯测试
---
本示例会启动两个线程建立两个TCP链接分别发送数据
M5313可同时支持4个链接不过在代码默认定义的是3个有需要可以修改为4个或根据自己需要进行修改。
路径TencentOS-tiny\net\at\include\tos_at.h
![](./image/tcpsocket01.png)
## 1. 搭建TCP服务器
M5313 使用2G网络本地PC使用的是局域网这里做了一个服务器的内网穿透然后百度ip查看服务器的外网IP。
这里使用SocketTool建立TCP server。
## 2. 运行工程
使用 Keil-MDK 打开 tcp_through_module工程
路径TencentOS-tiny\board\BDW01-STM32L496VG\KEIL\tcp_through_module
![](./image/tcpsocket02.png)
打开2g模块M5313的串口接收
![](./image/tcpsocket03.png)
打开tcp_through_module.c文件根据自己的TCP服务器地址修改配置:
![](./image/tcpsocket04.png)
修改完成后点击编译按钮编译编译成功之后烧录到开发板默认使用ST-Link下载器
烧录之后按下开发板上的复位按钮,程序开始运行,在串口助手查看日志:
![](./image/tcpsocket05.png)
在TCP服务器上可查看收到的数据
![](./image/tcpsocket06.png)
![](./image/tcpsocket07.png)

View File

@@ -0,0 +1,328 @@
# 对接腾讯云与腾讯连连-测试
----------
本示例示范如何对接到腾讯云物联网开发平台IoT Explore和腾讯连连小程序
## 1.云端操作步骤
登录[腾讯云物联网开发平台IoT Explorer](https://cloud.tencent.com/product/iotexplorer "腾讯云物联网开发平台IoT Explorer"),点击“立即使用”进入控制台,个人开发可以使用微信进行登录。
### 1.1 新建项目
项目是为了用户面对不同的产品迭代或不同的项目角色而设计的一种隔离机制,便于用户清晰管理物联网项目,并能灵活地配置项目权限。
1. 项目下可以建立多个产品与应用,应用默认有权限访问该项目下的所有产品;
2. 每个项目会有自己的唯一 ID数据会根据项目进行隔离以确保数据安全
3. 项目删除后,该项目所属产品等数据都将被删除且不能恢复;
4. 开发平台提供资源级的权限控制,可为不同的子用户分配项目级、产品级的权限控制;
点击新建项目,填写项目名称和简介:
![](./image/iot01.png)
### 1.2. 产品开发
#### 1.2.1 新建产品
点击项目名称进入到该项目中,点击新建产品:
![](./image/iot02.png)
填写产品的一些信息:
1. 产品名称名称为中文、字母、数字、下划线的组合1 - 20位且不能为空。
2. 产品品类:选择您所创建产品的所属品类,不同类型产品的属性、事件等数据模板会有所不同。详情请参见 数据模板。
3. 设备类型设备使用2G/3G/4G/Wi-Fi无线通信或有线通信方式网关可提供云端通信能力帮助设备与平台通信。
4. 认证方式:物联网开发平台提供两种认证方式用于设备与平台之间鉴权认证。
证书认证:在创建设备时,平台将为设备生成一个证书文件和一个私钥文件,实现设备与云之间的双向认证。
密钥认证:在创建设备时,使用平台为设备随机生成的 PSK。
5. 通信方式:您可以选择 Wi-Fi、移动蜂窝2G/3G/4G和其他通信方式。
6. 数据协议:默认采用数据模板的数据协议,您也可以自定义协议进行透传。
7. 描述字数不能超过80个您可以根据需要选填。
![](./image/iot03.png)
产品新建成功后,可在产品列表页查看到“智能灯”。
![](./image/iot04.png)
#### 1.2.2 数据模版
数据模板是将物理实体设备进行数字化描述,构建其数字模型。在物联网开发平台定义数据模板即定义产品功能。完成功能定义后,系统将自动生成该产品的数据模板。
点击智能灯产品进入。
##### 1.2.2.1
选择“智能灯”类型后,系统会自动生成标准功能:
![](./image/iot05.png)
#### 1.2.2.2
下方的新建功能,可以增加新的功能,定义如下:
![](./image/iot06.png)
功能类型包含三元素:
1. 属性包括布尔型、整数型、字符型、浮点型、枚举型和时间型等6种基本数据类型
2. 事件包括告警、故障和信息三种类型事件型功能属性可以添加具体的事件参数这些参数可以由属性中6种基本数据类型组成
3. 行为用于实现更复杂的业务逻辑可包含输入参数和输出参数可用于让设备执行某项特定的任务。行为的输入参数和输出参数可添加上述6种属性的基本数据类型。
| 功能元素 | 功能描述 | 功能标识符 |
| -------- | --------- | ----------- |
| 属性 | 用于描述设备的实时状态,支持读取和设置,如模式、亮度、开关等。 | PropertiesId |
| 事件 | 用于描述设备运行时的事件,包括告警、信息和故障等三种事件类型,可添加多个输出参数,如环境传感器检测到空气质量很差,空调异常 | EventId |
| 行为 | 用于描述复杂的业务逻辑,可添加多个调用参数和返回参数,用于让设备执行某项定特定的任务,例如,开锁动作需要知道是哪个用户在什么时间开锁,锁的状态如何等。 | ActionId |
数据类型支持6种
1.布尔型:非真即假的二值型变量。例如,开关功能。
2.整数型:可用于线性调节的整数变量。例如,空调的温度。
3.字符型:以字符串形式表达的功能点,例如,灯的位置。
4.浮点型精度为浮点型的功能点。例如压力值的范围0.0 - 24.0。
5.枚举型:自定义的有限集合值。例如,灯的颜色:白色、红色、黄色等。
6.时间型string 类型的 UTC 时间戳(毫秒)。
#### 1.2.3
数据模板是一个 JSON 格式的文件使用数据模板协议用户的设备需按数据模板定义要求传输设备数据到云端并可使用基于数据模板的诸多业务功能点击查看json可以看到上面创建功能的json格式
![](./image/iot07.png)
```c
{
"version": "1.0",
"properties": [
{
"id": "power_switch",
"name": "电灯开关",
"desc": "控制电灯开灭",
"required": true,
"mode": "rw",
"define": {
"type": "bool",
"mapping": {
"0": "关",
"1": "开"
}
}
},
{
"id": "color",
"name": "颜色",
"desc": "灯光颜色",
"mode": "rw",
"define": {
"type": "enum",
"mapping": {
"0": "Red",
"1": "Green",
"2": "Blue"
}
}
},
{
"id": "brightness",
"name": "亮度",
"desc": "灯光亮度",
"mode": "rw",
"define": {
"type": "int",
"unit": "%",
"step": "1",
"min": "0",
"max": "100",
"start": "1"
}
},
{
"id": "name",
"name": "灯位置名称",
"desc": "灯位置名称:书房、客厅等",
"mode": "rw",
"required": false,
"define": {
"type": "string",
"min": "0",
"max": "64"
}
}
],
"events": [
{
"id": "status_report",
"name": "DeviceStatus",
"desc": "Report the device status",
"type": "info",
"required": false,
"params": [
{
"id": "status",
"name": "running_state",
"desc": "Report current device running state",
"define": {
"type": "bool",
"mapping": {
"0": "normal",
"1": "fault"
}
}
},
{
"id": "message",
"name": "Message",
"desc": "Some extra message",
"define": {
"type": "string",
"min": "0",
"max": "64"
}
}
]
},
{
"id": "low_voltage",
"name": "LowVoltage",
"desc": "Alert for device voltage is low",
"type": "alert",
"required": false,
"params": [
{
"id": "voltage",
"name": "Voltage",
"desc": "Current voltage",
"define": {
"type": "float",
"unit": "V",
"step": "1",
"min": "0.0",
"max": "24.0",
"start": "1"
}
}
]
},
{
"id": "hardware_fault",
"name": "Hardware_fault",
"desc": "Report hardware fault",
"type": "fault",
"required": false,
"params": [
{
"id": "name",
"name": "Name",
"desc": "Name like: memory,tf card, censors ...",
"define": {
"type": "string",
"min": "0",
"max": "64"
}
},
{
"id": "error_code",
"name": "Error_Code",
"desc": "Error code for fault",
"define": {
"type": "int",
"unit": "",
"step": "1",
"min": "0",
"max": "2000",
"start": "1"
}
}
]
}
],
"actions": [],
"profile": {
"ProductId": "S7271EG5D8",
"CategoryId": "3"
}
}
```
### 1.3. 创建测试设备
在【设备调试】页面中,单击【新建设备】,设备名为 bdw01_led
![](./image/iot08.png)
## 2. 设备侧操作
使用 Keil-MDK 打开 mqttclient_iot_explorer 工程:
TencentOS-tiny\board\BDW01-STM32L496VG\KEIL\mqttclient_iot_explorer
![](./image/iot09.png)
### 2.1 配置使用的网络设备
打开mqttclient_iot_explorer.c文件修改配置。
修改本工程所使用的通信模组打开USE_M5313如图
![](./image/iot10.png)
#### 2.1.1 修改MQTT对接参数
在腾讯云物联网开发平台可以看到一些产品ID、设备ID、设备秘钥三个参数如图
![](./image/iot11.png)
接下来进入TencentOS-tiny仓库中的tools目录使用python运行脚本mqtt_config_gen.py按照提示输出刚刚在平台查询到的三个参数脚本会自动生成mqtt配置参数
![](./image/iot12.png)
① 输入产品ID
② 输入设备名称;
③ 输入设备秘钥;
④ ⑤ 保持默认,直接回车;
⑥ 需要的生成信息。
接下来在代码中修改配置信息:
![](./image/iot13.png)
#### 2.1.2 修改mqtt对接topic
设备向云端上报数据的topic如下
上行请求 Topic $thing/up/property/{ProductID}/{DeviceName}
上行响应 Topic $thing/down/property/{ProductID}/{DeviceName}
这两个topic咋玩呢
首先订阅上行响应topic接着向上行请求topic上报数据上报数据时平台不仅规定了topic还规定了数据内容如下
```c
{
"method":"report",
"clientToken":"clientToken-145023f5-bc9b-4174-ba3b-430ba5956e5c",
"params":
{
"brightness":55,
"name":"bedroom",
"power_switch":1,
"color":2
}
}
```
其中每一项的意义如下:
| 参数 | 类型 | 说明 |
| -------- | --------- | ----------- |
| method | String | report 表示设备属性上报 |
| clientToken | String | 用于上下行消息配对标识 |
| timestamp | Integer | 属性上报的时间 |
| params | JSON | JSON 结构内为设备上报的属性值 |
同时因为订阅了上行响应topic所以模组会收到云端下发的响应并通过URC模式上报云端响应报文整理一下格式如下
```c
{
"method":"report_reply",
"clientToken":"clientToken-145023f5-bc9b-4174-ba3b-430ba5956e5c",
"code":0,
"status":"success"}
```
其中每一项也有具体的含义:
| 参数 | 类型 | 说明 |
| -------- | --------- | ----------- |
| method | String | report_reply 表示云端接收设备上报后的响应报文 |
| clientToken | String | 用于上下行消息配对标识 |
| code | Integer | 0表示云端成功收到设备上报的属性 |
| status | String | 当code非0的时候, 提示错误信息 |
接下来修改代码,首先**根据自己的产品ID和设备ID修改上报topic**
![](./image/iot14.png)
然后修改订阅topic
![](./image/iot15.png)
打开2g模块M5313的串口接收
![](./image/iot16.png)
#### 2.1.3 编译下载
修改完成之后编译工程,下载到开发板中,重新上电开始运行,在串口助手中查看打印日志:
![](./image/iot17.png)
在云端查看上报日志:
![](./image/iot18.png)
点击【设备属性】,点击亮度属性一栏的查看,可以查看曲线显示:
![](./image/iot19.png)
## 3. 腾讯连连小程序操作步骤
### 3.1 添加家庭
手机端在【微信】搜索【腾讯连连】小程序,首次使用需要进入后点击【我的】->【家庭管理】,添加一个你喜欢的名称即可。
### 3.2 添加设备
进入后在中下方点击➕号,开始扫描二维码
![](./image/iot20.png)
![](./image/iot21.png)
在腾讯云物联网开发平台进入【设备调试】,点击对应设备后的【二维码】:
![](./image/iot22.png)
腾讯连连扫描此二维码即可成功添加设备,添加成功之后如图:
![](./image/iot23.png)
给设备上电,等一会可以看到设备上线,点击进入可以看到代码上传的亮度数据
![](./image/iotpl.png)

View File

@@ -0,0 +1,159 @@
# 对接腾讯云与腾讯连连-电动车追踪
本示例示范如何对接到腾讯云物联网开发平台IoT Explore和腾讯连连小程序
并上传GPS定位和通过腾讯云与腾讯连连控制开发板上的LED。
## 1. 云端操作步骤
登录[腾讯云物联网开发平台IoT Explorer](https://cloud.tencent.com/product/iotexplorer "腾讯云物联网开发平台IoT Explorer"),点击“立即使用”进入控制台,个人开发可以使用微信进行登录。
### 1.1 新建项目
具体可参考《3.对接腾讯云与腾讯连连-测试》新建项目章节,根据文档已经创建了一个智能终端的项目
![](./image/elec01.png)
### 1.2 产品开发
#### 1.2.1 新建产品
点击项目名称进入到该项目中,点击新建产品:
![](./image/elec02.png)
![](./image/elec03.png)
产品新建成功后,可在产品列表页查看到“电动车追踪”。
![](./image/elec04.png)
#### 1.2.2 新建功能
点击电动车追踪产品进入。
##### 1.2.2.1
参照下图建立两个功能:灯和位置两个功能
![](./image/elec05.png)
##### 1.2.2.2
json格式为
![](./image/elec06.png)
```c
{
"version": "1.0",
"profile": {
"ProductId": "OKY0D78DP2",
"CategoryId": "1"
},
"properties": [
{
"id": "led",
"name": "灯",
"desc": "",
"mode": "rw",
"define": {
"type": "bool",
"mapping": {
"0": "关",
"1": "开"
}
},
"required": false
},
{
"id": "location",
"name": "位置",
"desc": "",
"mode": "r",
"define": {
"type": "string",
"min": "0",
"max": "1024"
},
"required": false
}
],
"events": [],
"actions": []
}
```
### 1.3 创建测试设备
在【设备调试】页面中,单击【新建设备】,设备名为 bd_location
![](./image/elec07.png)
## 2. 设备侧操作
使用 Keil-MDK 打开 mqttclient_iot_explorer_location 工程:
TencentOS-tiny\board\BDW01-STM32L496VG\KEIL\mqttclient_iot_explorer_location
![](./image/elec08.png)
### 2.1 配置使用的网络设备
打开mqttclient_iot_explorer_location.c文件修改配置。
路径为TencentOS-tiny\board\BDW01-STM32L496VG\BSP\app
修改本工程所使用的通信模组打开USE_M5313如图
![](./image/elec09.png)
#### 2.1.1 修改MQTT对接参数
在腾讯云物联网开发平台可以看到一些产品ID、设备ID、设备秘钥三个参数如图
![](./image/elec10.png)
接下来进入TencentOS-tiny仓库中的tools目录使用python运行脚本mqtt_config_gen.py按照提示输出刚刚在平台查询到的三个参数脚本会自动生成mqtt配置参数
![](./image/elec11.png)
① 输入产品ID
② 输入设备名称
③ 输入设备秘钥;
④ ⑤ 保持默认,直接回车;
⑥ 需要的生成信息。
接下来在代码中修改配置信息:
![](./image/elec12.png)
#### 2.1.2 修改mqtt对接topic
设备向云端上报数据的topic如下
上行请求 Topic $thing/up/property/{ProductID}/{DeviceName}
上行响应 Topic $thing/down/property/{ProductID}/{DeviceName}
首先订阅上行响应topic数据内容如下
```c
{
"method":"control",
"clientToken":"clientToken-9d2601f3-c36f-46a5-bdf6-1bd21c547406",
"params":
{
"led":1,
}
}
```
同时因为订阅了上行响应topic所以模组会收到云端下发的响应并通过URC模式上报云端响应报文整理一下格式如下
```c
{
"method":"report_reply",
"clientToken":"clientToken-9d2601f3-c36f-46a5-bdf6-1bd21c547406",
"code":0,
"status":"success"}
```
修改代码,首先**根据自己的产品ID和设备ID修改上报topic**
![](./image/elec13.png)
然后修改订阅topic
![](./image/elec14.png)
打开2g模块M5313的串口接收
![](./image/elec15.png)
#### 2.1.3 编译下载
修改完成之后编译工程,下载到开发板中,重新上电开始运行,在串口助手中查看打印日志:
![](./image/elec16.png)
#### 2.1.4 上报定位
GPS获取到定位时串口会打印GPS定位信息
![](./image/elec17.png)
同时将定位上传到云端,
在云端查看上报日志:
![](./image/elec18.png)
#### 2.1.5 LED控制
在设备调试里打开在线调试选择灯期望值选择打开状态然后点击发送成功控制板子上的LED并返回数据
![](./image/elec19.png)
## 3. 腾讯连连小程序操作步骤
### 3.1 添加家庭
手机端在【微信】搜索【腾讯连连】小程序,首次使用需要进入后点击【我的】->【家庭管理】,添加一个你喜欢的名称即可。
### 3.2 添加设备
进入后在中下方点击➕号,开始扫描二维码
![](./image/elec20.png)
![](./image/elec21.png)
在腾讯云物联网开发平台进入【设备调试】,点击对应设备后的【二维码】:
![](./image/elec22.png)
腾讯连连扫描此二维码即可成功添加设备,添加成功之后如图:
![](./image/elec23.png)
给设备上电等一会可以看到设备上线点进去可进行LED的控制
开发板上的LED会亮。
![](./image/elec24.png)
#### 3.2.1 面板配置
可以采用H5对小程序的显示页面进行编辑
![](./image/elec25.png)
![](./image/elec26.png)
上传文件index.js、index.css(在source文件夹里)
![](./image/elec27.png)
并将腾讯连连小程序里的帐号添加至白名单。
![](./image/elec28.png)
用小程序重新扫描设备二维码,给设备重新上电,当有定位时,效果如下:
![](./image/elec29.png)

View File

@@ -0,0 +1,229 @@
# OTA-HTTP方式
## 1. TencentOS-tiny OTA
### 1.1 OTA与IAP
IAP全称 In Application Programming什么是在应用编程呢
正常开发流程如下:
1. 使用Keil MDK工具编写应用程序
2. 编译出.axf可执行程序或者.bin文件或者.hex文件
3. 使用Keil MDK工具直接烧录.axf文件到STM32 Flash中或者使用类似STM32CubeProg之类的软件烧录.bin文件到STM32 Flash中
4. 复位单片机从Flash起始地址处读取程序并执行
当产品开发完成用于生产后通常不会再引出下载器接口给用户所以也就无法连接各种各样的下载器更别说用Keil或者STM32CubeProg这些工具下载程序如果发现应用程序有漏洞或者要修改部分功能都已经无法完成。
#### 1.1.1 IAP设计思想
IAP巧妙的解决了这个问题即在应用程序正常工作的时候还可以接收新的固件并烧录到Flash中。
- 应用程序如何接收新的固件?
一般产品设计时都会留一个用于打印日志信息的串口可以直接利用此串口来接收PC发送到新固件传输协议大多都采用Y-Modem协议。
- 接收之后的新固件存放到哪里?
固件大小一般都有几十KB或者上百KB应用程序接收到新的固件之后如果是以数组的形式暂存在RAM空间中不仅会浪费RAM空间而且容易发生固件数据丢失所以直接存储到空闲的Flash空间中是最好的方式。
eg. 官方开发板使用的芯片是STM32L496VGTxFlash空间有1024KB如果应用程序的大小只有100KB那么接收进来的新固件就可以存放在剩余的156KB空间中。
同时会人为的对Flash划分分区也就是对某一段地址空间起个名字如下图
![](./image/ota-http01.png)
- 如何将老固件替换为为新固件?
上电之后CPU会从Flash的起始地址处读取数据开始执行这点无法改变正在运行的应用程序如果进行自己擦除自己的操作设备直接变砖。
bootloader可以完美的解决这一问题即写一小段应用程序放在Flash的起始位置处使得每次上电之后最先运行bootloader完成两个功能
① 检查升级标志是否有新的固件被下载到IAP分区中
② 如果无升级标志则跳转到ActiveAPP分区开始执行应用程序
③ 如果有升级标志则先将IAP分区中的固件拷贝到ActiveAPP分区中然后跳转到ActiveAPP分区开始执行新的应用程序
加入bootloader之后整个Flash的分区情况如下
![](./image/ota-http02.png)
#### 1.1.2 OTA设计思想
在IAP的这种设计思想之上因为当前的物联网设备都已经具备基本的网络通信功能所以无需通过串口传输新的固件直接通过网络传输新的固件即可称之为OTA IAP(Over The Air In Application Programming)也就是平常所说的空中升级简称OTA。
### 1.2 OTA组件概述、特性及优势
TencentOS-tiny中提供的OTA组件完全开源免费相较于其他的OTA功能TencentOS-tiny OTA组件提供更小的差分升级包耗用更少的传输流量占用更小的内存空间提供更可靠的升级服务。
TencentOS-tiny OTA组件有以下的特性
传输差分升级包,而不是整个固件
灵活的分区表功能
支持原地升级
支持乒乓升级,可以在升级中断的情况下进行版本回滚
支持通过HTTP从自建服务器拉取固件
支持从腾讯云平台进行统一的固件拉取和管理
### 1.3 OTA组件开发调试推荐流程
OTA的整个流程调试较复杂如果分步来做会比较容易
(1)调试bootloader是否可以正常读取分区表信息
(2)调试bootloader是否可以正常跳转到Active APP;
(3)调试bootloader是否直接可以根据patch包进行升级;
(4)调试Active APP是否可以通过网络拉取patch升级包并下载到 OTA 分区;
(5)综合调试。
## 2. 分区规划及分区表的生成、烧录
### 2.1 分区规划
TencentOS-tiny支持两种升级方式两种升级方式对应有不同的分区表
原地升级方式中bootloader直接根据旧固件+patch升级包生成新的固件一旦开始升级无论升级成功与否都无法回滚到上一个版本主要有五个分区
Bootloader分区执行引导、分区升级功能
Active APP分区当前正在运行的固件存放分区
OTA分区新固件存放分区
KV分区记录系统升级中的一些环境变量
分区表存放分区表固定大小32B一般放在Flash的最后一个扇区中
乒乓升级方式中bootloader在升级之前会将原来的固件拷贝一份一旦开始升级无论新固件升级成功与否都可以回滚到上一个版本主要有六个分区
Bootloader分区执行引导、分区升级功能
Active APP分区当前正在运行的固件存放分区
Backup分区备份当前正在运行的固件
OTA分区新固件存放分区
KV分区记录系统升级中的一些环境变量
分区表存放分区表固定大小32B一般放在Flash的最后一个扇区中
在实际应用中两种方式的选择要根据设备需求设备Flash空间大小设备Flash扇区大小综合考虑。
本文接下来如无特殊说明都是以第一种方式原地升级为例官方板的Flash大小为1024KB可以如下分区
![](./image/ota-http03.png)
### 2.2 分区表工具的使用方法
TencentOS-tiny 源码中提供了一个生成分区表的命令行工具需要先使用gcc编译没有gcc环境可以安装MinGW。
#### 2.2.1 编译
进入\components\ota\tools\partition_table目录执行make命令开始编译编译之后进入到当前目录下的out\target即可看到工具 ptbl.exe
cd out/target/
该工具有如下参数:
1. h打印帮助信息
2. p <ip/pp>:选择升级方式,ip或者pp
3. a <start,end>Active APP分区的起始和结束地址
4. b <start,end>Backup 分区的起始和结束地址选了pp方式才需要
5. o <start,end>OTA分区的起始和结束地址
6. k <start,end>KV分区的起始和结束地址
7. v <major>.<minor>:初识固件版本号
为官方板生成分区表文件的命令如下:
./ptbl.exe -p ip -a 0x08007800,0x080CF800 -o 0x080CF800,0x080F9800 -k 0x080F9800,0x080FF800 -v 0.1 ptbl.bin
运行之后即可在当前目录下看到生成的分区表文件ptbl.bin。
### 2.3 分区表烧录方法
生成的分区表文件ptbl.bin可以通过STM32CubeProg直接烧录到Flash中按照之前规划的分区烧录位置为 0x0803F800 ,烧录方法如下:
(1)使用下载器连接开发板到PC打开STM32CubeProg工具点击Connect连接到开发板
![](./image/ota-http04.png)
(2)如果是第一次使用OTA点击左侧的烧录按钮点击全片擦除
![](./image/ota-http05.png)
第一次使用的时候KV分区中的数据不确定可靠起见直接选择全片擦除。
(3)点击左侧的烧录按钮选择刚刚生成的ptbl.bin下载地址填写 0x080FF800点击烧录
![](./image/ota-http06.png)
出现烧录成功弹窗即可。
## 3. 测试Bootloader程序
进入board\BDW01-STM32L496VG\KEIL\ota目录打开官方提供的bootloader示例工程 ota_bootloader_recovery。
bootloader其实是一个裸机程序在 main 函数中主要有三部分,分别对应三个功能:
读取分区表
根据patch包进行升级
跳转到Active APP分区开始执行
接下来将完成 1.3 节所给出的OTA组件开发调试推荐流程前三步。
### 3.1 测试bootloader是否可以读取分区表
首先需要指定分区表地址:
![](./image/ota-http07.png)
如下初始化环境变量的代码在初始化之后打印分区表的代码最后的while(1)用于停止程序,防止进行后面的功能:
![](./image/ota-http08.png)
修改程序编译地址和大小与Bootloader分区的划分相对应
![](./image/ota-http09.png)
编译程序。
编译成功之后修改下载设置选择扇区擦除方式、设置程序烧录起始地址、设置程序烧录大小同样与bootloader分区的划分相对应
![](./image/ota-http10.png)
下载程序,在串口助手中观察输出:
![](./image/ota-http11.png)
### 3.2 测试bootloader是否可以跳转到Active APP分区
打开和bootloader在一个目录下的app工程ota_application_download_through_http。
目前我们只是测试bootloader是否可以跳转过来执行此程序所以如图所示修改代码不要触发OTA固件拉取功能
![](./image/ota-http12.png)
另外,因为此程序被烧录到 Active APP 分区是从Active APP分区的起始地址开始运行的所以需要修改中断向量表的偏移地址如图
![](./image/ota-http13.png)
同样修改程序编译的起始地址和大小,与规划的 Active APP分区信息相对应
![](./image/ota-http14.png)
编译程序。
编译成功之后修改下载设置烧录到Actice APP分区中
![](./image/ota-http15.png)
最后再修改bootloader程序屏蔽while(1)屏蔽OTA固件升级功能开启跳转功能
![](./image/ota-http16.png)
再次编译下载bootloader复位开发板查看串口助手中的输出可以看到bootloader成功跳转到Actice APP开始执行
![](./image/ota-http17.png)
### 3.3 差分patch包生成方法
#### 3.3.1 准备老固件和新固件
官方示例工程已经在MDK中配置编译后生成.bin固件如图
![](./image/ota-http18.png)
编译之后会在工程目录下生成TencentOS_tiny.bin文件拷贝一份出来重命名为:TencentOS_tiny_0_1.bin表示这是0.1版本的固件。
修改app工程将打印信息中的0.1改为0.2,以验证是否升级成功:
![](./image/ota-http18.png)
重新编译生成新固件TencentOS_tiny.bin同样拷贝一份重命名为TencentOS_tiny_0_2表示这是0.2版本的固件。
![](./image/ota-http19.png)
#### 3.3.2 差分升级包生成工具的使用
编译此工具同样需要gcc环境。
进入\components\ota\tools\diff目录执行make命令开始编译编译之后进入到当前目录下的out\target即可看到工具 diff.exe
cd out/target/
该工具有如下参数:
1. h打印帮助信息
2. v打印更多信息
3. s<待定...>
4. b <n>指定扇区大小单位字节Byte
5. n <major>.<minor>:新的固件版本号
6. o <major>.<minor>:旧的固件版本号
将3.3.1节准备的两个固件拷贝到当前工具所在目录下。
根据前面准备的两个新旧固件,制作差分升级包的命令如下:
./diff.exe -v -b 2048 -n 0.2 -o 0.1 TencentOS_tiny_0_1.bin TencentOS_tiny_0_2.bin patch.bin
运行之后即可在当前目录下看到生成的差分升级包patch.bin。
![](./image/ota-http20.png)
### 3.4 测试bootloader是否可以根据patch进行升级
使用STM32CubeProg直接将差分升级包patch.bin下载到OTA分区
![](./image/ota-http21.png)
下载成功后因为bootloader通过检测KV分区中的环境变量new_version来判断是否有新的固件但是环境变量在app程序拉取固件成功之后才会设置所以我们手动在bootloader中来设置此环境变量。
在main.c中引入KV的头文件
```c
#include "tos_kv.h"
```
在环境变量初始化代码之后,升级代码之前添加(打开)如下的代码:
![](./image/ota-http22.png)
添加之后编译,下载,在串口助手中查看输出:
![](./image/ota-http23.png)
可以看到bootloader成功根据patch差分包和旧的固件还原出了新的固件并成功升级。
## 4. 使用HTTP方式获取固件并升级
TencentOS-tiny OTA组件支持使用 HTTP 协议拉取差分升级patch包并烧写到OTA分区中。
### 4.1 准备HTTP服务器
HTTP服务器的选择非常多常用选择有
在Windows上使用类似MyWebServer的小工具开启HTTP服务
1)优点:简单方便,用于测试
2)缺点:需要在路由端做一个端口映射,可以通过外网进行访问
![](./image/ota-http24.png)
在云服务器上安装类似Nginx的工具开启HTTP访问
1)优点性能强劲、有公网ip、支持高并发大量设备同时开机拉取固件
2)缺点:安装过程较复杂
除了这两种方式外还有很多的方式可供选择只需要开启HTTP服务即可本文中我使用第一种方式。
开启之后将第3步中生成的差分升级固件 patch.bin 上传/复制到HTTP服务目录中然后使用浏览器访问http://<已经开启HTTP服务PC的ip,外网ip>:<HTTP服务端口>/patch.bin测试正常获取之后方可进行后续操作。
开启HTTP服务之后记得关闭各种防火墙比如Win10网络防火墙云服务器安全组等。
### 4.2 HTTP获取固件并升级
(1)使用STM32CubeMX Prog全片擦除烧写分区表到0x080ff800;
(2)修改bootloader程序去除手动设置new_version环境变量代码编译下载**不要复位**:
![](./image/ota-http25.png)
![](./image/ota-http26.png)
(3)修改Actice APP工程(ota_application_download_through_http)开启HTTP固件拉取和升级功能:
![](./image/ota-http27.png)
打开串口可接收M5313的数据
![](./image/ota-http28.png)
修改分区表地址根据自己的外网ip配置
![](./image/ota-http29.png)
修改之后编译,下载,**不要复位**。
特别注意此时0.1版本的程序已经被我们修改所以之前生成的patch包无法完成升级重新在0.1版本的基础上修改处0.2版本的程序并制作patch包。
重复一遍之前的制作流程即可:
① 将当前固件拷贝出来重命名为TencentOS_tiny_0_1.bin;
② 修改打印提示表示这是0.2版本的程序:
printf("do sth(v0.2)...\n");
③ 将新固件拷贝出来命名为TencentOS_tiny_0_2.bin;
④ 使用diff命令行工具或者可视化工具制作差分升级包patch.bin
⑤ 将制作出的差分升级包拷贝/上传到HTTP服务器目录
此时一切准备就绪复位设备即可在串口助手中看到OTA的升级状况
上电启动
![](./image/ota-http30.png)
等待连接,请求,下载,后
![](./image/ota-http31.png)

Binary file not shown.

After

Width:  |  Height:  |  Size: 820 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 67 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 134 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 105 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 156 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 83 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 85 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 89 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 88 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 88 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 134 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 105 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 137 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 875 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 77 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 74 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 133 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 119 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 145 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 150 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 150 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Some files were not shown because too many files have changed in this diff Show More