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

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

3天内不再提示

Bootloader 万能实现逻辑

RTThread物联网操作系统 来源:未知 2023-04-20 04:55 次阅读

仓库地址:

https://github.com/loogg/agile_upgrade_mcu_demos

一般 Bootloader 实现的逻辑如下:

5a93a02c-def4-11ed-bfe3-dac502259ad0.png

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

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

这里提供一种 万能 方法:

- 利用芯片中的不受软件复位影响的可供用户使用的寄存器 (如 STM32 中的备份寄存器)。

- 在需要跳入 APP 运行时将该寄存器赋值然后软件复位。

- 在 OS 还没初始化时判断该寄存器值,如果需要跳转只需要简单的准备环境即可跳转。

5ab3e9e0-def4-11ed-bfe3-dac502259ad0.png

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

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

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

1voidboot_start_application(void);
2voidSystemInit(void)
3{
4boot_start_application();

boot_start_application的实现为:

 1typedefvoid(*boot_app_func)(void);
 2voidboot_start_application(void){
 3__HAL_RCC_PWR_CLK_ENABLE();
 4HAL_PWR_EnableBkUpAccess();
 5RTC_HandleTypeDefRTC_Handler={0};
 6RTC_Handler.Instance=RTC;
 7uint32_tbkp_data=HAL_RTCEx_BKUPRead(&RTC_Handler,BOOT_BKP);
 8HAL_RTCEx_BKUPWrite(&RTC_Handler,BOOT_BKP,0);
 9if(bkp_data!=0xA5A5)return;
10boot_app_funcapp_func=NULL;
11uint32_tapp_addr=BOOT_APP_ADDR;
12if(((*(__IOuint32_t*)(app_addr+4))&0xff000000)!=0x08000000)return;
13/*栈顶地址在128KRAM间*/
14if(((*(__IOuint32_t*)app_addr)-0x20000000)>=(STM32_SRAM_SIZE*1024))return;
15app_func=(boot_app_func)*(__IOuint32_t*)(app_addr+4);
16/*Configuremainstack*/
17__set_MSP(*(__IOuint32_t*)app_addr);
18/*jumptoapplication*/
19app_func();
20}

		
设置寄存器并软件复位的实现为:
1staticvoidboot_app_enable(void){
2__disable_irq();
3RTC_HandleTypeDefRTC_Handler={0};
4RTC_Handler.Instance=RTC;
5HAL_RTCEx_BKUPWrite(&RTC_Handler,BOOT_BKP,0xA5A5);
6HAL_NVIC_SystemReset();
7}

版权声明:本文为RT-Thread论坛用户「Cfly」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://club.rt-thread.org/ask/article/08aa702381dd4310.html

———————End———————

RT-Thread线下入门培训

5月 - 成都、武汉、西安

1.免费2.动手实验+理论3.主办方免费提供开发板4.自行携带电脑,及插线板用于笔记本电脑充电5.参与者需要有C语言单片机ARM Cortex-M核)基础,请提前安装好RT-Thread Studio 开发环境

5ace1a72-def4-11ed-bfe3-dac502259ad0.png

立即扫码报名

(4月-青岛、北京 就在本周六)

报名链接

https://jinshuju.net/f/UYxS2k

巡回城市:青岛、北京、西安、成都、武汉、郑州、杭州、深圳、上海、南京

你可以添加微信:rtthread2020 为好友,注明:公司+姓名,拉进RT-Thread官方微信交流群!

点击阅读原文,进入RT-Thread创意创客大赛


	


原文标题:Bootloader 万能实现逻辑

文章出处:【微信公众号:RTThread物联网操作系统】欢迎添加关注!文章转载请注明出处。


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • RT-Thread
    +关注

    关注

    31

    文章

    1150

    浏览量

    38911

原文标题:Bootloader 万能实现逻辑

文章出处:【微信号:RTThread,微信公众号:RTThread物联网操作系统】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    HarmonyOS开发案例分享:万能卡片也能用来玩游戏

    时候我跟别人解释什么是万能卡片,都会这么说:\"万能卡片实现让你在不用打开 app 的前提下,在桌面上就能使用到相关服务\"。有一天,我的朋友跟我说,既然可以体验到各种服务,那么
    发表于 12-01 09:35

    单片机BootLoader与APP如何合并?

    单片机BootLoader与APP如何合并?
    的头像 发表于 10-25 17:17 637次阅读
    单片机<b class='flag-5'>BootLoader</b>与APP如何合并?

    STM32F09x不使用BOOT脚实现System Bootloader升级代码

    电子发烧友网站提供《STM32F09x不使用BOOT脚实现System Bootloader升级代码.pdf》资料免费下载
    发表于 09-25 15:08 1次下载
    STM32F09x不使用BOOT脚<b class='flag-5'>实现</b>System <b class='flag-5'>Bootloader</b>升级代码

    图解基于UDS的Flash BootLoader

    这张图和恒润教程中的BootLoader流程大体是一致的。
    的头像 发表于 08-14 10:49 746次阅读
    图解基于UDS的Flash <b class='flag-5'>BootLoader</b>

    ARM处理器如何编写Bootloader

    前面给大家分享过Bootloader从应用角度执行的相关文章,今天从底层原理来给大家描述ARM处理器如何编写Bootloader,以及底层流程。
    的头像 发表于 07-26 09:10 565次阅读
    ARM处理器如何编写<b class='flag-5'>Bootloader</b>

    单片机BootLoader与APP如何合并

    嵌入式固件一般分为BootLoader和App,BootLoader用于启动校验、App升级、App版本回滚等功能,BootLoader在cpu上电第一阶段中运行,之后跳转至App地址执行应用程序。
    的头像 发表于 07-25 11:29 982次阅读
    单片机<b class='flag-5'>BootLoader</b>与APP如何合并

    介绍一下CAN Bootloader的整个实现过程

    对于大多数汽车软件开发者来说,从客户需求的角度,他们更多关心Bootloader的下载模式。
    发表于 06-29 11:13 932次阅读
    介绍一下CAN <b class='flag-5'>Bootloader</b>的整个<b class='flag-5'>实现</b>过程

    想要自己实现一个bootloader,APROM中程序如何实现跳转,中断向量表如何设置?

    我要自己实现一个bootloaderbootloader在M487的APROM里面,APP也在APROM里面,如何实现bootloader
    发表于 06-27 08:39

    一文了解bootloader

    大多数Bootloader 包含两种操作模式。
    的头像 发表于 06-25 10:05 1610次阅读
    一文了解<b class='flag-5'>bootloader</b>

    mm32-2nd-bootloader技术进阶设计:实现Ymodem更新代码

    前文中实现了一款简单的 2nd Bootloader,能够跳转执行存储在 QSPI Flash 中的应用程序,但 2nd Bootloader 如果仅仅只是用于跳转执行程序的话,岂不是有些太简单
    的头像 发表于 06-09 09:28 878次阅读
    mm32-2nd-<b class='flag-5'>bootloader</b>技术进阶设计:<b class='flag-5'>实现</b>Ymodem更新代码

    Bootloader万能实现逻辑

    这种方式适合于简单的裸机程序或可控的 OS 程序(即所有外设硬件都可把控),在准备环境的时候将其全部关闭。
    的头像 发表于 06-07 17:50 430次阅读
    <b class='flag-5'>Bootloader</b><b class='flag-5'>万能</b><b class='flag-5'>实现</b><b class='flag-5'>逻辑</b>

    STM32H7实现BootLoader内SDRAM的初始化注意事项

    Function Implementation:在 ArtPi 的环境下,实现一个简单的 BootLoader,该 BootLoader 实现了 QSPI 和 SDRAM 功能的初始化
    的头像 发表于 06-07 15:51 2239次阅读
    STM32H7<b class='flag-5'>实现</b><b class='flag-5'>BootLoader</b>内SDRAM的初始化注意事项

    适合单片机的几款开源Bootloader

    如果日常工作中经常使用linux,那么对U-Boot,LILO,GRUB等常用Bootloader一定不陌生。但是这些Bootloader主要用于引导linux启动,不太适合单片机产品。
    发表于 05-25 15:42 4681次阅读
    适合单片机的几款开源<b class='flag-5'>Bootloader</b>

    fd30c和fc30c三极管用什么型号代替

    万能的大师们,fd30c和fc30c三极管用什么型号代替
    发表于 05-25 07:31

    一代之王 万能充!#diy #万能充 #万能充电器

    主板DIY电脑外设
    学习电子知识
    发布于 :2023年05月06日 23:38:41