20-STM32+ESP8266+AIR202/302远程升级方案-扩展-移植远程升级包实现STM32F072+DTU远程升级单片机程序(基于STM32CubeMX)

<p><iframe name="ifd" src="https://mnifdv.cn/resource/cnblogs/ESA2GJK1DH1K_B/" frameborder="0" scrolling="auto" width="100%" height="1500"></iframe></p>

说明

当前很多用户也在使用STM32CubeMX开发单片机程序,

这节说明一下在STM32CubeMX的基础上移植进去远程升级程序.

注:所有STM32F0XXX系列的单片机请参考这节移植使用!

前要

在移植到别的单片机之前,用户需要对自己的单片机有如下的了解:

1.会使用Flash存储数据,是非常的了解Flash的使用!

2.知道怎么跳转程序运行!(这个都是固定的几句程序,找找资料)

3.会使用定时器.

以上缺一不可!

注:(基础知识不再重复,请用户从第一节开始看!)

因为是使用的DTU,请用户自行配置DTU连接自己的WEB服务器

可以配置成TCP模式,可以配置成我的服务器,先测试下

IP地址:  mnif.cn    端口号: 80

配置完成以后发送个指令

GET /1.txt HTTP/1.1\r\nHost: mnif.cn\r\n\r\n

然后会看到返回

 

 

 

 

 

 

 

快速使用

请把DTU或者模组配置为 IP地址:mnif.cn  端口号:80

并设置为透传模式!

串口1作为日志打印,串口2和DTU或模组通信

 

1.打开下面的BootLoader程序 和 用户程序 UserAPP

 

2. 用jlink 或者 ST-Link 下载BootLoader程序

 

 

 

2.打开用户程序 调整下APP用户程序配置(选择只擦除本身使用的部分)

 

 

3.下载程序

 

 

4.查看打印的日志

先运行BootLoader然后运行用户程序

用户程序每隔一段时间发送get指令获取 info.txt文件

 

 

 

5.单片机连接DTU或模组进行测试

已经配置好透传的DTU连接单片机的串口2

STM32 PA2  TX   ---  DTU  RX

STM32 PA3  RX   ---  DTU  TX

我配置了ESP8266模块作为了DTU 透传模式

 

 

6.查看串口1打印的日志

 

 

 

 

 

 

 

 

开始移植(BootLoader程序制作)

1.新建CubeMX 工程

 

 

 

 

 

 

 

 

 

 

2.配置两个串口,我串口1就负责打印日志,串口2负责和网络模组通信

串口1,我设置的115200

 

 

 

 

 

 

 

串口2,波特率根据自己的选择,我的模组是115200

 

 

 

 

 

 

3.打开看门狗

256分频,溢出值为 2340;  约15S

注:因为升级之前需要先擦除Flash,擦除Flash需要时间,所以我设置的15S

 

 

 

 

注:看门狗时钟为40KHz , 分频256 , 40000/256 = 156Hz ,  所以每累加156,为1S 

看门狗溢出时间 S = 156*(1,2,3,4...)     

我设置的15S,所以上面的值为 156*15 = 2340;

 

 

 

 

 

3.配置工程

 

 

 

 

4.让每个功能都生成单独的文件,最后点击生成工程

 

 

 

 

 

 

5.打开工程,或者自己去工程目录打开

 

 

 

 

 

 

6.把移植文件放到自己的工程

 

 

7.工程添加两个Group

注意:在工程名上右键选择 Add group 这种方式添加!另一种方式会卡住.一个bug

 

 

 

 

 

 

8.添加头文件

 

 

9.编译下工程

 

 

 

 

10.修改为自己单片机的头文件包含

 

 

 

 

 

11.然后再编译一下,如果出现以下数据类型没有定义

 

 

 

12.最简单的方式是在自己的 stm32fxxxx.h的头文件里面加入

typedef uint32_t u32;
typedef uint16_t u16;
typedef uint8_t u8;

typedef __IO uint32_t vu32;
typedef __IO uint16_t vu16;
typedef __IO uint8_t vu8;

 

 

 

 

 

13.编译一下(替换自己的复位重启程序)

 

 

 

 

14.把自己的延时1ms函数放到此处

 

 

 

 

15.替换自己的请求文件发送函数(发送GET协议),

注:假设DTU配置好了透传模式.(我使用的串口2,根据自己的修改)

只要往串口发送数据,数据就直接发送给了服务器.

如果自己的程序文件是https访问的,请自行编写https方式发送数据的方式.

 

 

 

 

16.关闭自己在BootLoader程序里面使用的所有中断

 

 

 

 

17.修改stmflash.c文件里面的实现程序(根据自己的单片机修改)

读写半字

 

 

 

指定地址写入指定长度的半字数据

 

 

写一个半字,并加入判断写入的是否正确

 

指定地址读取指定长度的半字数据

 

擦除页

注意1:假设需要擦除20KB,BootLoader会传进来20.

BootLoader里面只是传进来需要擦除的KB数.

如果自己的单片机是以1024字节一页,那么此函数直接控制擦除20页即可.

如果自己的单片机是以2048作为一页,那么此函数就应该擦除10页!

所以源码里面有一句 if(STM_SECTOR_SIZE==2048){PageCnt=PageCnt/2;}

 

注意2:擦除成功请返回 4

 

 

 

 

 

18.在stmflash.h文件中修改flash大小

 

 

 

19.在主程序里面写上以下程序

 

 

 

 

注:如果使用的是DTU,DTU已经连接了服务器,所以屏蔽掉需要自己实现连接的部分 AutoConnectTCP()

 

 

 

20.把 IAPTimerOut(); 函数放到1ms定时器中断函数里面

我放到了滴答定时器里面

 

 

 

 

 

 

 

 

 

 

21.重定向printf打印(可以没有,最好有!)

注:假设使用的串口1作为日志打印,根据自己的修改

 

 

 

 

 

 

注:最好使用缓存+中断的方式发送

 

22.上面是阻塞方式发送的printf数据,需要屏蔽下面的部分

 

 

 

 

23,把 IAPPutDataToLoopList(char Res); 和 IAPHttpHead(char Res);

函数放到和模块通信的串口中断接收里面

 

 

 

 

 

24.BootLoader已经移植完成,编译,下载查看下打印的日志

 

 

 

 

注:上面显示的是默认访问的下载路径.

 

我预期是把程序文件放到服务器的下面的目录,bin文件名字为 user_crc.bin

所以上面才会那样写哦

 

 

 

修改BUG

1.HAL库主循环执行起来比基础库慢....增加点缓存(或者修改主循环时钟频率)

 

 

 

 

2.STM32F072系列的单片机无法强制的把 char型 数组 映射为 u16型数组 (会死机)

 

 

 

死机位置:

 

 

 

 

 

 

制作用户程序

1.新建一个工程(配置串口1,2)

 

 

 

 

 

 

2.工程名字为 UserAPP

 

 

 

3.打开看门狗

256分频,溢出值为 780;  约5S

 

 

 

3.让每个功能都生成单独的文件,最后点击生成工程

 

 

 

 

 

 

4.把BootLoader工程里面的文件拷贝到UserAPP工程

 

 

 

 

 

 

 

 

 

 

5.添加上类型定义

 

typedef uint32_t u32;
typedef uint16_t u16;
typedef uint8_t u8;

typedef __IO uint32_t vu32;
typedef __IO uint16_t vu16;
typedef __IO uint8_t vu8;

 

 

6.修改IAP.h文件,里面的宏定义

 

 

 

 

7.屏蔽

 

 

 

 

8.取消屏蔽

型号和info.txt文件的下载地址(根据自己的情况修改)

 

我预期是把程序文件放到服务器的下面的目录,info文件名字为 info.txt

所以上面才会那样写哦

 

 

提醒:用户如果学习了前面的章节应该知道升级的流程哈

info.txt文件内容:

{"version":"0.0.1","size":15990,"url":"http://mnif.cn/ota/hardware/STM32F072DTU/user_crc.bin","info":"1.解决了部分BUG
2.优化了部分程序"}

 

用户程序访问 info.txt文件,获取版本号,如果和自己的版本号不一致,再获取size (程序文件大小)

url (程序文件下载地址)

然后存储到flash,置位一下升级标志,其余的就交给BootLoader了

 

9.根据BootLoader先前打印的信息调整用户程序

 

 

 

 

 

 

 

 

 

 

 

 

 

 

10.在主函数里面添加以下函数

IAPInfoPathInit();

IAPUpdateDispose();

注意:根据前面的说明,实际中最好应该确保用户程序执行一段时间没有问题以后

再调用 IAPUpdateDispose();函数

 

 

 

 

 

 

 

 

11.此时编译下工程

 

 

 

 

12.报错原因

 

 

 

咱们把48个中断地址强制放在了RAM的 0x200000000的开始地址上了.

软件编译的时候,有些变量也放到了这个地址上,然后软件就报冲突错误.

设置下RAM的偏移,让程序里面的变量从偏移的地址开始存放

 

 

 

 

测试下程序是否可以工作起来(使用Jlink 或 ST-link下载器)

1.我在用户程序里面加了些打印的信息

 

别忘了加喂狗 HAL_IWDG_Refresh(&hiwdg); 

我上面的截图忘了加了.

 

 

 

2.先用下载器下载BootLoader程序

 

 

 

 

3.调整下APP用户程序配置(选择只擦除自己使用的部分)

 

 

 

4.下载APP用户程序

 

 

 

 

5.查看日志(先运行BootLoader 然后接着运行用户程序)

 

 

 

 

 

远程升级准备工作

提示:

info.txt文件内容:

{"version":"0.0.1","size":15990,"url":"http://mnif.cn/ota/hardware/STM32F072DTU/user_crc.bin","info":"1.解决了部分BUG
2.优化了部分程序"}

 

用户程序访问云端的 info.txt文件,获取版本号,如果和自己的版本号不一致,再获取size (程序文件大小),url (程序文件下载地址)

然后调用IAPSetFileSize(u32 data) 和 IAPResolveUrl(char* ch) 函数

把文件大小和url存储到flash, 然后调用一下置位升级标志函数  IAPSetUpdateFlage();

最后执行复位  IAPResetMCU();  其余的就交给BootLoader了.

 

1.在用户程序里面使用get指令获取info.txt文件数据,并解析服务器返回的数据(串口2)

注:info.txt文件格式

{"version":"0.0.1","size":15990,"url":"http://mnif.cn/ota/hardware/STM32F072DTU/user_crc.bin","info":"1.解决了部分BUG
2.优化了部分程序"}

 

2.重新编译下载APP用户程序

串口2每隔10S发送get指令

 

 

 

 

3.用户程序修改固件版本

 

 

 

 

 

4.配置生成bin文件,编译下工程

 

 

 

E:\MDK5\ARM\ARMCC\bin\fromelf.exe  --bin -o  .\user.bin  .\UserAPP\UserAPP.axf

前面的路径根据自己的修改

 

将会在工程目录生成user.bin文件

 

 

 

 

 

5.打开OTA Tools 软件,生成带有CRC校验的bin文件

 

 

 

 

在同一级目录生成 user_crc.bin

 

 

 

12.把生成的 user_crc.bin放到服务器上

 

 

 

 

 

 

13.还差一个info.txt文件,我准备了一个模板

1.打开这个模板

 

 

2.版本号和刚才上传上去的APP用户程序保持一致

 

 

 

3. size和OTA Tools生成的保持一致

 

 

 

 

 

4.url和bin文件在服务器的下载路径保持一致

 

 

 

 

 

5.把info.txt也放到服务器上

 

 

 

 

 

注:info.txt文件在服务器的位置其实是要和这里的路径保持一致

 

 

 

 

测试远程升级

1.已经配置好透传的DTU连接单片机的串口2

STM32 PA2  TX   ---  DTU  RX

STM32 PA3  RX   ---  DTU  TX

我配置了ESP8266模块作为了DTU 透传模式

 

 

 

2.查看串口1打印的日志

 

 

 

 

 

 

 

 

 

 

 

 

 

3.如果更新失败,会提示更新失败原因,可以根据原因查找问题所在.

 

 

 

 

posted on 2020-11-02 14:19  广源时代  阅读(1279)  评论(0编辑  收藏  举报

导航

支付宝 QQ群