一、OTA
OTA即over the air,是一种远程固件升级技术,它允许在设备已经部署在现场运行时通过网络远程更新其固件或软件。OTA技术有许多优点,比如我们手机系统有个地方做了优化,使用OTA技术我们就不用召回每部手机,直接通过云端就可以进行远程下发固件,这样就节省了成本。这里我们使用的是腾讯云来进行OTA操作。
OTA下载技术的大概步骤:
OTA(空中下载技术,即通过云端远程进行固件升级)
1、ESP8266连接本地WIFI(路由器)
2、登录腾讯云MQTT服务器
3、订阅主题(
主题1:$ota/report/6Z77GCWKOQ/${deviceName}(上传本地固件版本号,消息上行)
主题2:$ota/update/6Z77GCWKOQ/${deviceName}(用于固件的下载,消息下行) )
4、上传本地固件版本号
5、在控制台进行云端固件的信息的推送(固件大小、MD5值、版本号...)
6、进行固件下载(通过HTTP进行分包下载(分包大小与FLASH容量有关,即所用的MCU是大容量还是小容量还是中容量产品,也就是按1个扇区大小进行分包,有的是1Kb一个包,有的是2Kb一个包)),固件下载到FLASH的OTA分区
7、验证MD5值,验证成功后将固件从OTA分区写入到APP分区
8、IAP跳转到APP分区执行新的固件代码
FLASH分区:e
在这里,我们从云端下载到的程序会先放在OTA分区,下载完之后如果代码没有问题,则Boot Loader会引导OTA分区的代码到APP分区,最终运行的是APP分区。
二、WIFI模块
因为我们需要连接云端,故我们需要使用到WIFI模块,这里我们使用的是ESP8266WIFI模块。
三、腾讯云以及待下发固件的准备
在这里我们需要用到的是腾讯云的固件升级
这里可以直接搜索固件升级,然后选择物联网开发平台
点击产品控制台
点公共实例
新建一个项目,我这里之前新建了一个OTA项目,然后点创建的项目名
然后点击新建产品,随便创建一个产品
点击固件升级,并点击添加固件(这个是待下发的固件):
这里填一下固件信息,并选择待下发的固件,固件必须得是.bin文件
在keil5中我们可以按如下操作生成.bin文件
所填的内容为:
C:\Keil_v5\ARM\ARMCLANG\bin\fromelf.exe --bin --output .\Objects\pwm.bin .\Objects\pwm.axf
其中formelf.exe是Keil自带的格式工具软件,其路径在你电脑的Keil安装盘的对应位置,记住空一格,然后写--bin然后空一格写--output然后空一格,Objects是我用于存放输出bin文件的文件夹(系统默认此路径从工程文件开始算起),后面的Objects是我们存放.axf的文件夹。
弄完上面这些之后,我们需要改一下待下发固件的烧录位置,因为这个是需要烧入到APP分区的,所以我们需要设置偏移量。这个是根据自己对FLASH分区的划分来进行偏移的。这里我设置的是0x8005800,所以偏移量是0x5800
还有别忘记修改User中的烧入位置
四、stm32的准备
做好这些准备之后,代码如下:
链接:https://pan.baidu.com/s/1QXZX_dUfhmpl4TQFW5y4JQ
提取码:TD01
这里我们使用的是stm32f103rct6的板子进行开发,代码中我们需要修改:
1、startup启动文件,一开始的是md.s的,我们需要将其移除并将hd.s的启动文件加入到工程中。
2、芯片:因为我们使用的是stm32f103rct6板子,芯片得改一下
既然改了芯片,那么全局宏也得改一下
全局宏改了之后 ,因为现在腾讯云使用的是http不是https,故我们需要改一下ota.c文件中的如下代码:
还有就是扇区大小改变了,所以我们下载OTA固件这部分代码也需要改,也在ota.c中:
然后还有就是tencent_mqtt.h中的username啊,password啊,client_id啊,还OTA_PUB_TOPIC和OTA_SUB_TOPIC别忘了,这些都可以在腾讯云中找的到。
腾讯云中在这里:
这两个是MQTT协议需要的 ,其中deviceName改成自己的设备名
这些是所要填的东西,注意:这些是会经常变的,可能今天的用着还是好好的,明天可能就下发不了了,可能出现md5 error问题,注意改这里。
然后就是iap.h中的东西要改,因为我们使用的stm32是大容量产品,所以我们需要将扇区大小改成2048也就是2Kb,然后下面的FLASH_START_ADDR以及FLASH_APP_ADDR,还有FLASH_OTA_ADDR要根据自己的FLASH分区分配来填写。
做完这些之后我们就可以开始下发固件辣。