我想从 STM32 Blue Pill STM32F103C8T6 上的应用程序跳转到引导加载程序。我的方法看起来是: - 向 BKP->DR1 写入任何值;- 进行重置(NVIC_SystemReset());- a main 的开头,检查是否 BKP->DR1 != 0,然后将其设置为 0 并跳转到引导;
调试显示,核心跳得很远(0xffffffffe)并且没有任何反应。我的代码:
/*
* bootloader.c
*
* Created on: 28.03.2020
* Author: Admin
*/
#include "stm32f10x.h"
#include "../Logger/logger.h"
#include "core_cm3.h"
#define ADDR 0x1FFFF000
void (*f_boot_jump)();
void boot_jump_to_boot ()
{
f_boot_jump = (void (*)(void)) (*((uint32_t *)(ADDR + 4)));
__disable_irq();
__DSB();
SCB->VTOR = (uint32_t) ADDR;
__DSB();
__ISB();
__set_MSP(*(__IO uint32_t*) ADDR);
f_boot_jump();
}
void boot_init()
{
RCC->APB1ENR |= RCC_APB1ENR_PWREN | RCC_APB1ENR_BKPEN;
PWR->CR |= PWR_CR_DBP;
if (BKP->DR1 != 0) //DR != 0 means, that boot request has been sent
{
BKP->DR1 = 0;
RCC->APB1ENR &= ~RCC_APB1ENR_PWREN;
RCC->APB1ENR &= ~RCC_APB1ENR_BKPEN;
PWR->CR &= ~PWR_CR_DBP;
RCC->CFGR &= ~RCC_CFGR_SW;
RCC->CR &= ~RCC_CR_PLLON;
RCC->CR &= ~RCC_CR_HSEON;
boot_jump_to_boot();
}
}
void boot_write_boot_request()
{
BKP->DR1 = 0x1;
NVIC_SystemReset();
}
我不知道为什么它不起作用。此外,0x1FFFF000 区域的跳转内存看起来还可以: 跳转前
这是在跳转失败 之后: 跳转之后 也许我的芯片是假的?ST Utility 显示正确的值(设备 ID、闪存大小、MediumDensity),但它没有任何意义。当我使用 BOOT 引脚时,引导加载程序已正确加载并且 STM 闪存加载程序可以识别它。即使我的芯片是假的,嵌入式引导加载程序也可以工作,所以我无法弄清楚为什么从应用程序跳转不起作用。