Bootloader 万能实现逻辑

描述

仓库地址:

https://github.com/loogg/agile_upgrade_mcu_demos

一般 Bootloader 实现的逻辑如下:

RT-Thread

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

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

这里提供一种 万能 方法:

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

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

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

RT-Thread

 

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

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

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

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

boot_start_application的实现为:

 1typedef 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 != 0xA5A5return;
10    boot_app_func app_func = NULL;
11    uint32_t app_addr = BOOT_APP_ADDR;
12    if (((*(__IO uint32_t *)(app_addr + 4)) & 0xff000000) != 0x08000000return;
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}

		
设置寄存器并软件复位的实现为:
1static 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}

 

 

版权声明:本文为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 开发环境

 

 

RT-Thread

 

 

 

 

 

 

立即扫码报名

 

 

 

 

 

 

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

 

 

 

 

报名链接

https://jinshuju.net/f/UYxS2k

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

 

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

 

 

 

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


	


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

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


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

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分