Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
Bootloader
Bootloader 万能实现逻辑
5.00
发布于 2022-10-08 13:24:44 浏览:2793
订阅该版
仓库地址:https://github.com/loogg/agile_upgrade_mcu_demos 一般 `Bootloader` 实现的逻辑如下: ![boot1.png](https://oss-club.rt-thread.org/uploads/20221008/e242e8f6ad43ad14f83e9dfaffaee156.png "boot1.png") 这种方式适合于简单的裸机程序或可控的 OS 程序(即所有外设硬件都可把控),在准备环境的时候将其全部关闭。 但对于一些复杂的或者 OS 中轮子已造好的程序,有一些因素不花时间研究无法把控,在准备环境时很可能就会遗漏一些未关闭导致出各种各样的问题。 这里提供一种 **万能** 方法: ```C - 利用芯片中的不受软件复位影响的可供用户使用的寄存器 (如 STM32 中的备份寄存器)。 - 在需要跳入 APP 运行时将该寄存器赋值然后软件复位。 - 在 OS 还没初始化时判断该寄存器值,如果需要跳转只需要简单的准备环境即可跳转。 ``` ![boot2.png](https://oss-club.rt-thread.org/uploads/20221008/7779a1438fca6b5e85c08591d4bf1bee.png "boot2.png") 该方法可以使 `Bootloader` 就作为一个 OS 应用程序开发,需要跳转的时候就操作一下寄存器并软件复位即可。 该仓库下所有的 `Bootloader` 例子均使用此方法。 以正点原子探索者开发板的 `STM32F4` 为例,将 `system_stm32f4xx.c` 文件的 `SystemInit` 函数修改: ```C void boot_start_application(void); void SystemInit(void) { boot_start_application(); ... } ``` `boot_start_application` 的实现为: ```C typedef void (*boot_app_func)(void); void boot_start_application(void) { __HAL_RCC_PWR_CLK_ENABLE(); HAL_PWR_EnableBkUpAccess(); RTC_HandleTypeDef RTC_Handler = {0}; RTC_Handler.Instance = RTC; uint32_t bkp_data = HAL_RTCEx_BKUPRead(&RTC_Handler, BOOT_BKP); HAL_RTCEx_BKUPWrite(&RTC_Handler, BOOT_BKP, 0); if (bkp_data != 0xA5A5) return; boot_app_func app_func = NULL; uint32_t app_addr = BOOT_APP_ADDR; if (((*(__IO uint32_t *)(app_addr + 4)) & 0xff000000) != 0x08000000) return; /* 栈顶地址在 128K RAM 间 */ if (((*(__IO uint32_t *)app_addr) - 0x20000000) >= (STM32_SRAM_SIZE * 1024)) return; app_func = (boot_app_func) * (__IO uint32_t *)(app_addr + 4); /* Configure main stack */ __set_MSP(*(__IO uint32_t *)app_addr); /* jump to application */ app_func(); } ``` 设置寄存器并软件复位的实现为: ```C static void boot_app_enable(void) { __disable_irq(); RTC_HandleTypeDef RTC_Handler = {0}; RTC_Handler.Instance = RTC; HAL_RTCEx_BKUPWrite(&RTC_Handler, BOOT_BKP, 0xA5A5); HAL_NVIC_SystemReset(); } ```
9
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
Cfly
这家伙很懒,什么也没写!
文章
15
回答
24
被采纳
3
关注TA
发私信
相关文章
1
Linux下通过USBTinyISP为Arduino开发板烧?写Bootloader
2
请教修改NVIC后RTT调度函数失效的问题[已解决 bootloader中打开了不必要的中断]
3
进入bootloader的方式探讨
4
求助:IAP里的APP使用的RTT,跳转后出错。[已解决]
5
有没有人在STM32F103上用UART IAP跑过RT-Thread?
6
想做网口的IAP远程升级,不知可不可行
7
IAP问题
8
[已解决]请教基于RTT的IAP程序切换到应用程序不成功的问题(基于STM32F4)?
9
stm32f4xx-----IAP移植APP程序需要注意的地方
10
在调试IAP网络升级遇到跳转之后bootloader程序网络不通
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
I2C_IIC
ESP8266
UART
WIZnet_W5500
ota在线升级
cubemx
PWM
flash
freemodbus
BSP
packages_软件包
潘多拉开发板_Pandora
定时器
ADC
flashDB
GD32
socket
编译报错
中断
Debug
rt_mq_消息队列_msg_queue
SFUD
msh
keil_MDK
ulog
C++_cpp
MicroPython
本月问答贡献
xusiwei1236
8
个答案
2
次被采纳
踩姑娘的小蘑菇
1
个答案
2
次被采纳
用户名由3_15位
9
个答案
1
次被采纳
bernard
4
个答案
1
次被采纳
RTT_逍遥
3
个答案
1
次被采纳
本月文章贡献
聚散无由
2
篇文章
15
次点赞
catcatbing
2
篇文章
5
次点赞
Wade
2
篇文章
4
次点赞
Ghost_Girls
1
篇文章
7
次点赞
xiaorui
1
篇文章
2
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部