STM32 跳转系统BootLoader

STM32 跳转系统BootLoader

STM32 进入系统 bootLoader 主要有两种方法:

(1)一种是设置 boot 引脚,进入系统 bootLoader。
(2) 一种是应用程序跳转到系统 bootLoader。

串口1配置如下:

在这里插入图片描述

使用LL库可以使生成的代码能小一点。
GPIO使用HAL库可以打开HAL库定义,如果使用Flash库函数时就要打开HAL库,因为flash没有LL库。

在这里插入图片描述

boot.c源码如下:

#include "main.h"
#include "boot.h"


#define ENABLE_INT() __set_PRIMASK(0) /* 使能全局中断 */
#define DISABLE_INT() __set_PRIMASK(1) /* 禁止全局中断 */

#if 1
//下面两个变量放进函数内部会跳转失败,跳件错误中断!
void (*SysMemBootJump)(void); /* 声明一个函数指针 */
__IO uint32_t BootAddr = 0x1FFFF000; /*   的系统 BootLoader 地址 */

/* 
地址是0x1FFF 000 ~ 0x1FFF 77FF。系统存储区是用户不能访问的区域,它在芯片出厂时已经固化了启动程序,它负责实现串口、USB以及CAN等isp烧录功能。
 */
/* 函 数 名: JumpToBootloader
* 功能说明: 跳转到系统 BootLoader
* 形 参: 无
* 返 回 值: 无
******************************************************************************************************
*/
void JumpToBootloader(void)
{
	uint32_t i=0;


	/* 关闭全局中断 */
	DISABLE_INT();
	
	/* 关闭滴答定时器,复位到默认值 */
	SysTick->CTRL = 0;
	SysTick->LOAD = 0;
	SysTick->VAL = 0;

	/* 设置所有时钟到默认状态, 使用 HSI 时钟 */
	LL_RCC_DeInit();

	/* 关闭所有中断,清除所有中断挂起标志 */
	for (i = 0; i < 8; i++)
	{
		NVIC->ICER[i]=0xFFFFFFFF;
		NVIC->ICPR[i]=0xFFFFFFFF;
	}

	/* 使能全局中断 */
	ENABLE_INT();

	/* 跳转到系统 BootLoader,首地址是 MSP,地址+4 是复位中断服务程序地址 */
	SysMemBootJump = (void (*)(void)) (*((uint32_t *) (BootAddr + 4)));

	/* 设置主堆栈指针 */
	__set_MSP(*(uint32_t *)BootAddr);

	/* 跳转到系统 BootLoader */
	SysMemBootJump();

	/* 跳转成功的话,不会执行到这里,用户可以在这里添加代码 */
	while (1)
	{

	}
}
#endif

MDK调试:
在跳转前面打个断点:

在这里插入图片描述

等待跳转,成功后会跳转到 0x1FFFF000 附近。一般是0x1FFFF020。

在这里插入图片描述

(づ ̄3 ̄)づ╭❤~biubiu

1 程序将在 0x08000000开始运行,再进入main函数。
2 进入系统BootLoader后在汇编窗口才能看到,运行后就可以用串口烧写了。
3 串口配置要和mcu相同。

在这里插入图片描述

  • 3
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值