STM32_使用Bootloade升级程序(IAP方式)

引言

在我们把产品封装到了机器里面之后,当需要升级代码就变得很麻烦了,就要拆外壳,连接烧写器才能进行代码的升级,比如是买出去的产品,那更新就变得更加麻烦了,所以造成代码升级就变得非常麻烦。所以就有了一种新的更新程序的方法(IAP)。使用了该方式的单片机产品,只要在最开始预留了“SD卡”或者“串口接口”就能简单的进行程序的升级更新了。这里我们使用对“串口”更新程序的方式进行步骤讲解。

一、思路简介

首先我们理出一条思路,就如手机一样,我们在开机的时候长按某个键就能进行系统的升级一样,这里我们就按着这个思路,做一个单片机进行IAP升级程序的思路:

(1)Bootloader程序

首先我们需要在单片机里面写一个程序,这个程序(Bootloader)的功能是:

没有按下+
被按下
单片机上电+
按键被按下了吗??+++
跳转到程序代码区++
单片机接收电脑的串口数据+++
覆盖旧程序的方式写入单片机Flash里++++
运行功能代码+
(2)更新的程序

然后下面就是我们要更新程序了,这个首先需要单片机直接跳转到“跳转到程序代码区”的Flash进行程序的运行,功能是:

单片机上电+
跳转到程序代码区++
运行功能代码+

二、代码具体实现方法

(1)Bootloader程序具体实现方法
num位为0+
num位为1+
Key被按下++
Key没有按下++
通电+
if判断Key被按下为低电平?+++
while循环+
打开uart2串口接收,使代码更新标志位:num=1++++
if判断num代码更新标志位为0吗?+++
通过iap_load_app函数跳转到程序地址执行++++
电脑通过串口把bin文件发送给单片机+++
if判断Key被按下为低电平??+++
单片机把DATA缓存的串口数据通过iap_write_appbin函数覆盖旧代码的方式写入单片机Flash里+++++++++
返回循环+
运行程序功能代码++

具体代码展示:
在这里插入图片描述

(2)运行的程序具体实现方法

在这里插入图片描述

三、例程的实际操作

文件下载链接: https://download.csdn.net/download/qq_26043945/82885061

(1)操作第一步烧录(旧程序)

为了模拟真实情况,我们先用下载器烧录(旧程序)。打开工程文件 “ LED每1000毫秒闪一次(旧程序) ” ,在烧录前设置IROM1的Start为:0x8020000 ;设置IROM1的Size为:0x20000 ,然后使用烧写器进行代码烧录即可。
在这里插入图片描述

(2)操作第二步烧录(Bootloader程序)

1.Bootloader程序只会在单片机通电的时候运行一次,它的功能为:判断Key是否按下?假如:①Key按下,就打开串口,然后电脑把新程序通过串口发送给单片机,然后再按下Key键,单片机则把接收的数据覆盖掉原来 0x8020000 的(旧程序),最后跳转到Flash的 0x8020000 地址执行覆盖后的新程序。
2.打开工程文件 “ Bootloader程序 ” ,在烧录前设置IROM1的Start为:0x8000000 ;设置IROM1的Size为:0x40000 ,然后使用烧写器进行代码烧录即可。
在这里插入图片描述

(3)操作第三步对“替换程序”生成bin文件

打开工程文件 “ LED每100毫秒闪一次(替换程序) ” ,并且设置IROM1的Start为:0x8020000 ;设置IROM1的Size为:0x20000
在这里插入图片描述

在下面设置:C:\Keil_v5\ARM\ARMCC\bin\fromelf.exe --bin -o D:\xxxx\xxxx\xxxx\LED.bin D:\xxxx\xxxx\xxxx\LED.axf (注意:xxxx\xxxx\xxxx 是按你工程的位置进行填写),然后编译该工程后,就会生成bin文件,在该工程下面找到bin文件。
在这里插入图片描述

(4)第四步单片机进入程序升级界面

单片机在通电前长按Key键(PC15拉低),单片机打开了串口接收等待数据接收,通电几秒后松开Key键,这时把bin文件通过电脑串口把文件发送给单片机。
在这里插入图片描述
电脑发送bin文件后,再次按下Key键,则完成了程序的更新。单片机LED程序:由1000ms闪烁变成每100ms闪烁。
参考文档-正点原子视频

  • 21
    点赞
  • 122
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
好的,下面给您提供GD32 Bootloader的教程: 1. 准备工作 首先,您需要安装好STLink驱动程序和串口调试助手,可以从官网上下载并安装。然后,您还需要准备一块GD32开发板,以及一根USB线和一根串口线。 2. 编写Bootloader程序 要编写Bootloader程序,您需要了解GD32的启动方式和Flash存储器的使用方法。您可以参考GD32的数据手册和参考手册,了解这些知识。 然后,您需要编写一个Bootloader程序,该程序可以从Flash存储器中加载应用程序,并跳转到应用程序的入口地址。以下是一个简单的示例程序: ```c #include "gd32f1x0.h" #define APP_ADDRESS 0x08004000 void jump_to_app(uint32_t app_addr) { uint32_t sp_addr = *(volatile uint32_t *)app_addr; uint32_t pc_addr = *(volatile uint32_t *)(app_addr + 4); __set_MSP(sp_addr); __set_PSP(sp_addr); __DSB(); ((void (*)(void))pc_addr)(); } int main(void) { /* Check if the user button is pressed to enter the bootloader mode */ if (GPIO_INPUT_BIT_GET(GPIOA, GPIO_PIN_0) == RESET) { /* Wait for the user button to be released */ while (GPIO_INPUT_BIT_GET(GPIOA, GPIO_PIN_0) == RESET); /* Jump to the application */ jump_to_app(APP_ADDRESS); } /* Run the bootloader */ while (1) { /* TODO: Implement the bootloader */ } } ``` 这个程序会检查用户按钮是否被按下,如果按下就跳转到应用程序的入口地址,否则就运行Bootloader程序。 3. 烧录Bootloader程序 现在,您可以使用STLink将Bootloader程序烧录到GD32的Flash存储器中了。具体的步骤可以参考STLink的使用说明书。烧录完成后,您可以使用串口调试助手测试Bootloader程序是否正常运行。 4. 编写应用程序 接下来,您需要编写一个应用程序,并将其烧录到Flash存储器中。您可以使用GD32的编译器和开发工具,或者使用其他的工具进行开发。编写完成后,将应用程序烧录到应用程序的入口地址即可。 5. 测试 现在,您可以测试Bootloader程序是否正常运行。按下用户按钮,Bootloader程序会跳转到应用程序的入口地址,应用程序开始运行。如果您需要更新应用程序,只需要将新的应用程序烧录到Flash存储器中,然后重启设备即可。 希望这个教程对您有所帮助!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qq_755682240

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值