STM32F103无法从应用程序跳转到引导加载程序

问题描述 投票:0回答:1

我想从STM32 Blue Pill STM32F103C8T6上的应用程序跳转到引导加载程序。我的方法看起来是:-将任何值写入BKP-> DR1;-进行重置(NVIC_SystemReset());-以main开头,检查BKP-> DR1!= 0,然后将其设置为0并跳转到引导;

调试显示,核心跳得很远(0xfffffffe),并且什么也没有发生。我的代码:

/*
 * 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();
}

来自IDE的SS:memoryregisters

我不知道为什么它不起作用。此外,在0x1FFFF000区域的跳转存储器看起来还可以之前:Before jump

并且这里是在无法启动之后:after jump也许我的芯片是假的? ST Utility显示正确的值(设备ID,闪存大小,MediumDensity),但没有任何意义。当我使用BOOT引脚时,引导加载程序已正确加载,并且STM Flashloader可以识别它。即使我的芯片是假的,嵌入式引导程序也可以工作,因此我无法弄清楚为什么从应用程序中跳出不起作用。

stm32 bootloader bluepill
1个回答
0
投票

我要跳到stm32l4芯片上的引导程序。我已经成功完成了以下代码:

© www.soinside.com 2019 - 2024. All rights reserved.