0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Bootloader万能实现逻辑

冬至子 来源:RTThread物联网操作系统 作者:Cfly 2023-06-07 17:50 次阅读

一般 Bootloader 实现的逻辑如下:

image.png

这种方式适合于简单的裸机程序或可控的 OS 程序(即所有外设硬件都可把控),在准备环境的时候将其全部关闭。

但对于一些复杂的或者 OS 中轮子已造好的程序,有一些因素不花时间研究无法把控,在准备环境时很可能就会遗漏一些未关闭导致出各种各样的问题。

这里提供一种 万能 方法:

  • 利用芯片中的不受软件复位影响的可供用户使用的寄存器 (如 STM32 中的备份寄存器)。
  • 在需要跳入 APP 运行时将该寄存器赋值然后软件复位。
  • 在 OS 还没初始化时判断该寄存器值,如果需要跳转只需要简单的准备环境即可跳转。

image.png

该方法可以使 Bootloader 就作为一个 OS 应用程序开发,需要跳转的时候就操作一下寄存器并软件复位即可。

该仓库下所有的 Bootloader 例子均使用此方法。

以正点原子探索者开发板的 STM32F4 为例,将 system_stm32f4xx.c 文件的 SystemInit 函数修改:

void boot_start_application(void);
2void SystemInit(void)
3{
4  boot_start_application();

boot_start_application的实现为:

typedef void (*boot_app_func)(void);
 2void boot_start_application(void) {
 3    __HAL_RCC_PWR_CLK_ENABLE();
 4    HAL_PWR_EnableBkUpAccess();
 5    RTC_HandleTypeDef RTC_Handler = {0};
 6    RTC_Handler.Instance = RTC;
 7    uint32_t bkp_data = HAL_RTCEx_BKUPRead(&RTC_Handler, BOOT_BKP);
 8    HAL_RTCEx_BKUPWrite(&RTC_Handler, BOOT_BKP, 0);
 9    if (bkp_data != 0xA5A5) return;
10    boot_app_func app_func = NULL;
11    uint32_t app_addr = BOOT_APP_ADDR;
12    if (((*(__IO uint32_t *)(app_addr + 4)) & 0xff000000) != 0x08000000) return;
13    /* 栈顶地址在 128K RAM 间 */
14    if (((*(__IO uint32_t *)app_addr) - 0x20000000) >= (STM32_SRAM_SIZE * 1024)) return;
15    app_func = (boot_app_func) * (__IO uint32_t *)(app_addr + 4);
16    /* Configure main stack */
17    __set_MSP(*(__IO uint32_t *)app_addr);
18    /* jump to application */
19    app_func();
20}

设置寄存器并软件复位的实现为:

static void boot_app_enable(void) {
2    __disable_irq();
3    RTC_HandleTypeDef RTC_Handler = {0};
4    RTC_Handler.Instance = RTC;
5    HAL_RTCEx_BKUPWrite(&RTC_Handler, BOOT_BKP, 0xA5A5);
6    HAL_NVIC_SystemReset();
7}
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 寄存器
    +关注

    关注

    31

    文章

    5356

    浏览量

    120562
  • bootloader
    +关注

    关注

    2

    文章

    235

    浏览量

    45642
  • STM32F4
    +关注

    关注

    3

    文章

    194

    浏览量

    28082
  • 裸机
    +关注

    关注

    0

    文章

    39

    浏览量

    6396
收藏 人收藏

    评论

    相关推荐

    万能板的连线问题

    有哪位大虾有万能板的连线经验
    发表于 10-27 09:46

    自作万能充电宝

    自作万能充电宝,可AC220V输入充电,AC220V有直接输出5VUSB接口。可5v输入充电,还可太阳充电。有蓄电池供电,由USB输出5V。 还可给电池充电,有万能电池座。万能电池座
    发表于 11-03 11:45

    电子万能试验机与液压万能试验机的区别

      电子万能材料试验机主要采用伺服电机作为动力源,丝杠、丝母作为执行部件,实现试验机移动横梁的速度控制。在传动控制上,目前主要有两种形式,同步带 和减速机。国内来说,长春地区的试验机厂家多采用同步带
    发表于 07-04 16:06

    万能电池怎么使用?

    排线式万能电池由:通用规格的电芯,高质量柔性排线,接触点(多是三点接触点),附件(包括绝缘垫片,包装纸等)组成。
    发表于 10-21 09:02

    怎样去设计基于STM32的红外万能遥控器

    连载目录:01、基于STM32的红外万能遥控器完整教程视情况更新。。。基于STM32的红外万能遥控器完整教程一、概述实现的功能参考文档二、项目的逻辑三、硬件主控模块接线方式四、代码结构
    发表于 08-16 06:49

    如何去实现一种基于STM32的万能红外遥控器设计呢

    如何去实现一种基于STM32的万能红外遥控器设计呢?怎样去设计基于STM32的万能红外遥控器的软硬件呢?
    发表于 11-15 07:03

    中星微万能驱动下载

    中星微万能驱动下载
    发表于 01-11 23:02 19次下载
    中星微<b class='flag-5'>万能</b>驱动下载

    winxp万能声卡驱动,程序下载

    winxp万能声卡驱动 尊敬的用户,本万能
    发表于 04-21 19:23 538次下载
    winxp<b class='flag-5'>万能</b>声卡驱动,程序下载

    万能遥控器设置方法_万能遥控器代码

    电视是每个家庭必不可少的家用电器,所以我们在使用遥控器的时间也会比较多。但如果遥控器换了怎么办,很多人都会想到配一个万能遥控器,那么万能遥控器怎么设置,它的万能
    发表于 09-14 18:08 18.8w次阅读
    <b class='flag-5'>万能</b>遥控器设置方法_<b class='flag-5'>万能</b>遥控器代码

    万能协议通信工具

    万能协议通信工具分享
    发表于 11-18 11:47 14次下载

    万能转换开关原理_万能转换开关结构

    本文首先阐述了万能转换开关原理,其次介绍了万能转换开关技术特点,最后介绍了万能转换开关结构。
    发表于 12-09 10:16 1w次阅读

    万能转换开关选型_万能转换开关使用

    本文主要介绍了万能转换开关选型方法及万能转换开关的使用。
    发表于 12-09 10:30 4371次阅读

    万能驱动下载链接.txt

    万能驱动下载链接.txt
    发表于 12-30 14:12 0次下载

    什么是单臂万能试验机?

    关于万能试验机的试样,单臂万能试验机只不过是万能试验机试样的其中一种,在目前的万能试验机市场中,试验机老二认为万能试验机最为畅销的式样还有立
    的头像 发表于 03-03 11:01 843次阅读
    什么是单臂<b class='flag-5'>万能</b>试验机?

    Bootloader 万能实现逻辑

    仓库地址: https://github.com/loogg/agile_upgrade_mcu_demos 一般 Bootloader 实现逻辑如下: 这种方式适合于简单的裸机程序或可控的 OS
    的头像 发表于 04-20 04:55 592次阅读
    <b class='flag-5'>Bootloader</b> <b class='flag-5'>万能</b><b class='flag-5'>实现</b><b class='flag-5'>逻辑</b>