基于LoRa技术的网络终端无线程序升级系统研究(学习)

news2024/11/27 16:46:40

摘要

设计了一种基于LoRa技术的STM32F4无线程序升级系统。此系统由PC及相关STM32软件开发环境、LoRa通信模块及控制器和STM32F4终端三部分组成。

本系统采用LoRa技术将程序数据无线发送到终端,终端通过IAP技术实现远程无线程序自动升级。测试结果表明,此系统能够有效地进行无线传感网络终端的程序升级,极大节约了时间和人力成本。

引言

近年来,基于物联网应用的各种嵌入式产品层出不穷。但由于物联网应用中节点众多、分布广泛,为嵌入式终端固件升级带来了很多不便,于是远程、无线程序升级方法吸引了很多学者的研究,其中基于IAP编程模式的程序升级方法应用较多。

有文献提出了利用GPRS通信技术实现51单片机的远程IAP功能;还有文献提出了一种基于HTTP协议的远程嵌入式产品程序升级方法;还有文献实现了一种基于nRF905通信技术的无线程序编程器,可以实现对51系列单片机的无线程序烧写;还有文献提到了Wi-Fi环境覆盖下的嵌入式产品系统升级方法;还由文献提出了一种基于蓝牙串口模块,通过ymodem传输协议实现的IAP方案。

以上的程序升级方法很难在节点众多的物联网应用中取得广泛应用。LoRa技术适合组建低功耗无线传感器网络,广泛应用于物联网研究中。
本文尝试将LoRa技术和IAP技术相结合,实现一种应用与STM32F4控制器的无线程序升级系统。
采用此方案进行程序升级,节约了成本,减少了人力物力的消耗,对同类无线终端和节点的程序升级有借鉴意义。

STM32F4芯片IAP编程基础

IAP即在应用中编程,是指通过一种通信接口(USART、USB、CAN等)下载程序或应用数据到存储器中。
通常用户在实现IAP功能时,需要人为地将芯片内部存储区分为两块:一块用于存储IAP程序,称为BOOT区;另一块用于存储除IAP功能外的应用程序,称为常态存储区。
在这里插入图片描述
通过设置BOOT0和BOOT1两引脚的高低电平来设置程序的启动区域。一般将程序烧录到主存储区,启动区域设置为主存储区。

STM32F4系列控制器加入IAP后,程序流程为:先取出栈顶地址,然后是复位中断向量,跳转至复位程序处执行,接下来程序便跳转至main函数处(为IAP程序的main)执行IAP过程。

IAP过程中控制器会接收功能程序,写入FLASH并执行。执行过程与IAP程序开始执行过程相似,此时FLASH内部存在着两个不同位置的向量表,当应用程序运行时,产生的中断首先仍然返回地址为0x08000004处的向量表,然后根据设置的向量表偏移量找到向量中断源并执行中断服务程序,执行完成后会返回应用程序的main函数。

系统总体设计

本系统由PC及相关STM32软件开发环境、LoRa通信模块及控制器和STM32F4终端三部分组成。

  • 利用STM32软件开发工具完成程序的编写、调试,生成bin文件;
  • PC机与LoRa模块控制器通过串口相连,收到数据后,串口会将数据每512字节打成一个数据包,然后发送给LoRa模块进行无线发送;
  • 与终端相连的LoRa模块接收到数据后会发送给STM32F4终端,终端判断完成数据接收后会写入FLASH并执行。

LoRa模块及控制器设计与分析

近年来,LoRa技术因支持远距离传输、大数量子节点和低功耗技术,在物联网应用中取得了广泛的使用。

本设计采用成都亿百特电子有限公司的LoRa模块,该模块采用Semtech公司SX1278射频芯片,传输距离最远可达到8km,工作频段为411~441MHz;该模块支持4种工作模式和空中唤醒,可最大限度降低功耗;模块通过串口实现外部通信,易于实现。

该模块共有7个引脚,通过串口实现与外部设备通信,引脚M0,M1来设置模块工作模式,AUX用来指示模块工作状态。

在这里插入图片描述
LoRa模块控制器的流程图如图所示,LoRa模块与控制器的连接关系如图所示:
在这里插入图片描述
控制器从PC接收程序代码,由于LoRa模块接收缓存有限,控制器须将代码分包,以一定时间间隔发送给LoRa模块。

控制器上电会完成两个串口的初始化,串口1用来接收PC发送的bin文件,串口6用来向LoRa模块发送数据。

串口1接收到数据后会进入串口接收中断函数,数据由DMA通道存储到内存特定区域,串口总线空闲中断标志接收代码完成。

发送循环中,控制器每次将一个512字节的数据包(最后一次将剩余全部)发送给LoRa模块。当LoRa模块内部缓冲区的数据被读取时,AUX引脚的电平会发生变化,PA1引脚会捕捉AUX电平变化并产生中断,中断函数会设置发送下一个数据包,程序依次循环直至代码发送完全。

由于AUX的变化智能表示LoRa模块已开始发送缓冲区内的数据,并不能确保数据已被完全发生且接收方LoRa模块也需要足够的时间来接收数据,因此发生下一个数据包之前会有一段延时,确保完整的数据发送和接收,这个延时数值在应用中赢根据无线传输的距离而定,不能小于数据从写进发送端LoRa缓冲区到接收端完全接收的时间间隔,本系统中设置的时间为1s,满足这一要求。

终端IAP程序设计与分析

IAP程序以SWD方式下载至芯片中,IAP程序流程如图3所示。
在这里插入图片描述
上电复位后,依照BOOT模式设置,程序会从主存储区开始执行IAP程序。首先完成初始化,LoRa模块处于休眠状态;然后查询存储于FLASH地址为0x080E0000处的更新标志位(upstate_mark)的值,如果该值为0x01,则表示程序需要等待更新,此时需要将LoRa模块从休眠状态唤醒,终端会等待接收程序代码。

终端一旦通过串口接收到LoRa模块发送的程序数据,就会记录所接收的数据的长度,并且以1s的时间间隔查询数据长度,如有两次发现数据长度不变,则判定接收完成,紧接着将update_mark置0x00,表示下次终端上电无需等待更新。

应用程序会被写到起始地址为FLASH_APP1_ADDR的连续FLASH存储区内。在此终端程序中给它分配的值为0x08010000,即在此之前给IAP程序预留的空间为64KB,通过Keil软件查看编译后的IAP程序代码大小完全够用。

向FLASH写入代码前,首先要判断一下复位向量所在的物理存储空间是不是指向FLASH的,代码如下:

(*(u32_t *)(FLASH_APP1_ADDR+4)) & 0xFF000000 == 0x08000000

确认无误后,开始调用向FLASH写应用程序函数,代码如下:

iap_write_app(FLASH_APP1_ADDR,(uint32_t)USART_RX_BUF,REC_CNT);

此函数会调用STM32F4开发库中的写FLASH函数,代码如下:

if(FLASH_ProgramWolrd(WriteAddr, *pBuffer) != FLASH_COMPLETE){
	break;
}
WriteAddr += 4;
pBuffer++;

FLASH_ProgramWolrd()每次会向FLASH写入一个字(4字节),接收数组是字节类型的,因此调用时要强调地址类型转换。
执行完写程序后,将upstate_mark变量重写为0x00,下次上电复位标志无需等待更新,直接执行程序调整。

if(((uint32_t *)App1Addr) & 0x2FFE0000) == 0x20000000){
	JumpToApp() = (iapfun)*(vu32*)(App1Addr+4); //取出复位函数地址
	MSR_MSP(*(uint32_t *)App1Addr); //设置主堆栈指针
	JumpToApp(); //跳转执行应用程序
}

首先检查栈顶地址是否合法,App1Addr为应用程序地址,程序代码第一个字为栈顶地址,判断栈顶地址是否在0x2000 0000 ~ 0x2001 FFFF(RAM区域)范围内;取出应用程序复位函数地址;设置栈指针;程序跳转到应用程序复位函数地址处,应用程序开始执行。

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

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

相关文章

基于Springboot+Vue的宠物店猫咖管理系统(源代码+数据库)088

基于SpringbootVue的宠物店猫咖管理系统(源代码数据库)088 一、系统介绍 本系统分为管理员、店长、用户三种角色 用户角色包含以下功能: 登录、注册、我的宠物、我的信息、文件管理、我的预约、门店详情、打工喵、本地喵、外来喵、宠物领养、个人中心、密码修改…

0基础学习VR全景平台篇 第61篇:基本功能-如何发布VR视频

戳我先了解“全景视频上传规范” 1、点击【上传】按钮,打开本地文件夹,上传符合要求的全景视频素材,可以选择单个或多个视频同时上传。 2、视频上传成功以后,需要处理一段时间,请耐心等待。 视频处理好以后&#xff0…

2023年7月最新ESI 中国 国内高校排名(附上下载链接),

东南大学的排名 多年来 一直是22, 21 ,还需要进一步提高,进入前10. 下载连接 (375条消息) 2023年7月最新ESI数据国内高校排名表格-行业报告文档类资源-CSDN文库

Vue3 组件之间跨级通信

文章目录 Vue3 组件之间跨级通信概述选项式API简单使用支持响应式调用顶层方法 组合式API简单使用支持响应式底层调顶层方法 Vue3 组件之间跨级通信 概述 通常情况下,当我们需要从父组件向子组件传递数据时,会使用props。 但是一些多层级嵌套的组件&a…

【Vue】给 elementUI 中的 this.$confirm、this.$alert、 this.$prompt添加按钮的加载效果

文章目录 主要使用 beforeClose 方法实现 loading 的效果beforeClose MessageBox 关闭前的回调,会暂停实例的关闭 function(action, instance, done)1. action 的值为confirm, cancel或close。 2. instance 为 MessageBox 实例,可以通过它访问实例上的属…

不外传秘诀| docker 快速搭建常用的服务环境

本文主要给大家介绍如何使用 docker 搭建常用的服务环境, 包括mysql,reedis,nginx,jenkins 等常用的环境,下面直接进入主题。 1、MySQL 部署 ①搜索 MySQL 镜像 docker search mysql ②拉取 MySQL 镜像 docker pull mysql:5.7 ③创建容器&#xf…

嵌入式LinuxLED驱动开发实验

目录: 1. Linux下LED灯的驱动原理1.1. 地址映射1.1.1. 实际物理地址映射到虚拟地址的函数1.1.2. 内存访问函数 2.硬件原理图分析3. 实验程序编写3.1. 驱动程序编写3.2. 应用程序编写 4. 运行测试 1. Linux下LED灯的驱动原理 我们在裸机实验的时候,都是通…

2023年最具威胁的25种安全漏洞(CWE TOP 25)

1. CWE 4.12发布 最近几年,每年6月CWE发布的版本都成为一年中最重要的版本,因为里面包含了新的CWE TOP 25 视图,也就是我们常说的:CWE最具威胁的25种缺陷。 CWE 4.12 在6月29号发布,里面包含了重要的2023年TOP25视图…

Promise分享

手写promise之前需要知道 宏任务 & 微任务 我们都知道 Js 是单线程的,但是一些高耗时操作就带来了进程阻塞问题。为了解决这个问题,Js 有两种任务的执行模式:同步模式(Synchronous)和异步模式(Asynchr…

2023年先进封装行业研究报告

第一章 行业概况 1.1 概述 封装是半导体制造过程中的一个重要步骤。在这个步骤中,半导体芯片(或称为集成电路)被包裹在一个保护性的外壳中。这个外壳的主要功能是保护芯片免受物理和化学损害,例如防止芯片受到潮湿、尘埃、温度变…

git clone 或者是vscode clone 时遇到the remote end hung up unexpectedly

fatal: the remote end hung up unexpectedly fatal: early EOF fatal: index-pack failed使用git clone总是报错 查看原因有三种可能:要么是缓存不够,要么是网络不行,要么墙的原因。 如果是网络不行,可以配置git的最低速度和最…

pdf.js移动端展示预览打开pdf-pdfh5.js

有问题可以加Q群咨询,技术交流群,也可以探讨技术,另有微信群可以问群主拉入微信群 QQ群521681398 pdfh5博客主页 pdfh5项目GitHub地址 pdfh5项目gitee地址 react、vue均可使用 example/test是vue使用示例 example/vue3demo是vue3使用示…

第三章系统控制(Cortex-M7 Processor)

第三章系统控制 目录 第三章系统控制 3.1关于系统控制 3.2寄存器汇总 3.3寄存器描述 3.3.1辅助控制寄存器 3.3.2cpu基寄存器 3.3.3 Cache Level ID寄存器 3.3.4缓存大小ID寄存器 3.3.5缓存大小选择寄存器 3.3.6指令和数据紧密耦合的存储器控制寄存器 3.3.7 AHBP控制寄存器 3…

2023京东防暑消暑市场分析:冷风扇、移动空调等硬核防暑产品火爆

今年夏天,高温天气频发,各种防暑类产品也向多场景延伸,不少行业、类目都因此高速增长,包括防暑类电器、防晒用品、小型户外避暑神器等。 *高温刺激下,防暑类家电需求暴涨 在夏季高温的刺激下,空调、风扇等等…

HTML input text 常用事件

前言 用于记录开发中常用到的&#xff0c;快捷开发 简单实例 <input type"text" name"noSecretKeyJson" maxlength"200" />常用事件 oninput &#xff08;在用户输入时触发&#xff09;及案例 案例一&#xff1a;限制只允许输入数字…

Java 函数式编程(常用接口)

之前已经介绍过了Java8函数式变成及Lambda表达式&#xff0c;感兴趣可以看看&#xff0c;地址&#xff1a;Java8函数式编程&#xff08;Lambda表达式&#xff09;_琅琊之榜PJ的博客-CSDN博客 本文主要介绍一下常用的接口及用法&#xff0c;先来看一个表格&#xff1a; 本文主要…

强引用、软引用、弱引用和虚引用的区别

主要的区别在于什么时候回收对象&#xff1b; 强引用&#xff1a;垃圾回收器就不会回收这个对象&#xff1b;软引用&#xff1a;如果内存足够&#xff0c;不回收&#xff0c;如果内存不足&#xff0c;则回收&#xff1b;弱引用&#xff1a;不管当前内存空间足够与否&#xff0…

Jupyter notebook添加与删除kernel

目录 1 添加虚拟环境的kernel 2 删除jupyter notebook已有的kernal 3 切换内核与查看当前内核 4 添加C语言的kernel 5 添加python2的kernel 6 添加java语言的kernel 6.1 sudo apt install default-jre 6.2 下载并安装 ijava 6.3 sudo apt install openjdk-11…

四、评估已建立的模型

别人不讲道理 不是我们跟着不讲道理的理由 1 模型评估 希望fθ(x)对未知数据x输出的预测值尽可能正确。 如何测量预测函数fθ(x)的正确性&#xff0c;也就是精度呢&#xff1f; 观察函数的图形&#xff0c;看它能否很好地拟合训练数据&#xff1a; 我们需要能够定量地表示机…

2022 JavaScript调查:TypeScript持续主导,Vite和Tauri大受欢迎

StateOfJS 最新发布了 2022 年 JavaScript 现状调查报告指出&#xff0c;Solid 和 Qwik 等新兴前端框架正在挑战 React 的权威。该报告基于对近 40,000 名 Web 开发人员的调查&#xff0c;数量几乎是去年的两倍。 JavaScript 可能发展得很快&#xff0c;但 JavaScript 开发人员…