c++ win32 获取串口高低电平_STM32F103 IAP在线升级通过串口升级

STM32F103 IAP在线升级通过串口升级

        ↑ 点击上方,关注“Tkwer望远镜”

9545b429-b61a-eb11-8da9-e4434bdf6706.jpeg

                                         作者:Tkwer

公众号:Tkwer望远镜

  前言

    有很多种IAP在线应用升级固件的方法,具体可以参照bug菌写的文章: 【重磅】剖析MCU的IAP升级软件设计(设计思路篇)     下面我将从STM32F103RXT6这块板子进行实验,这板子已完全硬件开源可访问此篇文章获取设计文件: 【自制分享】分享一块自制STM32F103RETX开发板!!!功能实用 9645b429-b61a-eb11-8da9-e4434bdf6706.gif      首先声明该程序并不是我写的,而是 havenxie 大佬写的。我们需要以下工程文件,boot文件夹是IAP的BootLoader引导程序,app文件夹是运行的应用程序demo,具体应用程序内容可根据自己的程序做修改,winapp文件夹是一个串口应用程序,可利用该软件实现iap升级功能。

9845b429-b61a-eb11-8da9-e4434bdf6706.png

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

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。

官方介绍:

9945b429-b61a-eb11-8da9-e4434bdf6706.png

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

9a45b429-b61a-eb11-8da9-e4434bdf6706.png

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

winapp程序

9c45b429-b61a-eb11-8da9-e4434bdf6706.png

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

实验

9d45b429-b61a-eb11-8da9-e4434bdf6706.gif

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

9f45b429-b61a-eb11-8da9-e4434bdf6706.gif

板子灯亮起来的。 最后

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

END

a045b429-b61a-eb11-8da9-e4434bdf6706.jpeg公众号ID:Tkwer望远镜扫码关注最新动态

提供源文件,公众号内回复即可获取:IAP升级源码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值