Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
Bootloader
Bootloader跳转到RT-Thread或FreeRTOS(基于STM32)
发布于 2018-06-30 15:22:44 浏览:8434
订阅该版
* 本帖最后由 slyant 于 2018-6-30 15:25 编辑 * [align=center][align=center]完整内容请下载附件 [align=center]Bootloader跳转到RT-Thread或FreeRTOS(基于STM32)[align=center]作者:猾蚁 QQ:7376220[align=center]一、Bootloader程序[align=center]1.准备好升级程序项目,可以使用STM32CubeMX来自动生成代码,然后自己编写代码实现升级策略。[align=center]2.跳转代码实现[align=center]Main.c[align=center]#define BOOT_LOADER_Address 0x08000000 [align=center]#define BOOT_LOADER_SIZE (200*1024) //0x32000(200KB)[align=center]#define BOOT_OS_Address (BOOT_LOADER_Address+BOOT_LOADER_SIZE)[align=center]typedef void (*pFunction)(void);[align=center]pFunction Jump_To_Application;[align=center]uint32_t JumpAddress;[align=center]static void jump_to_os(void); [align=center]//重定向printf[align=center]int fputc(int ch, FILE *f)[align=center]{ [align=center] while((USART1->SR&0X40)==0);[align=center] USART1->DR = (uint8_t) ch; [align=center] return ch;[align=center]}[align=center]int main(void)[align=center]{[align=center]HAL_Init();[align=center]SystemClock_Config();[align=center]MX_USART1_UART_Init(); [align=center]//在这里实现升级策略[align=center]printf("user_init()
"); [align=center] //升级完成后程序跳转到RT-Thread[align=center] jump_to_os();[align=center]}[align=center]static void jump_to_os(void)[align=center]{[align=center] if (((*(__IO uint32_t*)BOOT_OS_Address) & 0x2FFE0000 ) == 0x20000000)[align=center] { /* Jump to user application */[align=center] printf("jump_to_os
");[align=center] [align=center] __disable_irq() ; //关闭总中断[align=center] HAL_DeInit();[align=center] [align=center] JumpAddress = *(__IO uint32_t*) (BOOT_OS_Address + 4);[align=center] Jump_To_Application = (pFunction) JumpAddress;[align=center] /* Initialize user application's Stack Pointer */[align=center] __set_MSP(*(__IO uint32_t*) BOOT_OS_Address); [align=center] Jump_To_Application();[align=center] }[align=center] else[align=center] {[align=center] printf("BOOT_OS_Address:%08X
", *(__IO uint32_t*)BOOT_OS_Address);[align=center] } [align=center]} [align=center]3.Keil设置 [align=center]上面的IROM1的Size设置与前面宏定义BOOT_LOADER_SIZE值相同,值为十六进制 [align=center]这里的Start、size和前面的IROM1设置相同 [align=center]编译后下载,因为前面未选择Reset and Run,下载完成后程序不会运行。 [align=center]二、RT-Thread程序[align=center]1.准备好RT-Thread项目,确认项目可成功编译运行。[align=center]2.重定义中断向量表地址[align=center]找到stmtem_stm32fnxx.c文件中的SystemInit函数,找到SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET这一句,转到VECT_TAB_OFFSET的宏定义,修改值为前面BOOT_LOADER_SIZE的值:#define VECT_TAB_OFFSET 0x32000[align=center]3.启用SystemInit函数,使上面中断向量表重定义生效[align=center]SystemInit函数没有被任何C代码调用,它在启动汇编代码中被导入调用。启用startup_stm32fnnnxx.s文件中SystemInit被调用的相关代码(去掉分号注释即可),启用后如下图: [align=center]4.Keil设置 [align=center]IROM1的Start设置为前面BOOT_OS_Address定义的值,size设置为MCU的Flash总大小减去BOOT_LOADER_SIZE后剩余的大小。 [align=center]这里的Start、size和前面的IROM1设置相同 [align=center]编译后下载,如果上面选择了Reset and Run,下载完成后程序会从Bootloader开始运行,实现程序升级过程后跳转到RT-Thread运行,如下图: [align=center]![Bootloader跳转到RT-Thread.pdf](/uploads/201806/30/152325bsum78j9oe527284.attach)
查看更多
3
个回答
默认排序
按发布时间排序
风来吴山
2019-02-20
这家伙很懒,什么也没写!
我也正在学习stm32的iap升级,请问能发我一个工程例子吗?
slyant
2019-04-02
这家伙很懒,什么也没写!
>我也正在学习stm32的iap升级,请问能发我一个工程例子吗? --- 官方已经有Bootloader方案了,可以关注一下
风来吴山
2019-04-05
这家伙很懒,什么也没写!
>官方已经有Bootloader方案了,可以关注一下 --- 已搞定,谢谢了
撰写答案
登录
注册新账号
关注者
0
被浏览
8.4k
关于作者
slyant
这家伙很懒,什么也没写!
提问
10
回答
28
被采纳
0
关注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组件
最新文章
1
CherryUSB的bootuf2配置
2
在用clangd开发RTT吗,快来试试如何简单获得清晰干净的工作区
3
GD32F450 片内 flash驱动适配
4
STM32H7R7运行CherryUSB
5
RT-Smart首次线下培训,锁定2024 RT-Thread开发者大会!
热门标签
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
ESP8266
I2C_IIC
UART
WIZnet_W5500
ota在线升级
PWM
freemodbus
flash
cubemx
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
flashDB
GD32
socket
中断
编译报错
Debug
SFUD
rt_mq_消息队列_msg_queue
msh
keil_MDK
ulog
C++_cpp
MicroPython
本月问答贡献
a1012112796
10
个答案
1
次被采纳
踩姑娘的小蘑菇
4
个答案
1
次被采纳
红枫
4
个答案
1
次被采纳
张世争
4
个答案
1
次被采纳
Ryan_CW
4
个答案
1
次被采纳
本月文章贡献
catcatbing
3
篇文章
6
次点赞
YZRD
2
篇文章
5
次点赞
lizimu
2
篇文章
5
次点赞
qq1078249029
2
篇文章
2
次点赞
xnosky
2
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部