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相同。