其他
STM32F103 IAP在线升级通过串口升级
Editor's Note
前面为大家简单讲解过stm32官方的IAP代码思路,这里推荐一篇功能方面更加全面的IAP例程,大家感兴趣可以到github上下载学习!
The following article is from Tkwer望远镜 Author Tkwer
STM32F103 IAP在线升级通过串口升级
↑ 点击上方,关注“Tkwer望远镜”公众号:Tkwer望远镜
前言
有很多种IAP在线应用升级固件的方法,具体可以参照bug菌写的文章:【重磅】剖析MCU的IAP升级软件设计(设计思路篇)下面我将从STM32F103RXT6这块板子进行实验,这板子已完全硬件开源可访问此篇文章获取设计文件:【自制分享】分享一块自制STM32F103RETX开发板!!!功能实用
下面将具体介绍这三个工程:
boot程序
第一个是boot程序,我们知道stm32可以通过设置boot0,boot1使stm32启动从System memory启动,在厂家提供的BootLoader中,提供了串口下载程序的固件,可以通过这个BootLoader将程序下载到系统的Flash中。具体看之前写的文章: 【IAP更新设备】STM32CubeProgrammer DFU功能实现设备固件升级 但是我们可以牺牲一点flash,写一个新的bootloader固化再flash地址前面。这样我们不用每次都得通过设置boot0,boot1才能进行烧录,每次都在Flash memory启动,但是又通过bootloader检查是否有应用程序,这种方式在一些远程升级更加常用。
int main(void)
{
IAP_Init();
while(1)
{
switch(IAP_ReadFlag())
{
case APPRUN_FLAG_DATA://jump to app
if( IAP_RunApp())
IAP_WriteFlag(INIT_FLAG_DATA);
break;
case INIT_FLAG_DATA://initialze state (blank mcu)
IAP_Main_Menu();
break;
case UPDATE_FLAG_DATA:// download app state
if( !IAP_Update())
IAP_WriteFlag(APPRUN_FLAG_DATA);
else
IAP_WriteFlag(INIT_FLAG_DATA);
break;
case UPLOAD_FLAG_DATA:// upload app state
// if( !IAP_Upload())
// IAP_WriteFlag(APPRUN_FLAG_DATA);
// else
// IAP_WriteFlag(INIT_FLAG_DATA);
break;
case ERASE_FLAG_DATA:// erase app state
IAP_Erase();
IAP_WriteFlag(INIT_FLAG_DATA);
break;
default:
break;
}
}
}
IAP_ReadFlag()与IAP_WriteFlag()函数是程序运行状态读写函数,利用了备用寄存器存取片子上一阶段的状态,即掉电也会保存该数据。例如,通常我们在上次已烧写应用程序进去,下次上电可以直接运行app,不用再运行Bootloader。可以通过IAP_WriteFlag()写入标志,下次运行通过IAP_ReadFlag()读取标志,直接跳转运行app程序。其他同理。
/* Define the APP start address -------------------------------*/
#define ApplicationAddress 0x8003000
上面一行代码是需要设置app程序存储的起始地址。bootloader程序存储在0x8000000~0x8002FFF。
官方介绍:
winapp程序
实验
最后
正如作者所说,达到了无痛移植的效果,用起来十分舒服。再次十分感谢havenxie分享的源码,我在原文阅读中可点击访问其github主页,大家可以去其github主页下载程序。同时修改的程序,我将在公众号后台放出链接,大家复制文末的关键词链接到后台回复即可获得下载链接。
END
扫码关注最新动态
结束语
好了,这里是公众号:“最后一个bug”,一个为大家打造的技术知识提升基地。同时非常感谢各位小伙伴的支持,我们下期精彩见!
推荐好文 点击蓝色字体即可跳转