4G无线通信技术的单片机远程升级研究(学习)

news2024/12/28 4:06:56

介绍了一种基于4G无线通信技术的单片机远程在线升级系统及方法,由上位机、4G无线模块、嵌入式设备终端3部分组成。
结合EC20 R2.1 4G模块,介绍了4G无线网络的组建方法,借助4G网络实现远程无线升级。
通过验证测试,系统能够实现嵌入式程序可靠、稳定地快速升级。
本设计特别适用于恶劣环境、偏远地区等特殊场合,可大大提高设备维护效率,降低维护成本,具有很高的应用价值。

嵌入式设备在使用过程中,经常因功能更新、缺陷修改、性能提升等原因需要进行升级。
程序升级的传统手段是维护人员亲赴现场烧写程序,如果设备应用在高温高湿、腐蚀、密闭空间、野外等恶劣偏远环境中,人工操作是很困难的。此外,传统手段速度慢、差旅费用高,尤其是当设备数量庞大、分布范围广时,耗费的成本是不可估量的。

随着无线通信技术的发展,GPRS、4G等应用越来越简单,本文提出基于4G无线网络的嵌入式程序IAP远程在线升级方案。
使用4G无线网络,无需现场布线,设备安装位置灵活,只要有4G信号覆盖即可,非常适合用于恶劣环境、设备量大、分布范围广等特殊场合。

IAP在线升级原理

对单片机进行编程,常用方式有JTAG、ISP、IAP等。

  • JATG一般用于程序开发阶段在线调试。
  • ISP需要依靠单片机厂商预先固化在片内的引导程序(Bootloader)通过串行外设等程序下载到存储器,这种方式需要通过更改硬件设置选择程序启动位置。
  • IAP依靠用户自己的程序在运行中对单片机进行编程,不需要更改硬件设置,无人参与即可实现升级,具有更好的灵活性。

单片机实现IAP升级需要将片内存储器人为地分为两部分:一部分存储IAP程序,称为IAP程序区;另一部分存储正常的APP应用程序,称为APP程序区。

在STM32F103ZET6上实现IAP,需要将单片机配置为从Flash主存储器启动。

在这里插入图片描述
STM32F103ZET6的Flash存储器组织结构如表1所列,IAP程序放置在Flash基地址处(0x08000000)。在本应用中,将前20KB区域划为IAP程序区,其余划为APP程序区。

STM32主存储区起始地址为0x0800 0000,IAP程序从此地址开始写入。
在STM32中,程序的第1个字是栈顶地址,第2个字是复位向量指针,然后依次是其他中断向量指针(即中断向量表从第2个字开始)。

在设备生成阶段,将IAP和APP程序按照表1区域划分烧写到对应区域,系统启动及工作流程如图所示:
在这里插入图片描述
系统复位后从0x08000004地址取出复位中断指针,跳转到IAP复位中断程序执行,执行完后跳转到IAP程序main函数继续执行,如标号①所示。
在IAP的main函数中判断是否更新程序,并执行相应操作,最后从IAP向APP的跳转,取出APP复位中断向量指针,跳转到APP复位中断函数执行,如标号②所示,执行完APP复位中断函数后,返回到APP的main函数继续执行,这就完成了IAP向APP的跳转。

需要注意的是,在APP的main函数执行过程中,如果发生中断,PC指针仍跳转到0x08000004地址中断向量表,然后根据APP中设置的中断向量表偏移量跳转到APP对应中断服务程序执行,执行完后再返回APP程序的main函数。

关键:
在设备生产阶段,将IAP和APP程序按照表1区域划分烧写到对应区域。系统复位后从0x08000004地址取出复位中断指针,跳转到IAP复位中断程序执行,执行完后跳转到IAP程序main函数继续执行。在IAP的main函数中判断是否更新程序,并执行相应操作,最后完成IAP向APP的跳转,取出APP复位中断向量指针,跳转到APP复位中断函数执行。

4G无线通信技术

本设计中4G模块选用上海移远通信公司的EC20 R2.1,该模块支持最大下载速度150Mbps和最大上行速率50Mbps,内置丰富的网络协议,支持TCP/IP协议。

在本设计中,EC20 R2.1在APP程序中初始化,使用TCP/IP组网,组网过程如图2所示。
在这里插入图片描述
当模块复位后,首先进行基础配置,如UART波特率,是否回显等,模块自动检测SIM卡,自动附着4G网络,网络附着成功后,设置APN名称、目标IP、目标端口号等参数,然后激活PDP场景,打开网络连接,此时单片机就通过4G无线网络接入了Internet。

基站可接入设备数量是有限的,为了保证可随时接入新的设备,基站会主动断开长时间无数据交互的设备。
本设计中为实现4G网络长连接,设置有心跳功能,定时向上位机发送心跳数据,上位机收到后回应心跳应答。
另外,当网络异常断开后,为了保证网络可恢复,必须在APP程序中设置有自动重新组网机制。

系统总体设计

本系统包括上位机、4G无线模块、STM32F103RCT6设备终端3个部分。单片机外接EEPROM,临时存储上位机发来的升级数据,单片机通过UART和4G模块相连,4G模块通过无线网络连接到上位机。

使用开发软件(如Keil MDK)完成程序编写、调试、编译,并转换为*.bin格式文件用于IAP升级。
进行升级时,上位机将待升级文件按规则分多包发送到STM32设备,并做好缺包查询、重发、校验等,确保升级数据正确。

在APP程序中接收升级数据。设备收到升级数据包后,临时存储在EEPROM中,待所有升级包发送完且验证正确后,“升级标记”置位,然后软件复位重启系统,重新进入IAP程序,在IAP中将升级数据从EEPROM转存到单片机内Flash的APP程序区,完成升级。

IAP程序设计与分析

在这里插入图片描述
上电后程序从Flash存储区(起始位置为0x08000000)启动,执行IAP程序,依次进行外设初始化、“升级标志”检查、升级数据验证等,将升级数据转存到APP程序区,并清除“升级标志”,跳转到APP程序区执行。若“升级标志”无效,则直接跳转执行原来的APP程序。

在IAP程序中将升级数据转存到APP程序区如下:(首先擦除Flash空间,然后从临时存储区中读出数据,写入APP程序区)

NbrOfPage = FLASH_PagesMask(size); //计算升级文件占用多少Flash页
//擦除需要重新编写程序的Flash页
for(EraseCnt=0; EraseCnt<NbrOfPage; EraseCnt++){
	FLASHStatus = FLASH_ErasePage(FalshDest + (PageSize * EraseCnt));
	for(j=0; j<=size/512; j++){
		//将升级代码写入Flash,每次512字节
		if(j == size/512){
			packet_len = size % 512;
		}else{
			packet_len = 512;
		}
		SDReadDate(path,Buff,packet_len,512*j); //从备份区读出升级代码
		Source = (uint32_t)Buff;
		for(i=0;(i<packet_len)&&(FlashDest<RunAppAddr+size); i+=4)
			FLASH_ProgramWorld(FlashDest, *(uint32_t *)Source);
			FlshDest += 4;
			Source += 4;	
	}
}

将升级数据全部写到APP区后,清除“升级标志”并跳转到APP区继续执行。跳转代码如下:

//RunAppAddr为APP程序起始地址,本设计中为0x08005000
//检查栈顶地址是否合法
JumpAddr =*(__IO uint32_t *)(RunAppAddr+4); //获取APP的复位函数地址
Jump_To_App(pFunction)JumpAddr; //将跳转地址强制转换为指针函数
__set_MSP(RunAppAddr); //设置主堆栈指针
Jump_To_App(); //跳转执行APP程序

执行跳转程序时,首先检查栈顶地址是否合法,RunAppAddr是APP的起始地址,为0x08005000,程序的第1个字(4个字节)为栈顶地址,判断栈顶地址是否在RAM区域(0x20000000~0x2001FFFF),如果栈顶地址合法,取出APP复位中断指针(第2个字),并设置栈顶指针,最后跳转到APP复位中断服务函数,开始执行升级后的APP程序。

APP程序设计与分析

在APP程序中,首先要设置中断向量偏移表。在APP运行过程中如果发生中断,跳转到0x0800 0004复位中断向量后,根据设置的中断向量偏移量跳转到APP对应的中断服务程序。如果在偏移量设置前发生中断,将不能正确返回原地址运行导致系统异常,所以在APP程序中要尽早设置中断向量表偏移量。

本设计中IAP升级过程主要由“升级开始、缺包查询、发包数据、升级结束”4组指令完成,结合图5,具体操作流程如下:
在这里插入图片描述

  1. 升级开始,上位机发送“升级开始”指令,设备收到后做好升级准备工作,记录代码总大小,每包大小、总包数等信息,进行相应参数的初始化,并向上位机返回应答。
  2. 准备工作做好后,上位机发送“缺包查询”指令,设备向上位机返回缺包序号。
  3. 上位机收到缺包信息后,依据缺包号逐包发送升级程序。发送升级包时采取无应答发送,每隔一段时间(如400ms)发送一包数据,不必关心设备有没有正确接收。设备收到升级包后,按照包序号、大小顺序存储在临时存储区中。
  4. 上位机按照确保信息发送完所有包后,再次发送缺包查询指令,在步骤3发送升级包失败的,在此步骤上位机可以重新获取缺包序号。
  5. 按照新的缺包信息,逐包发送升级包。
  6. 重复步骤4、5,直至所有升级包发送完成。
  7. 成功发送完所有升级包后,上位机发“升级结束”指令,其中包含整个升级文件的CRC校验码,设备收到结束指令后,对接收到的全部升级数据进行CRC校验,如果校验码和上位机发送的一致,则认为升级数据正确,置位“升级标志”,并软重启设备,进入IAP程序,将临时存储区的升级数据复制到APP程序区,跳转到新程序执行,至此升级完成。

系统验证与分析

将EEPROM更换为256KB容量,保证临时存储空间足够。
使用Keil MDK完成IAP和APP程序后,使用JTAG分别烧写到IAP区和APP区。

系统启动后从IAP跳转到APP开始工作,待4G组网登录上位机后,开始远程升级测试。
本设计可靠性主要体现在:

  1. 设备4G网络断线后,可自动重新登录,避免因网络问题找不到设备,重新登录后,可从断点继续执行,不必重新发送所有数据。
  2. 通信协议设置有严格的校验机制,保证接收到每一帧数据正确。
  3. 缺包查询机制严谨,保证设备正确接收到每一个升级包。
  4. 在升级结束指令中发送整个升级文件的CRC校验码,设备将收到的升级数据以相同方式校验,与上位机发来的CRC对比,确保升级数据正确。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

css内阴影

CSS内阴影及特定方向内阴影 基本参数&#xff1a; /* x 偏移量 | y 偏移量 | 阴影颜色 */ box-shadow: 60px -16px teal;/* x 偏移量 | y 偏移量 | 阴影模糊半径 | 阴影颜色 */ box-shadow: 10px 5px 5px black;/* x 偏移量 | y 偏移量 | 阴影模糊半径 | 阴影扩散半径 | 阴影…

Python GUI编程利器:初始Tkinker(1)

小朋友们好&#xff0c;大朋友们好&#xff01; 我是猫妹&#xff0c;一名爱上Python编程的小学生。 和猫妹学Python&#xff0c;一起趣味学编程。 神兽归笼 最近天气炎热起来了&#xff0c;大家一定要注意防暑降温啊&#xff01; 马上要放暑假了&#xff0c;你有什么计划没…

AI届老牌顶流!AI孙燕姿?AI配音?带你玩转语音合成!

热度与争议并存&#xff01;AI孙燕姿成新晋顶流&#xff1f;随着AI孙燕姿的爆火&#xff0c;AI老牌顶流「语音合成」再度被炒热飞桨AI Studio也汇聚着众多“语音合成”深度玩家本期就来带大家快速上手 AI克隆歌手 该应用项目使用AI孙燕姿同源模型So-VITS-SVC 4.0&#xff0c;其…

Pyside6-QtCharts+psutil实战-绘制一个CPU监测工具

今天是实战篇章&#xff0c;我们结合可以快速提升我们开发效率的工具一起开实战一波实时读取系统CPU使用情况的折线图。 使用的开发工具Qt Designer来开发UI界面。 十分便捷。使用起来也算比较的简单了&#xff0c;虽然也存在不少的BUG。 ❝ 对所需要的控件进行拖拽式&#xff…

如何看待低级爬虫与高级爬虫?

爬虫之所以分为高级和低级&#xff0c;主要是基于其功能、复杂性和灵活性的差异。根据我总结大概有下面几点原因&#xff1a; 功能和复杂性&#xff1a;高级爬虫通常提供更多功能和扩展性&#xff0c;包括处理复杂页面结构、模拟用户操作、解析和清洗数据等。它们解决了开发者…

死神来了 | 印度火车,能靠点谱吗?

点击文末“阅读原文”即可参与节目互动 剪辑、音频 / 阿福 运营 / SandLiu 卷圈 监制 / 姝琦 封面 / 姝琦Midjourney 产品统筹 / bobo 场地支持 / 声湃轩天津录音间 6月初&#xff0c;印度三列火车先后相撞&#xff0c;造成288人死亡、1175人受伤&#xff0c;被称为印度本世…

基于Echarts2.X的地图数据可视化指南

目录 前言 一、关于Echarts版本 1、为什么用Echarts2.2.7 2、文件目录说明 二、地图数据可视化 1、新建map.html 2、Echarts图表初始化 3、参数设置 三、源码展示分析 1、初始化阶段 2、timelineOption.js模拟数据 总结 前言 在前面的博文&#xff08;数据会说话-从我国…

ebpf执行报错no BTF found for kernel

一、现象描述 采用cilium epbf框架开发的ebpf程序无法在系统上正常运行。 curtiscurtis-desktop:~$ cd work/ curtiscurtis-desktop:~/work$ ls kmodule vfs_write_moitor curtiscurtis-desktop:~/work$ curtiscurtis-desktop:~/work$ sudo ./vfs_write_moitor -filename/mn…

第九十天学习记录:C++核心:函数提高

函数默认参数 在C中&#xff0c;函数的形参列表中的形参是可以有默认值的。 语法&#xff1a;返回值类型 函数名 &#xff08;参数默认值&#xff09;&#xff5b;&#xff5d; 问&#xff1a;C语言可以在函数的形参赋默认值吗&#xff1f; 答&#xff1a; 在C语言中&#xf…

Unity 之 抖音小游戏本地数据最新存储方法分享

Unity 之 抖音小游戏本地数据最新存储方法分享 一、抖音小游戏文件存储系统背景二、文件存储系统的使用方法2.1 初始化2.1 创建目录2.3 存储数据2.4 删除目录/文件2.5 其他相关操作 三&#xff0c;小结 抖音小游戏是一种基于抖音平台开发的小型游戏&#xff0c;与传统的 APP 不…

Java POI (2)—— Excel文件的上传与导出(实例演示)

一、单文件的上传功能 这里是一个demo的流程图&#xff0c;下面按照这个流程图做了一个简单的实现&#xff0c;有部分判断没有加上&#xff0c;实际操作中&#xff0c;可以根据自己的需求进行增加或者修改。并且此处还是在接受文件传入后将文件进行了下载&#xff0c;保存到本地…

哪个爬虫库用的最多?

在Python中&#xff0c;最常用的爬虫库是requests和BeautifulSoup。requests库用于发送HTTP请求和处理响应&#xff0c;而BeautifulSoup库用于解析HTML文档。这两个库通常结合使用&#xff0c;用于爬取网页内容并提取所需的数据。其他常用的爬虫库还包括Scrapy、Selenium等。 常…

我的创作纪念日(256)

目录 机缘 收获 日常 成就 憧憬 机缘 要说为什么我会选择IT这条路&#xff0c;我觉得是因为从小对电脑的兴趣&#xff0c;从小学2年级开始的电脑生涯&#xff0c;但是那时候也只是玩电脑游戏&#xff0c;而由于我接触电脑较早的缘故&#xff0c;开始有许多的朋友遇到问题…

vue+heatmapjs-vue实现热力图,点击/滑动可以监听并更新

实现效果如下&#xff1a; 点击的次数或者滑动越多&#xff0c;区域的颜色越深 1.下载最新版热力图插件 npm install heatmapjs-vue 2.main.js中全局引用 注意&#xff01;&#xff01;&#xff01;只能全局引用&#xff0c;不能局部引用&#xff0c;局部引用就报错显示不出…

「2024」预备研究生mem-形式逻辑强化:入选名额

一、入选名额 从后往前推 二、课后题

第3章-数组

1. 数组的概述 数组(Array)&#xff0c; 是多个相同类型数据按一定顺序排列 的集合&#xff0c; 并使用一个名字命名&#xff0c; 并通过编号的方式 对这些数据进行统一管理数组的常见概念 数组名下标(或索引)元素数组的长度 数组本身是引用数据类型&#xff0c; 而数组中的元…

spring boot admin服务监控报错

使用spring boot admin监控服务启动出现报错&#xff1a;adminHandlerMapping对象创建失败 org.springframework.beans.factory.BeanCreationException: Error creating bean with name adminHandlerMappingdefined in class path resource [de/codecentric/boot/admin/server…

C++Qt 入门

目录 Qt 是什么 Qt 与 Qt Creator 的关系 暗黑主题音乐播放器界面 UI 设计。 简约的视频界面设计。 炫酷车载音乐 APP 主界面开发。 Qt/C与 QML 如何选择 Qt 版本 Linux 下安装 Qt 配置中文输入法 Qt Creator 简单使用 第一个 Qt 程序 新建一个项目 ​编辑 项目文…

Java JDBC

目录 JDBC定义 为什么需要JDBC JDBC的工作原理 JDBC API JDBC编程模板 JDBC编程步骤 JDBC实战 1.JDBC定义 Java连接数据库的一种能力或是技术 2.为什么需要JDBC 总结&#xff1a;利用JDBC才可以使服务器端和数据库进行数据的传递和交互 场景1&#xff1a; 客户端&am…

chatgpt赋能python:Python选择排序算法图解

Python选择排序算法图解 选择排序是计算机科学中经典的排序算法之一&#xff0c;它的原理是从待排序的数据中选择最小的元素然后排在最前面&#xff0c;接着从剩下未排序的数据中继续这个过程&#xff0c;直到所有的数据都排好序。 在本篇文章中&#xff0c;我将深入探讨Pyth…