单片机中OTA升级流程及bootload软件框架

为什么要进行OTA升级

OTA 英文全称是Over-the-Air Technology,即空间下载技术,是通过移动通信(GSM或CDMA)的空中接口对SIM卡数据及应用进行远程管理的技术。在我们常用的电子设备中,通过会进行软件优化或者固件升级,这个时候我们的产品可能已经在全国各地,不可能亲自去进行固件升级,所以就需要利用OTA技术进行升级。

OTA升级的流程

这里的升级流程框架我是按照我之前的一个项目写的,该项目中所用单片机的FLASH大小为128K,其中包含我的FLASH分配,和APP和BOOTLOAD对于升级流程实现
在这里插入图片描述

bootload软件框架

这里主要是bootload代码的实现框架和一些具体的细节问题,可以和下面的后面的代码部分相结合阅读。
在这里插入图片描述

bootload软件源码(针对接收HEX文件)

这里我就只放一下IAP的头文件和源文件
#ifndef _IAP_H_
#define _IAP_H_
#include "stm32f10x.h"

#define FlashBaseAddress              0x08000000
#define ApplicationAddress    			0x8003000
#define ApplicationSize							0xD000						// 52KB
#define ApplicationBackup						(ApplicationAddress + ApplicationSize)
typedef  void (*pFunction)(void);

#define UPGRADE_FLAG_START	    				((uint16_t)0x1010)
#define UPGRADE_FLAG_RECV_COMPLETE				((uint16_t)0x2020)
#define UPGRADE_FLAG_END						((uint16_t)0x3030)	// 注意如果没有读到0x600的值也视为已经完成

extern volatile uint8_t updateFinished;
extern uint32_t maxProgramAdd;

void jumpToApplication(void);//跳转到APP程序

uint8_t IsUpgradeStarted(void);//开始Bootload升级标记
uint8_t IsUpgradeRecEnd(void);//接收Bootload升级标记
uint8_t IsUpgradeComplete(void);Bootload升级完成标记

uint8_t EraseFlash(uint32_t baseAddress);//擦除FLASH
uint8_t WriteUpgradeFlag(uint16_t flagValue);//写半字
uint8_t WriteMaxProgramAddress(uint32_t address);//写OTA接收程序最大地址
uint8_t readMaxProgramAddress(uint32_t* addressValue);//读OTA接收程序最大地址
static uint8_t MassCopy(void);//根据程序大小,从Application备份区拷贝到Application区
uint8_t copyApplication(void);//擦除Application区,从备份区拷贝新程序到Application区

uint8_t HEX_File_Parsing(uint8_t * data,uint8_t len);//Hex文件解析

#endif
#include "iap.h"
#include "Flash.h"
#include "EEPROM.h"
#include "stdio.h"
pFunction Jump_To_Application;
uint32_t JumpAddress;
uint32_t maxProgramAdd=0;
volatile uint8_t updateFinished = 0;
void jumpToApplication(void)//跳转到APP程序
{
//	__set_PRIMASK(1);
//	__DSB();
//    __ISB();
//    SysTick->CTRL = 0;
	if (((*(__IO uint32_t*)ApplicationAddress) & 0x2FFE0000 ) == 0x20000000)       
	{
			JumpAddress = *(__IO uint32_t*) (ApplicationAddress + 4);                 
			Jump_To_Application = (pFunction) JumpAddress;                             
			__set_MSP(*(__IO uint32_t*) ApplicationAddress);                           
			Jump_To_Application();                                                                 
	}
}

uint8_t IsUpgradeStarted(void)
{
	uint16_t FlashData;
	uint8_t FreshStatus=readSysU16(0x600,&FlashData);
	
	if(FreshStatus==0 && FlashData == UPGRADE_FLAG_START)
	{
		return 0;
	}
	return 1;	
}

uint8_t IsUpgradeRecEnd(void)
{
	uint16_t FlashData;
	uint8_t FreshStatus=readSysU16(0x600,&FlashData);
	FreshStatus |= readMaxProgramAddress(&maxProgramAdd);
	if(FreshStatus==0 && FlashData == UPGRADE_FLAG_RECV_COMPLETE)
	{
		return 0;
	}
	return 1;
}
uint8_t IsUpgradeComplete(void)
{
	uint16_t FlashData;
	uint8_t FreshStatus=readSysU16(0x600,&FlashData);
	
	if(FreshStatus==0 && FlashData == UPGRADE_FLAG_END)
	{
		printf("\r\n升级成功了!");
		return 0;
	}
	return 1;	
}

/**
  * @brief  擦除ApplicationSize大小的Flash
  * @param  None
  * @retval None
  */
uint8_t EraseFlash(uint32_t baseAddress) 
{
	uint8_t flashStatus = 0;
	for (uint32_t i = 0; i < ApplicationSize; i+=PAGE_SIZE)
	{
		flashStatus = FLASH_ErasePage(baseAddress + i);
		if (flashStatus != FLASH_COMPLETE) 
			return flashStatus;
	}
	return 0;
}

/**
  * @brief  Writes/upadtes variable data in EEPROM.
  * @param  flagValue: new value
  * @retval Success or error status:
  *           - 0: Success
  *           - PAGE_FULL: if valid page is full
  *           - NO_VALID_PAGE: if no valid page was found
  *           - Flash error code: on write Flash error
  */
uint8_t WriteUpgradeFlag(uint16_t flagValue) 
{
	uint8_t error = writeSysU16(0x0600, flagValue);
	return error == FLASH_COMPLETE ? 0 : error;
}
/**
  * @brief  Writes/upadtes variable data in EEPROM.
  * @param  flagValue: new value
  * @retval Success or error status:
  *           - 0: Success
  *           - PAGE_FULL: if valid page is full
  *           - NO_VALID_PAGE: if no valid page was found
  *           - Flash error code: on write Flash error
  */
uint8_t WriteMaxProgramAddress(uint32_t address) 
{
	uint8_t error = writeSysU16(0x0601, (u16)(address >> 16));
	if (error == FLASH_COMPLETE) error = writeSysU16(0x0602, ((u16)(address & 0xFF)));
	return error == FLASH_COMPLETE ? 0 : error;
}
/**
  * @brief  Returns the last stored max programAddress
  * @param  addressValue: Global variable contains the read variable value
  * @retval Success or error status:
  *           - 0: if variable was found
  *           - 1: if the variable was not found
  *           - NO_VALID_PAGE: if no valid page was found.
  */
uint8_t readMaxProgramAddress(uint32_t* addressValue) 
{
	u16 hb,lb;
	u8 flashStatus = readSysU16(0x0601, &hb) || readSysU16(0x0602, &lb);
	*addressValue = (((u32)hb) << 16) | lb;
	if (flashStatus == 0 && *addressValue > ApplicationAddress && *addressValue < ApplicationAddress + ApplicationSize) {
		return 0;
	}
	return 1;
}
/**
	* @brief  根据程序大小,从Application备份区拷贝到Application区
  * @param  None
  * @retval None
  */
static uint8_t MassCopy(void) 
{
	uint8_t flashStatus = 0;
	for (uint32_t i = 0; i <= (maxProgramAdd - ApplicationAddress); i+= 2)
	{
		flashStatus = FLASH_ProgramHalfWord(ApplicationAddress + i, readFlashU16(ApplicationBackup + i));
		if (flashStatus != FLASH_COMPLETE) return flashStatus;
	}
	return 0;
}
/**
	* @brief  擦除Application区,从备份区拷贝新程序到Application区
  * @param  None
  * @retval None
  */
uint8_t copyApplication(void) 
{
	uint8_t Error = 0; 
	
	printf("\r\n 开始擦除APP!");
	Error = EraseFlash(ApplicationAddress);
	if(Error)
		return (Error); 
	
	Error = MassCopy();
	if(Error)
		return (Error);
	
	Error = WriteUpgradeFlag(UPGRADE_FLAG_END);  // 擦除bootloader标志
	updateFinished = 1;
	return Error;
}

//Hex文件解析
uint8_t HEX_File_Parsing(uint8_t * data,uint8_t len)
{
	/*数据格式::|LL|aaaa|TT|data|CC|
	** :冒号 HEX文件每一行首字节都是由冒号开头
	** LL:数据域长度
	** AAAA:地址域
	** TT:类型域 00数据记录 
				  01文件结束记录 
				  02扩展段地址记录
				  03开始段地址记录
				  04扩展线性地址记录 
				  05开始线性地址记录
	** data:数据域
	** CC:校验
	*/
	uint8_t i;
	uint8_t crctotal=0;
	uint8_t flashStatus=0;
	uint16_t Flashdata=0;
	
	if(data[0]!=0x3A)//开头是不冒号
	{
		printf("\r\n error1");
		return 1;
	}
		
	
	for(uint8_t i=1;i<len-1;i++)//hex文件校验和
	{
		crctotal+=data[i];
	}
	if(crctotal!=(uint8_t)(0x100-data[len-1]))//crc校验不通过
	{
		printf("\r\n error2");
		return 1;
	}
		
	if(data[4]==0x04)//04扩展线性地址记录
	{
		uint32_t Freshaddress=(data[5]<<8)+data[6];
		if(Freshaddress!=0x0800)
			return 1;
	}
	else if (data[4]==0x00)//00数据记录
	{
		uint32_t Freshaddress=FlashBaseAddress + ((data[2]<<8)+data[3]);//这里应该是APP的地址
		
		maxProgramAdd=Freshaddress+data[1];//最大地址等于 目前最新地址+该行数据长度
		
		if(maxProgramAdd>=ApplicationBackup && maxProgramAdd<= ApplicationAddress)//如果地址越界
		{
			printf("\r\n error3");
			return 1;
		}
					
		for(i=0;i<data[1];i+=2)
		{
			uint32_t WriteAdree=Freshaddress+i;
	
			Flashdata=data[6+i]<<8;//半字高8位
			Flashdata+=data[5+i];//半字低8位
//			printf("\r\n要写的数据是%x",Flashdata);
//			printf("  要写的地址是%x",WriteAdree);
//			printf("\r\n要写的地址是%x",ApplicationBackup + (WriteAdree - ApplicationAddress));
			flashStatus = FLASH_ProgramHalfWord(ApplicationBackup + (WriteAdree - ApplicationAddress),Flashdata);
		
			if (flashStatus != FLASH_COMPLETE)
			{
				printf("\r\n error4 %d",flashStatus);
				return flashStatus;
			}			
		}
	}

	return 0;
}

如果看完有帮助的可以点赞收藏一下,还有不懂的可以直接联系我哦~
【AutoSAR】【BootLoader】升级流程
专注汽车软件开发、AutoSAR、车载以太网、SOA、EE架构。
06-28 1563
STM32 OTA升级流程 内含其他通信例程
09-15
STM32 OTA升级流程 内含其他通信例程
单片机MCU OTA升级技术
Mr.Liu
04-23 6339
云端OTA通知推送云端只会给当时在线设备推送;对于当时不在线,或者没升级成功的设备,云端会每天推送一次。 MCU OTA:包括下载、存储、校验、传输4个过程。下载、存储、校验同GAgent OTA一样;传输:通知MCU有固件传输,并分片传输给MCU,每片需要进行sum校验,传输完成后MCU需要进行MD5校验。MCU成功后重启GAgent,以让GAgent重新握手获取更新后的MCU信息。 M...
STM32OTA升级方案
最新发布
Norgin_1的博客
07-28 2703
1、在DMA空闲回调函数里直接烧写flash没有norflash缓冲,程序直接跑飞不可取。2、在Load_SYS_User(SYS_START_ADDR);加载到APP分区之前,没对BOOT分区初始化的外设去初始化,导致进入到APP后出现各种异常。3、接收的数据包的数量换算,很容易算错。
Android OTA在线升级一(架构分析)
热门推荐
huryjiang的专栏
05-22 1万+
1、前言     OTA(Over-the-Air Technology)空下载技术。是通过移动通信(GSM或CDMA)的空接口对SIM卡数据及应用进行远程管理的技术。空接口可以采用WAP、GPRS、CDMA1X及短消息技术。OTA技术的应用,使得移动通信不仅可以提供语音和数据服务,而且还能提供新业务下载。这样,应用及内容服务商可以不受平台的局限,不断开发出更具个性化的贴近用户需求的服务,
STM32单片机OTA程序升级
hurryddd
11-28 1万+
目录 一、程序升级原理 1、本地应用程序更新 2、固件升级命令响应 和 升级固件下载 二、RT-Thread STM32通用Bootloader + ota_downloader软件包oat升级 1、使用环境 2、RT OAT软件架构 3、STM32通用Bootloader 功能及使用 4、制作包含ota下载器功能的app 5、打包app待升级固件 一、程序升级原理 IAP...
ESP32 OTA升级框架
qinrenzhi的博客
04-03 1513
ESP32 SPI Flash 内有与升级相关的(至少)四个分区:OTA data、Factory App、OTA_0、OTA_1。其 FactoryApp 内存有出厂时的默认固件。 首次进行 OTA 升级时,OTA Demo 向 OTA_0 分区烧录目标固件,并在烧录完成后,更新 OTA data 分区数据并重启。 系统重启时获取 OTA data 分区数据进行计算,决定此后加载 OTA_...
51单片机实现OTA功能
unbelivabIe的博客
06-21 1497
本人目前用的方案是将两个程序放在一起,框图如图1所示。图1实现OTA的思路为将两个程序放入同一个单片机,用户程序断向量表位置为0,用户程序的Main函数位置为0x100,OTA函数的断向量表位置为0xF000,Main函数位置为0xF100,由于51单片机没有断向量表偏移的功能,所以本文通过修改跳转地址来实现断向量表偏移。项目使用的51单片机断向量表如图2所示。图2。
单片机实现bootloader功能
weixin_42549534的博客
07-24 2399
Bootloader是指系统启动的第一段代码,位于计算机或嵌入式设备的非易失性存储器(如闪存、EPROM等)。它负责初始化硬件设备、加载操作系统内核,并将控制权传递给内核的入口点,开始系统的正常运行。Bootloader的主要功能包括以下几个方面:硬件初始化:Bootloader负责初始化计算机或设备的硬件设备,包括处理器、内存、外设等。这些初始化操作确保系统硬件处于正确的状态,并为后续的操作做好准备。引导加载:Bootloader从存储介质(如闪存)读取操作系统内核的镜像,并将其加载到内存
设备OTA升级原理
嵌入式系统程序员
04-23 1733
1. 背景 没有完美的软件,因为设计缺陷、业务需求更新,软件始终都在不断升级完善。新软件如何替换正在运行的旧软件就是本文关注的重点,尤其是针对电子产品,设备空升级OTA,受限于硬件资源,需要选择不同的方案进行软件升级。 2. 空升级流程 在线升级流程,简化就是设备运行旧软件的同时,获取新软件包,再执行特殊操作使用新软件覆盖旧软件,最后运行新软件。 根据硬件资源和系统整体框架,选择不同的升级方案。 3. 空升级的方案 3.1. 整包升级 以STM8单片机升级为例,单片机最小系统运行流程如下: 要加入在线
单片机Bootloade更新程序
03-01
在使用单片机进行做项目的时候,需要对现有的单片机进行代码的更新,这里就是使用Bootloade方式升级程序(IAP串口方式)
stm32单片机通过串口更新程序工具(附操作说明).rar
09-19
stm32单片机通过串口更新程序工具(附操作说明),需要通过usb转ttl或232模块更新
单片机自编程及bootloader设计
12-18
描述单片机bootloader的基本设计,包括了bootloader的底层设计流程步骤。
OTA升级流程1
08-03
OTA(Over-the-Air)升级流程是智能设备更新其固件或软件的一种常见方法,它允许设备通过网络接收新版本的软件,而无需物理接触。在这个过程,设备通常与一个OTA服务器进行通信,以获取升级文件并进行验证。以下是...
Android OTA升级流程
01-21
以下详细介绍了Android OTA升级流程的关键技术点和步骤。 首先,OTA升级流程的开始通常是从设备接收到更新通知开始的。这可能发生在用户手动检查更新时,或者系统在后台自动检查到有可用的更新。在确认有新版本...
Android-OTA升级流程资料
02-18
Android-OTA升级流程是Android系统提供的一种标准软件升级方式,通过空下载技术(Over-the-Air Technology)实现设备的远程升级。整个升级流程可以分为三个阶段:生成升级包、下载升级包、安装升级包。 1. ...
RK \hisi \ OTA 升级,差分升级
07-21
以下为OTA升级代码。包括打基础包脚本,OTA升级脚本,CPATCH与DPATCH。等源码。
STM32_通过Ymodem协议进行蓝牙OTA升级固件教程
w237838的博客
12-17 5310
作为单片机进阶能力,IAP升级固件的学习是非常重要的。想直接看如何操作的从第三条开始看。IAP,全称是“In-Application-Programming”,文解释为“在程序编程”。IAP是一种对通过微控制器的对外接口如:USART,IIC,CAN,USB,以太网接口甚至是无线射频通道等对正在运行程序的微控制器进行内部程序的更新的技术。与IAP同级的其它两种下载方式是ISP和ICP。ICP:使用SWD接口进行烧录,如J-Link烧录器和J-Flash软件配合使用。ISP。
[单片机框架][上位机][Python+PySide2] Dfu升级工具(串口升级+Jlink烧录)
jianqiang.xue
02-13 1154
环境: python 3.6.8 编译: .\make.bat main.py 安装命令: pip install xxx 依赖:PySide2, pyserial, pyinstaller, pylint, 其余根据提示安装。 ├─ui              存放UI文件 │ └─qss   &nb...
Android-OTA升级流程资料及Recovery模式概述
Android-OTA升级流程是一种通过空下载技术对安卓系统进行升级的方式。它是通过Recovery模式来实现的,Recovery模式是安卓系统的一种特殊模式,允许对内部数据或系统进行修改。Android系统提供了RecoverySystem工具...
写文章

热门文章

  • BUCK/BOOST电路 67831
  • GPIO口模拟IIC--适用于任何ARM系列单片机 8210
  • HK航顺芯片HSE时钟问题 6469
  • C++:字符串的定义方式 6282
  • “2 个重载中没有一个可以转换所有参数类型” ;编译错误:“EasyX is only for C++” 6224

分类专栏

  • stm32中常用的驱动代码 7篇
  • 常用电路学习和应用 1篇
  • MDK ERROR 2篇
  • 数据结构 2篇
  • STM32学习 10篇
  • git 1篇
  • C++ 16篇
  • C语言 11篇
  • 开关电源 1篇
  • stm32常见问题 2篇
  • FREERTOS 1篇
  • vs studio 2篇
  • #C++ Error 2篇

最新评论

  • 短按开机/长按关机的电路和代码实现思路

    送外卖的CV工程师: 博主 你好,如果输入5V或者3.7V,可以将图中的电阻全部设置为10K吗

  • stm32驱动sh36730x的驱动代码

    宠溺22: 可以分享吗

  • stm32驱动MCP2515芯片,项目已通过测试

    Htick: 可以参考一下这个 https://github.com/ShenQiu-1999/mcp2515-driver

  • stm32驱动MCP2515芯片,项目已通过测试

    lyglary: 可以分享下代码吗?大神?lyglary@126.com,多谢

  • stm32驱动MCP2515芯片,项目已通过测试

    lyglary: 可以分享下代码吗?大神?273164608@qq.com,多谢

大家在看

  • 如何用麦肯锡方法分析问题和解决问题? 1343
  • 【Webpack--011】配置开发和生产模式的webpack.config.js 670
  • WebLogic 靶场攻略
  • 掌握Python虚拟环境:隔离项目依赖,提升开发效率的必备指南 813
  • 花8000元去培训机构学习网络安全值得吗,学成后就业前景如何?

最新文章

  • stm32驱动MCP2515芯片,项目已通过测试
  • 短按开机/长按关机的电路和代码实现思路
  • MDK错误:error: #268: declaration may not appear after executable statement in block
2023年1篇
2022年54篇
2020年1篇

目录

目录

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_LiuChunJiang刘春江

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或 充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

玻璃钢生产厂家常州玻璃钢雕塑厂天全玻璃钢花盆花器宣武区商场组合玻璃钢花盆恩施玻璃钢人物雕塑玻璃钢花盆制作经过商场美陈安装逾期嘉陵玻璃钢造型雕塑柳州玻璃钢草莓雕塑河北景观玻璃钢雕塑加工济宁玻璃钢小熊雕塑青岛人物玻璃钢雕塑定制小区玻璃钢雕塑厂家哪家好宁德玻璃钢头像雕塑玻璃钢花盆定制哪里买肇庆玻璃钢卡通雕塑制作驿城玻璃钢雕塑价格人物玻璃钢雕塑怎么制作商场虎年新年美陈滁州多彩玻璃钢雕塑黄南玻璃钢雕塑制作厂家玻璃钢雕塑漆效果安徽玻璃钢雕塑工厂郑成功玻璃钢人物雕塑价格饶阳玻璃钢造型雕塑温州玻璃钢雕塑询问报价盐池玻璃钢雕塑销售北京室内商场美陈批发玻璃钢雕塑厂家制作厂南阳玻璃钢卡通雕塑多少钱江苏玻璃钢雕塑批发香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化