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,这次理解得比较深刻.有时间时再整理上传. -------------------- ...
随机推荐
- html 里 checkbox里 只要选中就会自动添加checked=“checked”么?
事实上HTML代码是不会发生变化的,但是控件对象的属性会发生变化以反映这个操作的结果.也就是说,该对象的checked属性值会由false变成true.但元素标签中并不会插入checked=" ...
- LeetCode第114题:二叉树展开为链表
问题描述 给定一个二叉树,原地将它展开为链表. 例如,给定二叉树 1 / \ 2 5 / \ \ 3 4 6 将其展开为: 1 \ 2 \ 3 \ 4 \ 5 \ 6 解题思路 二叉树的一些算法题都可 ...
- c语言中的const的作用及解析
有时候我们希望定义这样一种变量,它的值不能被改变,在整个作用域中都保持固定.例如,用一个变量来表示班级的最大人数,或者表示缓冲区的大小.为了满足这一要求,可以使用const关键字对变量加以限定: co ...
- ZOJ - 3057 D - Beans Game(三堆威佐夫博弈)
Beans Game Time Limit: 5 Seconds Memory Limit: 32768 KB There are three piles of beans. TT and DD pi ...
- C#中的线程池使用(二)
线程池是后台线程.每个线程都使用默认的堆栈大小,以默认的优先级运行,并处于多线程单元中.每个进程只有一个线程池对象. 下面说一下线程池中的异常,在线程池中未处理的异常将终止进程.以下为此规则的三种例外 ...
- MySQL Index Condition Pushdown 原理与解析
Index Condition Pushdown(ICP)是针对mysql使用索引从表中检索行数据时的一种优化方法. 原理: 在没有ICP特性之前,存储引擎根据索引去基表查找并将数据返回给mysq ...
- Git分支管理命令
1. 创建新分支 1)创建新仓库 git init git add README.md git commit -m "readme.md" git remote add origi ...
- asp遍历前端的所有控件
//遍历ID为Panel1的panel里的所有label控件 foreach (Control ctl in this.Panel1.Controls) { //判断类型为Label的 if (ctl ...
- Python列表知识补充
1.import this Python之禅,圣经. >>> import this The Zen of Python, by Tim Peters Beautiful is b ...
- phaser小游戏框架学习中的屏幕适配
这篇博客主要讲一下上一篇博客的右侧和底部出现的问题.就是页面会有偏移量.说一下这个产生的原因吧. 一开始在构建html页面的时候,习惯性的在页面中加了 <meta name="view ...