当前位置: 首页 > article >正文

从bootloader跳到APP需要几步?

从bootloader跳到APP需要几步?

  对于bootloader跳转到APP具体流程,我们用下面一个例子去讲解。首先将 bootloader 程序和 app 程序的大小都是 2K ,bootloader 从 0x08000000 到 0x080007FF , app 程序从 0x08000800 到 0x08000FFF 。
在这里插入图片描述
  接下来看 bootloader 代码的实现:

#include "stm32f10x.h" 

uint32_t JumpAddress = 0;

typedef void (*pFunction)(void);
pFunction Jump_To_Application;

#define FLASH_BASE_ADDRESS	((uint32_t)(0x08000000))
#define Application_Address	((uint32_t)(0x08000800))

int main(void)
{	
	JumpAddress = *(__IO uint32_t*)(Application_Address+4);
	Jump_To_Application = (pFunction) JumpAddress;
	__set_MSP(*(__IO uint32_t*) FLASH_BASE_ADDRESS);
	Jump_To_Application();
}

  对于 bootloader 程序,我们首先设置了 pc 指针为0x08000804,然后设置了栈顶指针,最后执行 pc 指针指向的地址。
  我们可以利用map文件查看使用 rom 的大小:
在这里插入图片描述
  接着我们来看 app 程序:

#include "stm32f10x.h"   

uint16_t i = 0;
int main(void)
{
	SCB->VTOR = FLASH_BASE | 0x800;
	i++;
	while(1);
}

  在 app 程序中我们首先得设置中断向量表偏移地址,然后再执行后面得程序,同样我们也可以使用 map 文件查看花费 rom 的大小:
在这里插入图片描述
  我们可以看到 rom 花费了0.83kb ,原因是在执行应用代码前又执行了时钟配置,因此我们可以在启动文件的复位中断函数注释掉:

; Reset handler
Reset_Handler   PROC
                EXPORT  Reset_Handler             [WEAK]
                IMPORT  __main
                ;IMPORT  SystemInit
                ;LDR     R0, =SystemInit
                ;BLX     R0               
                LDR     R0, =__main
                BX      R0
                ENDP

  接着我们继续编译,发现花费的 rom 比之前降低了:
在这里插入图片描述
  需要注意的是在编译前,我们得对编译器做些配置,将 bootloader 的起始地址配置为 0x08000000,将 app 的起始地址配置为0x08000800。
在这里插入图片描述
在这里插入图片描述
  我们对 bootloader 程序进行调试,我们可以看到 SP 指针已经设置为 0x08000000 指向的位置0x20000408:
在这里插入图片描述
  同时,执行完 bootloader 程序后,我们开始执行app程序,在app程序里我们得先设置中断向量表偏移,接着单步执行,可以看到可以正常执行。
在这里插入图片描述


http://www.kler.cn/a/591869.html

相关文章:

  • C# Exe + Web 自动化 (BitComet 绿灯 自动化配置、设置)
  • 如何创建并保存HTML文件?零基础入门教程
  • 深入理解 Vue 的响应式原理:从 Vue 2 到 Vue 3
  • Tailwind CSS 学习笔记(一)
  • LeetCode 第11题~第13题
  • Express.js 是一个轻量级、灵活且功能强大的 Node.js Web 应用框架
  • 【保姆级教程】Windows系统+ollama+Docker+Anythingllm部署deepseek本地知识库问答大模型,可局域网多用户访问
  • 单片机开发资源分析的实战——以STM32G431RBT6为例子的单片机资源分析
  • Qt6.8实现麦克风音频输入音频采集保存wav文件
  • 代码随想录算法训练营第三十二天 | 509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯
  • 【第15届蓝桥杯】软件赛CB组省赛
  • 3 C#调用visionPro的toolblock的步骤
  • Redis——事务实现以及应用场景
  • Linux下使用cgroup限制进程IO
  • 【Godot】CanvasItem
  • 神经外科手术规划的实现方案及未来发展方向
  • vue 获取当前时间并自动刷新
  • Spring 创建bean的流程
  • java项目40分钟后token失效问题排查(40分钟后刷新页面白屏)
  • 20242817李臻《Linux⾼级编程实践》第四周