我在从引导加载程序跳转到应用程序时遇到问题。 如果我在进入无限循环之前进行跳转,则一切正常,但如果我从循环内部进行跳转,则不起作用。 我还尝试设置一个条件使其退出循环,然后在通过循环后执行外部跳转,但即使在这种情况下,它也不起作用。 如果我单步执行引导加载程序代码,我会毫无问题地到达最后一条指令 (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();
}
我重新排列了该功能,如下所示,它工作正常:
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();
}