Bootloader 跳转到 RT-Thread 或 FreeRTOS(基于 STM32)
Bootloader 跳转到 RT-Thread 或 FreeRTOS(基于 STM32) 作者:猾蚁 QQ:7376220
一、Bootloader 程序
1. 准备好升级程序项目,可以使用 STM32CubeMX 来自动生成代码,然后自己编
写代码实现升级策略。
2. 跳转代码实现
Main.c
#defineBOOT_LOADER_Address0x08000000
#defineBOOT_LOADER_SIZE (200*1024) //0x32000(200KB)
#defineBOOT_OS_Address(BOOT_LOADER_Address+BOOT_LOADER_SIZE)
typedef void(*pFunction)(void);
pFunctionJump_To_Application;
uint32_tJumpAddress;
staticvoidjump_to_os(void);
//重定向 printf
intfputc(intch,FILE*f)
{
while((USART1->SR&0X40)==0);
USART1->DR=(uint8_t)ch;
returnch;
}
intmain(void)
{
HAL_Init();
SystemClock_Config();
MX_USART1_UART_Init();
//在这里实现升级策略
printf("user_init()\r\n");
//升级完成后程序跳转到 RT-Thread
jump_to_os();
}
staticvoidjump_to_os(void)
{
if(((*(__IOuint32_t*)BOOT_OS_Address)&0x2FFE0000)==0x20000000)
{/*Jumptouserapplication*/
printf("jump_to_os\r\n");
__disable_irq();//关闭总中断
HAL_DeInit();
JumpAddress=*(__IOuint32_t*)(BOOT_OS_Address+4);
Jump_To_Application=(pFunction)JumpAddress;
/*Initializeuserapplication'sStackPointer*/
__set_MSP(*(__IOuint32_t*)BOOT_OS_Address);
Jump_To_Application();
}
else
{
printf("BOOT_OS_Address:%08X\r\n",*(__IOuint32_t*)BOOT_OS_Address);
}
}
3. Keil 设置
上面的 IROM1 的 Size 设置与前面宏定义 BOOT_LOADER_SIZE 值相同,值为十六
进制
这里的 Start、size 和前面的 IROM1 设置相同
编译后下载,因为前面未选择 ResetandRun,下载完成后程序不会运行。
二、RT-Thread 程序
1. 准备好 RT-Thread 项目,确认项目可成功编译运行。
2. 重定义中断向量表地址
找 到 stmtem_stm32fnxx.c 文 件 中 的 SystemInit 函 数 , 找 到 SCB->VTOR =
FLASH_BASE | VECT_TAB_OFFSET 这一句,转到 VECT_TAB_OFFSET 的宏定义,修
改值为前面 BOOT_LOADER_SIZE 的值:#defineVECT_TAB_OFFSET 0x32000
3. 启用 SystemInit 函数,使上面中断向量表重定义生效
SystemInit 函数没有被任何 C 代码调用,它在启动汇编代码中被导入调用。启用
startup_stm32fnnnxx.s 文件中 SystemInit 被调用的相关代码(去掉分号注释即
可) ,启用后如下图:
4. Keil 设置
IROM1的Start设置为前面BOOT_OS_Address定义的值, size设置为MCU的Flash
总大小减去 BOOT_LOADER_SIZE 后剩余的大小。
这里的 Start、size 和前面的 IROM1 设置相同
编译后下载,如果上面选择了 ResetandRun,下载完成后程序会从 Bootloader
开始运行,实现程序升级过程后跳转到 RT-Thread 运行,如下图
其它参考:
https://www.cnblogs.com/michaelHeaven/p/3418705.html
https://blog.csdn.net/m0_37738150/article/details/79498220
http://www.eeworld.com.cn/mcu/2018/ic-news081940856.html
http://www.eeworld.com.cn/mcu/2018/ic-news081940854.html
https://wenku.baidu.com/view/6748673201f69e3143329496.html 振南的znFAT
Bootloader 跳转到 RT-Thread 或 FreeRTOS(基于 STM32)的更多相关文章
- RT Thread 通过ENV来配置SFUD,操作SPI Flash
本实验基于正点原子stm32f4探索者板子 请移步我的RT Thread论坛帖子. https://www.rt-thread.org/qa/forum.php?mod=viewthread& ...
- STM32 + RT Thread OS 学习笔记[二]
串口通讯例程 通过上面的练习,对STM32项目开发有了一个直观印象,接下来尝试对串口RS232进行操作. 1. 目标需求: 开机打开串口1,侦听上位机(使用电脑串口测试软件)发送的信息,然后原样输 ...
- STM32 + RT Thread OS 串口通讯
1. 创建项目 a) 禁用Finsh和console b) 默认情况下,项目文件包含了finsh,它使用COM1来通讯,另外,console输出(rt_kprintf)也使用了COM1.因 ...
- 跳過 Windows RT的UI
RT启动进入常规桌面 微软Surface RT发布的时间已经不短了,相信很多朋友都已经熟悉了这个全新的平板,并且已经上手.Surface RT开机默认进入的界面为Windows UI,这对于经常使用A ...
- app和bootloader跳转 MSP与PSP
1.不要把跳转函数放在中断中,如此导致在跳转后的app或者bootloder都是在中断状态,只要你一开启该中断,就可能出现硬件中断了 2.如果你的APP使用了ucos系统,在跳转函数中还需要增加__s ...
- STM32 + RT Thread OS 学习笔记[三]
RTGUI 据说RTGUI是多线程的,因此与RT-Thread OS的耦合度较高,有可能要访问RT-Thread的线程控制块.如果要移植到其它OS,估计难度较大.目前还处于Alpha状态,最终将会包含 ...
- STM32 + RT Thread OS 学习笔记[四]
1. 补注 a) 硬件,打通通讯通道 若学习者购买了学习板,通常可以在学习板提供的示例代码中找到LCD的相关驱动代码,基本上,这里的驱动的所有代码都可以从里面找到. 从上面的示意图可见,M ...
- RT thread 设备驱动组件之USART设备
本文以stm32f4xx平台介绍串口驱动,主要目的是:1.RTT中如何编写中断处理程序:2.如何编写RTT设备驱动接口代码:3.了解串行设备的常见处理机制.所涉及的主要源码文件有:驱动框架文件(usa ...
- RT Thread的SPI设备驱动框架的使用以及内部机制分析
注释:这是19年初的博客,写得很一般,理解不到位也不全面.19年末得空时又重新看了RTThread的SPI和GPIO,这次理解得比较深刻.有时间时再整理上传. -------------------- ...
随机推荐
- kaggle Pipelines
# Most scikit-learn objects are either transformers or models. # Transformers are for pre-processing ...
- TCP/IP的三次握手和四次放手
一开始个人对于三次握手和四次挥手这个东西还是有时候会忘记,可能理解的不是非常深刻,所以今天就自己动手来记录一下这个知识点,方便以后查看.总结完之后发现总结的还是可以的哈哈. 三次握手建立连接 第一次: ...
- [转]Linux安装前配置操作记录
转至:http://m.blog.csdn.net/weixin_35884835/article/details/52385077 1.修改用户的SHELL的限制,修改/etc/security/l ...
- 【Arcgis for android】Error inflating class com.esri.android.map.MapView【已解决】
解决方案:如果你是一个项目之前调试是好的,突然调试报这个错,听我的,直接卸载手机上调试的这个程序,重新调试,你会发现ok了 环境:arcgis android 10.2 错误:E/AndroidRun ...
- sql 根据指定字符截取前面几个字符
1.找到指定字所在的位置并且减去多少是要截取的字符长度 CharIndex('元',product_name)-3) 2.截取 SUBSTRING(product_name, CharIndex('元 ...
- 机器学习基石笔记:11 Linear Models for Classification、LC vs LinReg vs LogReg、OVA、OVO
原文地址:https://www.jianshu.com/p/6f86290e70f9 一.二元分类的线性模型 线性回归后的参数值常用于PLA/PA/Logistic Regression的参数初始化 ...
- Pandas——修改DataFrame列名
#生成一个数据框 import pandas as pd a = pd.DataFrame({'a':[1,2,3], 'b':[4,5,6], 'c':[7,8,9]}) #直接修改:缺点必须写明每 ...
- 【bzoj2818】: Gcd 数论-欧拉函数
[bzoj2818]: Gcd 考虑素数p<=n gcd(xp,yp)=p 当 gcd(x,y)=1 xp,yp<=n满足条件 p对答案的贡献: 预处理前缀和就好了 /* http://w ...
- [51nod1222] 最小公倍数计数(莫比乌斯反演)
题面 传送门 题解 我此生可能注定要和反演过不去了--死都看不出来为啥它会突然繁衍反演起来啊-- 设\(f(n)=\sum_{i=1}^n\sum_{j=1}^n[{ij\over\gcd(i,j)} ...
- Python之‘’控制流‘’
一.if语句 格式: i1 = 3 if i1 > 4: print('yes you are right') elif 0 < i1 < 4: print('im dont kon ...