GD32 支持IAP的bootloader开发,使用串口通过Ymodem协议传输固件(附代码)

   资料下载: https://download.csdn.net/download/vvoennvv/88713921

一、概述

       关于IAP的原理和Ymodem协议,本文不做任何论述,本文只论述bootloader如何使用串口通过Ymodem协议接收升级程序并进行IAP升级,以及bootloader和主程序两个工程的配置注意事项。

        实验板子主芯片:GD32F103C8T6

二,代码

1,Bootloader部分

主要流程如下:

     (1)上电开机之后,会先运行bootloader引导程序,bootloader检测串口是否有数据,超时没有收到收据会直接跳转进入主程序中,超时时间使用定时器设置,可根据产品需求和使用场景设置一个合理的超时时间。也可以通过检测按键是否按下,再进入这个检测串口是否有数据的步骤,这样更加灵活。

     (2)上位机将升级程序(bin文件)分包发送到设备,设备接收到数据之后进行校验,校验通过后写入到芯片,替换原有的旧程序,完成整个升级过程。

部分代码如下:

int main(void) 	
{   
    SystemInit(); 
    GPIO_Configuration();   //配置串口IO	
    FLASH_Unlock();         //解锁flash
    UART_Init();            //配置串口波特率,校验位等
    BspTim2Init();          //Timer 用于超时判断

    SerialPutString("\n\rbootloader\r\n");

    //进入bootloader后菜单选择,已取消显示,直接进入检测串口数据状态
    //如果3s之内没有选择,跳出,执行后面代码
    Main_Menu();            
    
    //通过判断栈顶地址值是否正确(是否在0x2000 0000 - 0x2000 2000之间)来判断是否应用程序已经下载了
    if (((*(__IO uint32_t*)ApplicationAddress) & 0x2FFE0000 ) == 0x20000000)
    {
        BspTim2Close();
        __disable_irq() ; 
        //跳转至用户代码
        JumpAddress = *(__IO uint32_t*) (ApplicationAddress + 4);
        Jump_To_Application = (pFunction) JumpAddress;

        //初始化用户程序的堆栈指针
        __set_MSP(*(__IO uint32_t*) ApplicationAddress);
        Jump_To_Application();
    }
    else
    {
        SerialPutString("no user Program\r\n\n");
    }

    while(1); 
}

void Main_Menu(void)
{
    FLASH_Status FLASHstatus;//定义一个flash操作状态变量
    uint8_t key = 0;
    static uint8_t uStatus = 0;
    BlockNbr = (ApplicationAddress - 0x08000000) >> 12;

 
#if defined (STM32F10X_MD) || defined (STM32F10X_MD_VL)
    UserMemoryMask = ((uint32_t)~((1 << BlockNbr) - 1));
#else /* USE_STM3210E_EVAL */
    if (BlockNbr < 62)
    {
        UserMemoryMask = ((uint32_t)~((1 << BlockNbr) - 1));
    }
    else
    {
        UserMemoryMask = ((uint32_t)0x80000000);
    }
#endif /* (STM32F10X_MD) || (STM32F10X_MD_VL) */
     //返回flash写保护选择字节的值
    if ((FLASH_GetWriteProtectionOptionByte() & UserMemoryMask) != UserMemoryMask)
    {
        FlashProtection = 1;
    }
    else
    {
        FlashProtection = 0;
    }

    /* Download user application in the Flash */
    SerialDownload();   //使用YModem协议接收app bin文件        

    SerialPutString("Auto jump App \r\n");
}

2,主程序部分

        主程序只需要增加两行代码即可,如下所示:

int main(void)
{
    // 主程序里,在main()前面增加下面两行代码即可
    // 把栈顶设置到0x3000,0x3000是主程序的烧录位置,也是bootloader跳转的位置
    // 这个位置可以根据实际情况统一调整
    nvic_vector_table_set(NVIC_VECTTAB_FLASH , 0x3000);
    __set_PRIMASK(0);
    

    systick_config();

    /* enable the LED clock */
    rcu_periph_clock_enable(RCU_GPIOB);
    /* configure LED GPIO port */ 
    gpio_init(GPIOB, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_8);
    /* reset LED GPIO pin */
    gpio_bit_reset(GPIOB, GPIO_PIN_8);

    while (1)
    {
        // app1 快闪
        gpio_bit_reset(GPIOB, GPIO_PIN_8);
        delay_1ms(500);
        gpio_bit_set(GPIOB, GPIO_PIN_8);
        delay_1ms(500);

        // app2 慢闪
        //gpio_bit_reset(GPIOB, GPIO_PIN_8);
        //delay_1ms(2000);
        //gpio_bit_set(GPIOB, GPIO_PIN_8);
        //delay_1ms(2000);
    }
}

三,工程配置

1,Bootloader部分

0x3000是分配给bootloader的空间,可根据实际情况修改。

2,主程序部分

Start填写0x08003000,是因为主程序烧录在这个位置,和分配给bootloader的空间有关。

增加

fromelf --bin -o "$L@L.bin" "#L"

这句,可以在编译时生成bin文件

四,测试

使用上位机软件(支持Ymodem协议的软件都可以),选择编译好的主程序(bin文件),在板子上电之后,通过串口发送过去即可。

 

资料下载: https://download.csdn.net/download/vvoennvv/88713921

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/299874.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

shell编程学习(二)

变量的类型 预定义变量 $$ 当前进程PID $? 命令执行后的返回状态.0 为执行正确&#xff0c;非 0 为执行错误 $# 位置参数的数量 $* 所有位置参数的内容 …

Next.js 第一次接触

因为需要整个漂亮的在线文档&#xff0c;所以接触了next.js&#xff0c;因为对前端js本身不够熟悉&#xff0c;别说对react.js 又不会&#xff0c;时间又不允许深入研究&#xff0c;所以&#xff0c;为了加一个导航菜单&#xff0c;极其痛苦。 有点小bug&#xff0c;不过不影响…

《EnlightenGAN: Deep Light Enhancement withoutPaired Supervision》论文超详细解读(翻译+精读)

前言 最近学习低照度图像增强时读到这篇EnlightenGAN的论文觉得写得很有意思&#xff0c;讲故事的手法也很值得小白写论文时模仿&#xff0c;今天就来带大家读一下~ 目录 前言 ABSTRACT—摘要 翻译 精读 一、INTRODUCTION—简介 翻译 精读 二、RELATED WORKS—相关工…

Joplin配合teracloud进行多版本客户端分别笔记同步

最近瞎搜索joplin&#xff0c;意外在github上搜到plugins&#xff0c;插件仓库&#xff0c;里面有一个思维导图的插件我还是蛮喜欢的&#xff0c;结果下载后安装发现&#xff0c;我当前的Jopin的版本如下 &#xff08;Joplin 2.7.15 (prod, win32) 同步版本: 3 配置文件版本: 4…

Linux Ubuntu 20.04.6 Intel WiFi6 Ax411 1690i Ax1690i Killer 解决无线网卡识别不出来问题

项目场景&#xff1a; 网卡型号&#xff1a;英特尔 Killer™ Wi-Fi 6E AX1690 i/s ubuntu 版本 uname -a Linux kuanli 5.15.0-91-generic #101~20.04.1-Ubuntu SMP Thu Nov 16 14:22:28 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux cat /proc/version Linux version 5.15.0-9…

MySQL忘记密码,如何重置密码(Windows)

1. 停止MySQL服务 打开“服务”管理工具&#xff08;可以在开始菜单搜索“服务”或运行 services.msc&#xff09;。 找到你的MySQL服务&#xff0c;可能叫别的&#xff0c;但是应该都是mysql开头的。 鼠标右键停止运行它。 2. 跳过权限表启动 MySQL 打开命令提示符&#x…

PyQT5+MySQL的学生信息管理系统【附源码,运行简单】

PyQT5MySQL的学生信息管理系统【附源码&#xff0c;运行简单】 总览 1、《PyQT5MySQL的学生信息管理系统》1.1 方案设计说明书设计目标需求分析工具列表 2、详细设计2.1 登录2.2 程序主页面2.3 学生新增界面2.4 学生更改界面2.4 学生删除界面2.5 其他功能贴图 3、下载 总览 自…

【好书推荐】ReactJS实践入门

作者简介 Chris Minnick是一位多产的作家、博主、培训师、演说家和Web工程师。他创立的WatzThis&#xff1f;公司&#xff0c;一直致力于寻找更好的方法向初学者教授计算机和编程技能。 Chris拥有超过25年的全栈开发经验&#xff0c;他也是一名教龄超过10年的培训师&#xff0c…

使用C#发送邮箱验证码

使用C#发送邮箱验证码 在很多应用程序中&#xff0c;我们需要使用邮箱来进行用户身份验证。其中一种常见的方式是通过发送验证码到用户的邮箱&#xff0c;然后要求用户输入该验证码进行验证。本文将介绍如何使用 C# 发送邮箱验证码。 声明 验证码登录没有用任何的工具&#…

linuxnodejs 20.* 安装问题,version `GLIBCXX_3.4.26‘

背景 今天服务器被重置拉&#xff0c;nodejs 环境不存在&#xff0c;特意安装下nodejs&#xff0c;一访问官网&#xff0c;妈呀&#xff0c;居然到20版本拉&#xff01;就尝试安装下最新版本&#xff01; 过程 $ cd /opt $ curl -OL https://nodejs.org/dist/v20.10.0/node-v2…

C++11_可变参数模版

文章目录 前言一、可变参数模版是什么&#xff1f;二、如何使用可变参数模版1.怎么解析可变参数模版2.可变参数模版的实际应用 总结 前言 C11 &#xff0c;添加了许多有用的功能&#xff0c;上章我们主要讲解了右值引用&#xff0c;这章我们来讲解可变参数模版的使用。 提示&a…

Spring之循环依赖底层源码(一)

文章目录 一、简介1. 回顾2. 循环依赖3. Bean的生命周期回顾4. 三级缓存5. 解决循环依赖的思路 二、源码分析三、相关问题1. Async情况下的循环依赖解析2. 原型Bean情况下的循环依赖解析3. 构造方法导致的循环依赖解析 一、简介 1. 回顾 前面首先重点分析了Spring Bean的整个…

如何使用 CMake 生成一个静态库

文章目录 tutorial_3/CMakeLists.txttutorial_3/src/CMakeLists.txtcmake_tutorial/tutorial_3/src/hello.cpptutorial_3/src/hello.h根目录的 CMakeLists.txtsrc 目录的 CMakeLists.txthello.cpp 和 hello.h构建过程总结 tutorial_3/CMakeLists.txt cmake_minimum_required(V…

excel3基础图标与透视图表的制作

业务需求1 给逾期金额也加上条形图,同时制作各个城市的逾期发展趋势 思路&#xff1a; 操作顺序&#xff1a;选中3列数据&#xff08;8月上旬逾期金额、8月中旬逾期金额和8月下旬逾期金额&#xff09;–开始–条件格式–数据条–渐变填充&#xff08;第5个&#xff09;&#xf…

厦门大学OpenHarmony技术俱乐部开创“1+N”新模式,加速推动产学研融合

12月29日,OpenHarmony技术俱乐部再添重将——在多方见证下,厦门大学OpenHarmony技术俱乐部在翔安校区益海嘉里楼报告厅正式揭牌成立,现场出席领导及师生代表近千人。 成立仪式现场 OpenHarmony技术俱乐部 携手厦门大学共绘开源生态新图景 OpenHarmony是由开放原子开源基金…

STM32F407ZGT6时钟源配置

1、26M外部时钟源 1、25M外部时钟源

cmd命令启动C# windows服务程序

因为Process.Manage.Service.exe程序为Windows服务程序&#xff0c;不能直接双击打开&#xff0c;所以需要借助windows系统自带InstallUtil.exe程序来启动它。 以管理员身份运行cmd命令控制台窗口 输入命令进入到InstallUtil.exe程序所在的文件夹 cd C:\Windows\Microsoft.NET…

[SAP ABAP] ABAP基础语法

ABAP(Advanced Business Application Programming)是一种编程语言&#xff0c;用于SAP软件的开发和定制 SAP ABAP是一种高级语言&#xff0c;主要用于在SAP平台上为大型企业和金融机构开发企业应用程序 1. ABAP基本语法结构 ABAP源程序由注释和ABAP语句组成&#xff0c;其中…

Linux内核组成

Linux内核的组成 /boot/vmlinuz-4.18.0-80.el8.x86_64 &#xff1a;启动时用到的内核 /lib/modules/4.18.0-80.el8.x86_64 &#xff1a;内核模块 /boot/initramfs-4.18.0-80.el8.x86_64.img &#xff1a;启动时提供必要的内核模块 kernel-core安装包里面包含了Linux内核启动…

Linux驱动学习—内核定时器

1、内核定时器 1.1 Linux内核定时器概念 不同于单片机定时器&#xff0c;LInux内核定时器是一种基于未来时间点的计时方式&#xff0c;以当前时刻来启动的时间点&#xff0c;以未来的某一时刻为终止点。比如&#xff0c;现在是10点5分&#xff0c;我要定时5分钟&#xff0c;那…