使用 STM32F412 从引导加载程序跳转到应用程序时出错

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

我在从引导加载程序跳转到应用程序时遇到问题。 如果我在进入无限循环之前进行跳转,则一切正常,但如果我从循环内部进行跳转,则不起作用。 我还尝试设置一个条件使其退出循环,然后在通过循环后执行外部跳转,但即使在这种情况下,它也不起作用。 如果我单步执行引导加载程序代码,我会毫无问题地到达最后一条指令 (pmain_app())。 我进行了各种测试,使其在循环内工作的唯一方法是不初始化任何外围设备。 我不知道还能尝试什么。

#include "main.h"
#include "dma.h"
#include "fatfs.h"
#include "spi.h"
#include "usb_host.h"
#include "gpio.h"
#include "crc.h"

extern TIM_HandleTypeDef htim11;
extern const uint32_t   app_vector;  //app_vector is defined in ld file

#define APPLICATION_START_ADDRESS       (uint32_t *)&app_vector 

void SystemClock_Config(void);
void MX_USB_HOST_Process(void);
void JumpToApplication(void);


int main(void)
{
    HAL_Init();
    SystemClock_Config();
    MX_GPIO_Init();
    __enable_irq();

    volatile static int xxx;

    //JumpToApplication() //Here works

    while(true)
    {
        retStatus_t ret = retNothing;

        if(xxx++ >= 10000) ret = retJump;

        switch(ret)
        {
            case retNothing:
            break;

            case retJump:
                __disable_irq();
                JumpToApplication(); //Here it only works if I don't initialize any peripherals.
            break;

            case retReset:
                NVIC_SystemReset();
            break;
        }
    }
    //JumpToApplication() //Here doesn't work
}

void JumpToApplication(void)
{
    __HAL_RCC_GPIOA_CLK_DISABLE();
    __HAL_RCC_GPIOB_CLK_DISABLE();
    __HAL_RCC_GPIOC_CLK_DISABLE();
    __HAL_RCC_GPIOD_CLK_DISABLE();

    HAL_TIM_Base_DeInit(&htim11);

    void (*pmain_app)(void);

    __disable_irq();

    __HAL_RCC_CRC_CLK_DISABLE();

    SCB->VTOR = (uint32_t)APPLICATION_START_ADDRESS;
    __set_MSP((uint32_t)*APPLICATION_START_ADDRESS);
    pmain_app = (void (*)(void)) * (APPLICATION_START_ADDRESS + 4);

    __DSB();
    __ISB();

    pmain_app();
}
bootloader stm32f4
1个回答
0
投票

我重新排列了该功能,如下所示,它工作正常:

void jumpToApplication(void)
{
    void (*pmain_app)(void);

    HAL_GPIO_DeInit(GPIOA, GPIO_PIN_All);
    HAL_GPIO_DeInit(GPIOB, GPIO_PIN_All);
    HAL_GPIO_DeInit(GPIOC, GPIO_PIN_All);
    HAL_GPIO_DeInit(GPIOD, GPIO_PIN_All);

    HAL_SPI_MspDeInit(&hspi1);
    HAL_CRC_MspDeInit(&hcrc);

    HAL_TIM_Base_DeInit(&htim11);
    HAL_DeInit();                

    __disable_irq();

    __DSB();
    __ISB();

    SCB->VTOR = (uint32_t)APPLICATION_START_ADDRESS;
    __set_MSP((uint32_t)*APPLICATION_START_ADDRESS);

    pmain_app = (void (*)(void)) * (APPLICATION_START_ADDRESS + 1);
    pmain_app();
}
© www.soinside.com 2019 - 2024. All rights reserved.