搜索
查看
编辑修改
首页
UNITY
NODEJS
PYTHON
AI
GIT
PHP
GO
CEF3
JAVA
HTML
CSS
搜索
weixin_40725706
这个屌丝很懒,什么也没留下!
关注作者
热门标签
jquery
HTML
CSS
PHP
ASP
PYTHON
GO
AI
C
C++
C#
PHOTOSHOP
UNITY
iOS
android
vue
xml
爬虫
SEO
LINUX
WINDOWS
JAVA
MFC
CEF3
CAD
NODEJS
GIT
Pyppeteer
article
热门文章
1
用Python实现一个大数据搜索引擎
2
解决Android Studio中Plugin version和Gradle version不匹配的问题_android studio 无法编辑android gradle plugin version
3
“从零开始搭建一台ROS开源迷你无人车”第三周学习记录_[fatal] [1715751858.301716956, 202.746000000]: fai
4
HTTP-内容安全策略(CSP)详细_http csp
5
ImportError: cannot import name ‘OpenAI‘ from ‘openai‘ (D: \anaconda\lib\site-packages \openail_init_cannot import name 'openai' from 'openai
6
Oracle ORACLE 快速批量导入文本数据到数据库(sqlldr工具)方法与分析 (Windows CMD 方式)_如何通过cmd将txt文件数据导入到oracle数据库
7
Qt布局管理详解(5种布局控件)_qt布局详解
8
【Unity动画】Unity如何导入序列帧动画(GIF)_unity gif
9
java高分面试指南:java高并发秒杀面试题_java 高并发 面试
10
1.6.2 nuScenes
当前位置:
article
> 正文
1-远程升级篇(自建物联网平台)-STM32通过EC800使用http或https下载程序文件,升级程序(单片机程序检查更新)_stm32 网络下载文件
作者:weixin_40725706 | 2024-06-10 16:20:15
赞
踩
stm32 网络下载文件
说明
这节测试一下STM32通过EC800K(移远4G Cat1)使用http或https远程下载升级单片机程序
为应对小容量单片机问题,升级底层包也支持把备份程序写到外部flash.
打开BootLoader程序,说明下flash支持情况
1,当前程序(V3.0.0)支持外接W25Q80/16/32/64/128,后续将根据用户需求增加更多的flash支持
使用内部flash和外部flash分配情况如下:
使用外部flash以后,备份用户程序区放到了外部flash, 使得用户程序有了更大的空间
2,当前开发板未板载外部flash,测试外部flash需要用户自己外接flash
MCU flash芯片
PA4 -- CS
PA5 -- CLK
PA6 -- MISO (SO)
PA7 -- MOSI (SI)
3,flash选择
如果用户使用内部flash备份程序, 则把FLASH_EXTERN_BACKUP_ENABLE 设置为0
如果用户使用外部flash备份程序, 则把FLASH_EXTERN_BACKUP_ENABLE 设置为1
测试
我已经把固件文件放在了自己的服务器上
默认使用本人提供的下载路径测试
文件路径: 网站根目录->ota->hardware->STM32EC800BK
user_crc.bin: 是固件程序文件.
该固件程序文件并不是直接可以运行的文件
里面的数据每隔128字节后面增加2位CRC校验位
单片机下载以后每隔130字节校验一下数据,然后把前128字节写入Flash.
加入CRC校验让升级变的稳定可靠.
info.txt文件内容:
version:0.0.1 云端固件程序版本
url:http://mnif.cn/ota/hardware/STM32EC800BK/user_crc.bin 固件程序下载地址
"info":"1.解决了部分BUG 2.优化了部分程序" 使用APP控制升级时,APP的提示信息.
升级过程:
用户程序里面每隔一定时间控制网络模块使用http的GET指令获取云端info.txt文件
然后从文件里面获取服务器里面的固件程序版本和固件程序下载地址等信息
如果与自身版本号对比不一致,就把固件程序下载地址写入flash,然后设置更新标志,重启,
重启执行BootLoader以后,BootLoader程序检测到更新标志,则提取固件下载的地址,
然后使用http下载程序文件,把程序文件写入flash,完成升级.
备份升级流程图
GPRS模块和底板安装说明
单片机通过串口2和GPRS模块通信; 单片机PA8引脚作为复位模组使用;PB15连接模组的开机引脚
(单片机)PA2 ---- (EC800K)RX;
(单片机)PA3 ---- (EC800K)TX;
(单片机)PA8 ---- (EC800K)RST
(单片机)PB15 ---- (EC800K)PWR
注意: 单片机都是使用串口2和模组通信,所以需要拆掉ESP8266
测试
1.使用下载器下载BootLoader程序
使用单片机串口1打印串口日志(115200)
2.下载用户程序到开发板
3.观察日志,说明执行流程
开始运行用户程序,默认提供的用户程序设置的程序版本是0.0.0
用户程序控制模组连接服务器,使用get指令获取获取服务器上的固件信息文件 info.txt
检测到版本不一致以后,把获取的url存储到flash,设置更新标志,重启.
重启之后BootLoader提取url
BootLoader发送get指令获取程序固件
升级完成以后,运行新下载的程序.
用户程序运行后控制模组连接服务器,使用get指令获取获取服务器上的固件信息文件 info.txt
现在程序版本和上面的是一致的,所以不需要更新
应用到自己的服务器(如果使用SSL, 则把下载路径的http改为https即可)
1,首先确定好程序文件在服务器的路径
关于本人服务器文件夹解释:(自己随意就好,最后的文件夹命名建议使用产品的型号)
html:网站根目录
ota: ota升级
hardware : 硬件程序
STM32EC800BK: 作为产品的型号(根据自己的产品型号修改)
我把固件放到了里面那么固件程序下载地址为:
http://服务器IP地址/ota/hardware/STM32EC800BK/user_crc.bin
那么固件信息的下载地址为:
http://服务器IP地址/ota/hardware/STM32EC800BK/info.txt
2.修改 用户程序(mcu_project) 的IAP.C文件
提示:我把它们存储在程序bin文件的1024字节倍数的位置是为了BootLoader下载的时候便于提取这些数据;
1.产品型号(我设置的为STM32EC800BK)
2.修改固件程序版本(可随意指定,我设置的为0.0.2)
3.修改记录云端固件信息文件下载地址(我的为:http://mnif.cn/ota/hardware/STM32EC800BK/info.txt)
5.修改BootLoader程序 的 IAP.c (设置下产品型号和默认的固件程序下载地址)
注意:BootLoader里面的产品型号要和用户里面的一样!!!!
BootLoader程序下载的时候会判断这个型号一不一致
6.编译用户程序(mcu_project)
会在工程目录的bin文件夹生成 user.bin文件
7.打开OTA Tools上位机软件
8.按照红框选择配置
9.选择用户程序生成的 bin文件
10.点击 生成固件
11.将在user.bin目录生成user_crc.bin文件
两个bin文件的区别:
1.user_crc.bin文件是在user.bin的基础上增加了CRC校验位
2.OTA Tools软件会改写size,会把此文件大小填写到此处
12.把生成的user_crc.bin文件拷贝到服务器
13.还差一个info.txt文件
我准备了一个模板
14.修改版本号(和用户程序里面设置的一样)
16.修改固件程序下载地址(和服务器上面的保持一致)
17.最后的提示信息不需要更改,当前用不到
18.把info.txt文件也拷贝到服务器,然后按照一开始的步骤测试即可
小总结
远程升级单片机程序其实就是使用模组以TCP方式连接Web服务器,
然后给TCP服务器发数据,数据格式是GET指令.
服务器接收到指令以后会下发文件给模组,模组通过串口把数据发给单片机,
单片机接收到数据以后写到flash,最后加载运行.
关于Flash分配调整
1.打开BootLoader 或者 用户程序(mcu_project)里面的iap_interface.h 文件
--------------------------------------------------------内部flash--------------------------------------------------------
如果是使用内部flash备份程序,flash的开头存储的BootLoader程序, 结尾存储更新相关数据, 预留一些空间让用户存储其它数据
最后剩下的平半分, 一部分存储用户程序, 另一部分用来备份用户程序
--------------------------------------------------------外部flash--------------------------------------------------------
备份的程序存储到了外部flash, 内部flash的最一开始存储的BootLoader程序,
然后是存储用户程序, 然后是存储更新相关数据, 最后预留一些空间让用户存储其它数据
2,用户可以根据自己的需求调整Flash分配大小, 注意:BootLoader程序和用户程序的Flash分配要保证一样.
--------------------------------------------------------内部flash--------------------------------------------------------
调整完成以后,下载BootLoader程序, 串口会打印flash具体分配
--------------------------------------------------------外部flash--------------------------------------------------------
调整完成以后,下载BootLoader程序, 串口会打印flash具体分配
3,无论是否使用外部flash,用户在项目中如果需要使用内部flash存储数据, 可以根据自己存储的数据量调整
数据存储的起始地址是: FLASH_USERDATE_ADDR
4,如果使用外部flash备份数据,同时用户也需要使用外部flash存储数据,
为了不影响备份区,我给用户提供了数据存储的起始地址: FLASH_EXTERN_USERDATE_ADDR
5.调整完flash以后,用户需要根据BootLoader打印的信息, 来设置用户程序(mcu_project)运行地址和占用空间
这个要根据自己打印的设置
关于升级底层包
1.升级底层包分为iap, flash_extern, iap_interface文件
1,flash_extern文件是配置和外部flash通信的文件
2. iap文件主要是控制着升级流程的文件
可以在BootLoader程序里面设置升级过程中需要如何去下载,设置多大的缓存区
3. iap_interface是接口文件
根据移植的单片机实现内部的接口,只要完成里面的接口就完成了升级程序框架
用户程序说明
1.解析下info.txt下载路径(服务器上记录固件信息的文件)
做这个程序是为省去用户解析的繁琐.
执行解析之后:
IAPStructValue.SSLEN = 0;
IAPStructValue.IP = mnif.cn;
IAPStructValue.Port = 80;
IAPStructValue.Path = /ota/hardware/STM32EC800BK/info.txt
如果路径写的是https
IAPStructValue.SSLEN = 1;
IAPStructValue.Port = 443;
如果指定了端口号 http://mnif.cn:8080/xxxxxx
IAPStructValue.Port = 8080;
4.处理更新(这个程序需要在认为用户程序没有问题的时候在用户程序里面执行一下)
解释:
BootLoader更新程序的时候会设置一些更新状态;用户程序需要调用一下这个函数清除更新状态.
如果用户程序不清除更新状态,那么一旦程序重启以后BootLoader检查到更新状态以后会自行回滚程序.
5.控制模组发送get指令获取服务器上记录固件信息的文件
解析info.txt文件内容, 如果版本号不一样,提取和存储url然后设置升级标志,重启.
7,补充:如果编译用户程序出现下面的警告
其实是这个地方导致的
为了便于BootLoader程序提取用户程序bin文件里面的型号,把型号存储在了偏移1024字节的位置.
设置的这个字符串存储的位置影响到了芯片本身默认分配一些数组的位置.就会报上面的警告.
貌似不影响什么...
BootLoader程序详细说明
1.查看IAPInit函数
2.获取存储的固件下载的url,并解析下url
3.如果有更新标志,则备份下用户程序
4.如果没有更新标志,则查看下更新状态
如果状态是更新有错误,则执行回滚,如果检测到没有备份的程序,就重新执行升级
5.如果更新状态是0x01,就设置更新状态为0xFE
7.控制模组连接TCP服务器(Web服务器),
8.发送get指令获取程序文件
8.在TCP接收数据函数里面把固件数据写入缓存
单片机是通过串口和模组通信,所以在串口中断里面接收
9.从缓存取数据,并写入flash
11,如果接收到相应的文件个数
设置 IAPStructValue.ReadDataEndFlag = 1;认为接收完成
12,判断接收完成之后做各种判断
如果确实接收完了,则写入0x01状态,重启.
如果有错误,则尝试重新下载.
13,如果是程序文件下载完成以后重启,重启以后检查到更新状态是0x01会设置更新状态为0XFE
14,然后加载运行用户程序
15,超过一段时间没有接收到数据了也设置为接收完了数据
16,客户可以在IAP.h修改默认的超时时间
整体运行超时是BootLoader程序一运行就一直累加的的定时, 超过时间就会控制程序重启
声明:
本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:
https://www.wpsshop.cn/w/weixin_40725706/article/detail/699485
推荐阅读
article
[已
解决
]
HttpMessageNotReadableException
:
JSON
parse e...
在本篇博客中,我们讨论了在Spring框架应用程序中解析
JSON
时出现的异常,并分析了异常信息及其原因。为了
解决
这个问题...
赞
踩
article
SpringBoot 服务器压缩上传文件 HttpMessageNotWritableExcepti...
客户端发送请求,服务器返回相应的压缩文件在下载的时候会报一个错误,但是不影响文件的传输org.springframewo...
赞
踩
article
org
.
springframework
.
http
.
converter
.HttpMessageNotR...
请求其他微服务时json数据太大被压缩导致的,在配置文件中将该参数调大些即可。springcloud在远程调用其他微服务...
赞
踩
article
org
.
springframework
.
http
.
converter
.HttpMessageNotW...
org
.
springframework
.
http
.
converter
.HttpMessageNotWritableExc...
赞
踩
article
关于返回响应时
springBoot
项目后端报错
org
.
springframework
.
http
.co...
org
.
springframework
.
http
.
converter
.HttpMessageConverter异常解决_...
赞
踩
article
报错解决:【HttpMessageNotReadableException:
JSON
parse ...
这两天,迭代开发一个简单小需求,POST 请求接收前端的传参,将接收到的
JSON
格式再转换成对应的 POJO,但是在...
赞
踩
article
网络
原理——
http
/
http
s
---
http
(2)...
介绍
http
协议
网络
原理——
http
/
http
s
---
http
(2) ...
赞
踩
article
解决Anaconda创建环境时出现:Conda
HTTP
Error:
HTTP
000 CONNECT...
解决Anaconda安装环境或者包出现Conda
HTTP
Error:
HTTP
000
CONNECTION
FAILE...
赞
踩
article
解决
go
项目报错:
fatal
:
could
not
read
Username
for
‘
https
...
解决方案:环境设置GIT_TERMINAL_PROMPT=1export GIT_TERMINAL_PROMPT=1
go
...
赞
踩
article
fatal
:
could
not
read
Username for ‘
https
://XXX.co...
原因:go get 默认使用
https
拉取源码,会因为校验用户名密码而失败解决方案:通过git config 切换htt...
赞
踩
article
[原创简单粗暴]超简单解决
hexo
d
提示
fatal
: coul
d
not rea
d
Usernam...
方法一 实现自动提交打开C:\Users\A
d
ministrator.DESKTOP-Q7DQAHS\_netrc各位照...
赞
踩
article
git
报错
fatal
:
could
not
read
Username
for ‘
https
://g...
export GIT_TERMINAL_PROMPT=1 # 报错是因为没登录,设置这个后,会提示登录
git
报错fata...
赞
踩
article
fatal
: could not read Username for '
https
://
gitee
....
go get
gitee
.
com
/t_group/file-trde-cmon@newgo:
gitee
.
com
/wt_...
赞
踩
article
Go
Module
私有仓库:fatal: could not
read
Username for ...
说明关于Go
Module
拉取私有仓库时,遇到terminal prompts disabled权限的问题。错误信息go...
赞
踩
article
EasyNTS
编译报错“fatal:
could
not
read
Username for ‘ht...
EasyNTS
的主要作用就是解决异地视频共享/组网的需求,网页对域名进行添加映射时,添加成功后会生成一个外网访问地址,在...
赞
踩
article
go
get
fatal: could not read Username for '
https
:/...
用
go
get
下载私有代码库的时候,莫名其妙产生了以下错误,公有代码库没有影响。chenchideMacBook-Pro...
赞
踩
article
go
拉取仓库依赖报错:
fatal
:
could
not
read
Username for ‘ht...
文章目录解决方法在我们用
go
mod tidy更新项目依赖包的时候,有可能会遇到这个问题,这个主要问题是git没有配置...
赞
踩
article
【网络原理】
HTTP
|认识请求“报头“|Host|
Content
-
Length
|
Content
-Ty...
本篇文字主要介绍了
HTTP
的请求方法header:host,content-length,content-type,UA...
赞
踩
article
JavaWeb |
HTTP
协议
请求与
响应
格式_
http
响应
中的%pdf-
1.5
...
一、
HTTP
是什么计算机网络核心概念:网络
协议
网络
协议
种类非常多,其中一些耳熟能详的,IP,TCP,UD… 其中还有一...
赞
踩
article
OBS
+
nginx
+
nginx
-
http
-
flv
-
module
实现阿里云
的
推流
和拉流...
nginx
+
nginx
-
http
-
flv
-
module
模块实现云服务器
的
的
RTMP和FLV
的
推拉流
OBS
+
nginx
+n...
赞
踩
相关标签
json
spring boot
spring cloud
mybatis
java
1024程序员节
http
后端
网络
经验分享
golang
git
github
python
数据库
go
gomod