前言

  此代码兼容STM32F103全系列

  为避免添加上升级程序造成内存不足,请使用128KB Flash及其以上的型号

  这篇文章是为了能够让大家快速移植我的升级模板程序到自己的项目

BootLoader 程序制作

  拷贝文件到自己的项目

    

    

  拷贝到自己的项目(我准备了一个工程作为叙述)

    

    

在自己工程的定时器里面添加以下信息

  

    if(IAPStructValue.PutDataFlage && IAPStructValue.UpdateFlage)IAPStructValue.DownloadTimeout++;
else IAPStructValue.DownloadTimeout=; IAPStructValue.MainTimeout++;

在自己工程的主函数添加如下信息

  

  

#include "IAP.h"

IAP();

IAPLoadAPPProgram();
IAPDownloadTimeoutFunction();
IAPMainTimeoutFunction();
IAPWriteData();

大家把当前的程序下载到单片机,然后看一下串口1的打印信息

  

    

  user1ROMStart: 0x8004000   用户程序1 Flash存储的开始地址
  user1ROMSize : 0x5c00        用户程序1 程序大小

  user2ROMStart: 0x8009c00   用户程序2 Flash存储的开始地址
  user2ROMSize : 0x5c00         用户程序2 程序大小

  大家可以在下面这个文件根据自己的芯片进行设置

    

  

  所选芯片Flash大小:这个根据自己的芯片设置

  BootLoader程序大小: BootLoader程序产生的bin文件大小

              假设自己的BootLoader程序的bin文件大小是 15K

            则可以设置上面的值 为16,18,20等

              假设自己的BootLoader程序的bin文件大小是 20K

            则可以设置上面的值 为22,24,26等

  存储用户数据所用Flash大小: 这个根据自己需要的设置,

            但是必须设置,因为咱升级的时候也需要记录数据

            可以是2,4,6,8等等等等

  设置好以后系统便会根据大家的设置打印出来APP用户程序的信息

  当前Flash存储分配如下图

    

    

  BootLoader程序占用 16KB

  两份用户程序各占23KB,

  第一份APP用户程序从0x08004000开始存储

  第二份APP用户程序从0x08009C00开始存储

  剩余的2KB用来存储其它信息

然后接着说

这节我就用串口来模拟一下

1.每隔3S询问下升级信息

2.串口调试助手需要返回的升级信息格式

{"version":"1.0.456","SumBin1":103,"SumBin2":244}

前面是版本号,后面两个是两份程序文件的校验和(下一节会说明校验和怎么获取值)

然后需要把信息交给 IAPVersionDispose 函数处理

3.大家需要进入 IAPVersionDispose 函数添加一些内容

4.因为我是用串口模拟的,所以我直接这样写

5.测试

在发送给模块升级信息以后,模块先提取升级信息里面的版本号

如果和当前的不一致,再尝试提取bin文件的校验和

然后,接着发送询问哪一份文件的指令

6.需要在串口中断中写上以下程序

以下程序就是把接收的程序写到环形队列里面

主循环会提取里面的数据,然后写到flash里面

if(IAPStructValue.PutDataFlage && (IAPStructValue.PutDataFlage^IAPStructValue.Overflow))//可以往环形队列里面写数据,同时没有溢出
{
if(PutData(&rb_tIAP,NULL,&Res,) == -) //&Res :为数据地址 1:写一个数据,可以写多个
{
IAPStructValue.Overflow = ;//环形队列溢出
}
}

IAPStructValue.PutDataFlage  是允许写入的标志

这个标志是在这里允许的

7.还需要做个处理

在程序接收超时(接收完成)的地方写上

因为我是用的串口接收数据,所以如果串口进入了空闲中断

我就认为程序接收完了

说一下流程

其实现在就需要把对应的程序文件发给单片机了

不过咱还没有制作好用户程序,所以需要到下一节再接着测试步骤

现在看细节处理

虽然我的升级模板可以保证可靠的把程序写入Flash并且如果检测有问题则自动切换到上一份程序运行,

但是需要避免另一件事情(用户程序本身执行了一段时间以后出问题了.....)

结果造成了不停的重启....

解决方案是利用一个按钮

我一直按着那个按钮.

在进入BootLoader程序的时候,我检测下那个按钮是不是按下了,如果按下了就不尝试加载用户程序了

但是咱还需要控制程序重新升级

按下按钮超过3S,

指示灯快闪,

松开按钮,

快闪3S后,写入升级标志,清除版本号,重启

BootLoader判断有升级标志,则不会尝试加载用户程序

就会执行获取升级信息->获取程序文件

然后就完成了重新升级

大家会有疑惑,如果运行了用户程序怎么控制升级呢???

其实用户程序可以定时获取下程序版本,如果不一致,就置位一下升级标志,然后重启即可

提醒

  越往后我的源码基本上都再次做了封装!

  我只告诉大家如何使用我的源码,使用哪些接口!

  大家想研究我的源码,就去看前面几节

  

补充

  在前面的升级程序中串口里面是这样写的

  

void USART1_IRQHandler(void)//串口1中断服务程序
{
u8 Res;
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
{
Res =USART_ReceiveData(USART1); //读取接收到的数据 Usart1ReadBuff[Usart1ReadCnt] = Res; //接收的数据存入数组
Usart1ReadCnt++;
if(Usart1ReadCnt > Usart1ReadLen -)//防止数组溢出
{
Usart1ReadCnt = ;
}
Usart1IdleCnt = ; if(HttpDataStartFlage)
{
//可以往环形队列里面写数据,同时没有溢出
if(IAPStructValue.PutDataFlage && (IAPStructValue.PutDataFlage^IAPStructValue.Overflow))
{
if(PutData(&rb_tIAP,NULL,&Res,) == -)
{
IAPStructValue.Overflow = ;//环形队列溢出
}
}
} //解析http数据-------------------------------Start
//HTTP/1.1 200 OK
if(!HttpHeadOK && IAPStructValue.PutDataFlage)
{
if(Res=='H' && HttpHeadCnt==)HttpHeadCnt++;
else if(Res=='T' && HttpHeadCnt==)HttpHeadCnt++;
else if(Res=='T' && HttpHeadCnt==)HttpHeadCnt++;
else if(Res=='P' && HttpHeadCnt==)HttpHeadCnt++;
else if(Res=='/' && HttpHeadCnt==)HttpHeadCnt++;
else if(Res=='' && HttpHeadCnt==)HttpHeadCnt++;
else if(Res=='.' && HttpHeadCnt==)HttpHeadCnt++;
else if(Res=='' && HttpHeadCnt==)HttpHeadCnt++;
else if(Res==' ' && HttpHeadCnt==)HttpHeadCnt++;
else if(Res=='' && HttpHeadCnt==)HttpHeadCnt++;
else if(Res=='' && HttpHeadCnt==)HttpHeadCnt++;
else if(Res=='' && HttpHeadCnt==)HttpHeadCnt++;
else if(Res==' ' && HttpHeadCnt==)HttpHeadCnt++;
else if(Res=='O' && HttpHeadCnt==)HttpHeadCnt++;
else if(Res=='K' && HttpHeadCnt==){HttpHeadOK = ;HttpHeadCnt=;HttpDataLength=;}
else
{
HttpHeadCnt=;
}
} #ifdef UserContentLength
//Content-Length: XXXXXXXX
if(HttpHeadOK && !HttpDataLengthOK)//获取http发过来的数据个数
{
if(Res=='-' && HttpHeadCnt==) HttpHeadCnt++;
else if(Res=='L' && HttpHeadCnt==)HttpHeadCnt++;
else if(Res=='e' && HttpHeadCnt==)HttpHeadCnt++;
else if(Res=='n' && HttpHeadCnt==)HttpHeadCnt++;
else if(Res=='g' && HttpHeadCnt==)HttpHeadCnt++;
else if(Res=='t' && HttpHeadCnt==)HttpHeadCnt++;
else if(Res=='h' && HttpHeadCnt==)HttpHeadCnt++;
else if(Res==':' && HttpHeadCnt==)HttpHeadCnt++;
else if(Res==' ' && HttpHeadCnt==)HttpHeadCnt++;
else if(HttpHeadCnt>= && HttpHeadCnt<= )//最大99999999个字节. 16:99999999 17:999999999 18:9999999999
{
if(Res!=0x0D)
{
HttpDataLength = HttpDataLength* + Res - '';
HttpHeadCnt++;
}
else
{
HttpDataLengthOK = ;
HttpHeadCnt = ;
}
}
else
{
HttpHeadCnt = ;
}
} if(HttpHeadOK && HttpDataLengthOK && HttpDataLength && !HttpHeadEndOK)
#else
if(HttpHeadOK && !HttpHeadEndOK)
#endif
{//0D 0A 0D 0A
if(Res==0x0D && HttpHeadCnt==)HttpHeadCnt++;
else if(Res==0x0A && HttpHeadCnt==)HttpHeadCnt++;
else if(Res==0x0D && HttpHeadCnt==)HttpHeadCnt++;
else if(Res==0x0A && HttpHeadCnt==){HttpHeadEndOK = ;}
else HttpHeadCnt = ;
} if(HttpHeadEndOK == )//http数据的head已经过去,后面的是真实数据
{
HttpHeadEndOK=;
HttpHeadCnt = ;
HttpDataLengthOK=; HttpDataStartFlage=;
}
//解析http数据-------------------------------end }
}

  其实大家应该明白为什么这样写

  毕竟是http访问,会有数据头,上面就是为了去掉数据头

ESA2GJK1DH1K升级篇: 快速的移植升级程序到自己的项目(BootLoader程序制作)的更多相关文章

  1. ESA2GJK1DH1K升级篇: 快速的移植升级程序到自己的项目(APP用户程序制作)

    前言 用户程序比较简单,但是起着至关重要的作用 用户程序是和BootLoader程序相互配合的 拷贝文件到自己的项目 APP用户程序的 stmflash.c stmflash.h 和 上一节的Boot ...

  2. ESA2GJK1DH1K升级篇: STM32远程乒乓升级,基于(Wi-Fi模块AT指令TCP透传方式),MQTT通信控制升级

    实现功能概要 前面的版本都是,定时访问云端的程序版本,如果版本不一致,然后下载最新的升级文件,实现升级. 这一节,在用户程序里面加入MQTT通信,执行用户程序的时候,通过接收MQTT的升级命令实现升级 ...

  3. ESA2GJK1DH1K升级篇: STM32远程乒乓升级,基于GPRS模块(Air202,SIM800)AT指令TCP透传方式,MQTT通信控制升级

    实现功能概要 这节和上一节的功能一样(只不过上节是利用Wi-Fi模块,这节是利用GPRS模块) 用户程序里面加入MQTT通信,执行用户程序的时候, 通过接收MQTT的升级命令实现升级. 凡是可以实现M ...

  4. ESA2GJK1DH1K升级篇: STM32远程乒乓升级,基于Wi-Fi模块AT指令TCP透传方式,MQTT通信控制升级(含有数据校验)-APP用户程序制作过程

    前言 这一节和上一节是搭配的 给大家鱼,也必须给鱼竿! 我期望自己封装的代码,无论过了多少年都有应用的价值! 这节说明一下制作APP用户程序的过程 咱是用MQTT通信控制模块实现升级,所以首先自己的程 ...

  5. ESA2GJK1DH1K升级篇: STM32远程乒乓升级,基于WIFI模块AT指令TCP透传方式,定时访问升级(含有数据校验)

    实现功能概要 定时使用http访问云端的程序版本,如果版本不一致,然后通过http下载最新的升级文件,实现升级. 测试准备工作(默认访问我的服务器,改为自己的服务器,请看后面说明) 一,下载BootL ...

  6. ESA2GJK1DH1K升级篇: STM32远程乒乓升级,升级流程源码详细说明

    前言 1.BootLoader程序,升级简要流程图 2.其实主要的就是把程序文件写入环形队列,然后环形队列取出来数据写入Flash 3.用户程序,简要流程图 下面的读一下,有个印象就可以: 说白了就是 ...

  7. ESA2GJK1DH1K升级篇: STM32远程乒乓升级,基于(WIFI模块AT指令TCP透传方式),定时访问升级

    前言 学习此代码所需: 实现功能概要 定时使用http访问云端的程序版本,如果版本不一致,然后通过http下载最新的升级文件,实现升级. 测试准备工作(默认访问我的服务器,改为自己的服务器,请看后面说 ...

  8. ESA2GJK1DH1K升级篇: STM32远程乒乓升级,基于GPRS模块AT指令TCP透传方式,定时访问升级(含有数据校验)

    实现功能概要 单片机定时使用http访问云端的程序版本,如果版本不一致, 然后通过http下载最新的升级文件,实现远程升级STM32程序. 兼容Air202 ,SIM800 测试准备工作(默认访问我的 ...

  9. ESA2GJK1DH1K升级篇: STM32远程乒乓升级,基于(GPRS模块AT指令TCP透传方式),定时访问升级(兼容Air202,SIM800)

    实现功能概要 单片机定时使用http访问云端的程序版本, 如果版本不一致,然后通过http下载最新的升级文件,实现远程升级STM32. 兼容Air202,SIM800 测试准备工作(默认访问我的服务器 ...

随机推荐

  1. 后端必备的 Git 分支开发规范指南 转

    原文链接 作者:稻草叔叔 http://juejin.im/post/5b4328bbf265da0fa21a6820 点击上方 "后端技术精选",选择 "置顶公众号&q ...

  2. IDEA不能读取配置文件,springboot配置文件无效、IDEA resources文件夹指定

  3. 【Java面试题】short s1 = 1; s1 = s1 + 1;有错吗?short s1 = 1; s1 += 1;有错吗?

    昨天去面试,虽然体验不是很好, 但是看到了这个面试题,当时感觉无从下手,所以在这里记录一下. 解决这道题之前,先复习一下Java的基本数据类型转换规则,以便后面对面试题的理解. java的基本数据类型 ...

  4. 【LOJ#3144】[APIO2019]奇怪装置(数论)

    [LOJ#3144][APIO2019]奇怪装置(数论) 题面 LOJ 题解 突然发现\(LOJ\)上有\(APIO\)的题啦,赶快来做一做. 这题是窝考场上切了的题嗷.写完暴力之后再推了推就推出正解 ...

  5. python随机选取目录下的若干个文件

    个人记录用. python模块random argparse shutil import argparse parser = argparse.ArgumentParser() parser.add_ ...

  6. c# sqlserver 删除大批量数据超时

    我做的项目有个功能需要进行批量删除,删除的数据量有4.5W条数据. 通过下面的sql语句删除这么多数据,直接导致结果超时,无法删除数据. ,,,......) 我查了一些资料,可能找的不全,找到了一个 ...

  7. charles注册码及中文版本,支持window和mac

    安装证书: 安装完证书之后设置代理 2个* ,代表全部 注册码: Registered Name: https://zhile.io License Key: 48891cf209c6d32bf4 破 ...

  8. 如何down掉IB交换机口

    服务器上找到需down的网络:ip a 通过ib命令iblinkinfo找到对应交换机以及在ib交换机上对应端口号 登录IB交换机,并通过命令:config进入配置模式 通过命令:port进入端口配置 ...

  9. JS-21点游戏

    //21点游戏 let readline=require("readline-sync"); //清屏函数 let clear=()=>process.stdout.writ ...

  10. 倒计时3天!i春秋四周年盛典狂欢,钜惠不停

    六月注定是不平凡的 感恩父亲节 父爱如山亦如海 难忘毕业季 青春无悔不散场 嗨购618 优惠福利送不停 更值得期待的是 在这个不平凡的六月 迎来了i春秋四周年庆典 当周年庆遇到618 会擦出怎样的火花 ...