查看原文
其他

​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开发板!!!功能实用



     首先声明该程序并不是我写的,而是 havenxie 大佬写的。我们需要以下工程文件,boot文件夹是IAP的BootLoader引导程序,app文件夹是运行的应用程序demo,具体应用程序内容可根据自己的程序做修改,winapp文件夹是一个串口应用程序,可利用该软件实现iap升级功能。


    下面将具体介绍这三个工程:



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。


官方介绍:


app程序    很重要一点的是先设置app程序放置的起始位置

    此外打开system_stm32f1xx.c 文件,修改中断向量偏移量,注释上说明偏移量要是0x200的整数倍。我们修改和app的启动地址偏移一致0x3000.    但是一个完整的app程序不仅是能实现应用功能,还能有跳转回bootloader运行的能力。这里就不做详细介绍了,具体大家可以看源码,作者是通过正点原子的方法使用usmart.c实现。官方介绍:

winapp程序

    应用如上图所示,采用winform设计的,同时串口下载程序的协议采用YModem协议校验。


实验

我修改了一下源程序,添加了led_allon()与led_alloff();函数,以下是效果:

板子灯亮起来的。
最后

    正如作者所说,达到了无痛移植的效果,用起来十分舒服。再次十分感谢havenxie分享的源码,我在原文阅读中可点击访问其github主页,大家可以去其github主页下载程序。同时修改的程序,我将在公众号后台放出链接,大家复制文末的关键词链接到后台回复即可获得下载链接。

END


公众号ID:Tkwer望远镜
扫码关注最新动态

结束语

    好了,这里是公众号:“最后一个bug”,一个为大家打造的技术知识提升基地。同时非常感谢各位小伙伴的支持,我们下期精彩见!

推荐好文  点击蓝色字体即可跳转

【√】以后复位芯片,数据再也不会丢了(理论篇)

【涨知识】OS下的内存使用原来这么复杂

【原理分析】来看看惯性轮自平衡自行车实现原理

【重磅】剖析MCU的IAP升级软件设计(设计思路篇)

☞ 【典藏】别怪"浮点数"太坑(C语言版本)

GUI必备知识之“告别”乱码(浅显易懂)

【典藏】大佬们都在用的结构体进阶小技巧

【经典】把脉printf中的C进阶技巧

【典藏】自制小型GUI界面框架(设计思想篇)

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存