1、代码如下, 可以执行到app_jump(); 应该是卡在APP里面了
[C] 纯文本查看 复制代码 /**
* @brief bootloader跳转函数
* @param app_addr:app程序入口指针
* @retval 无
*/
void jump_to_app(uint32_t app_addr)
{
uint32_t i=0;
void (*app_jump)(void); /* 声明一个函数指针 */
/* 关闭开启的外设 */
HAL_QSPI_MspDeInit(&hqspi);
HAL_UART_MspDeInit(&huart8);
/* 关闭全局中断 */
__disable_irq();
/* 设置所有时钟到默认状态,使用HSI时钟 */
HAL_RCC_DeInit();
RCC->CR &= ~(RCC_CR_PLLON); /* 确保 PLL 关闭(可选) */
while (RCC->CR & RCC_CR_PLLRDY);
/* 关闭滴答定时器,复位到默认值 */
SysTick->CTRL = 0;
SysTick->LOAD = 0;
SysTick->VAL = 0;
/* 关闭所有中断,清除所有中断挂起标志 */
for (i = 0; i < 8; i++)
{
NVIC->ICER[i] = 0xFFFFFFFF;
NVIC->ICPR[i] = 0xFFFFFFFF;
}
/* 清理并关闭Cache */
SCB_InvalidateICache();
SCB_DisableICache();
SCB_DisableDCache();
/* 设置主堆栈指针 */
__set_MSP(*(uint32_t *)app_addr);
app_jump = (void (*)(void)) (*((uint32_t *) (app_addr + 4)));
/* 设置为特权级模式,使用MSP指针 确保App从干净的(特权模式+MSP)环境启动 */
__set_CONTROL(0);
/* 跳转到系统BootLoader */
__DSB();
__ISB();
app_jump();
/* 跳转成功的话,不会执行到这里 */
while (1)
{
}
}
2、代码如下,并勾选MDK的MicroLIB
[C] 纯文本查看 复制代码 #include <stdio.h>
int fputc(int ch, FILE *f){
HAL_UART_Transmit(&huart8, (uint8_t *)&ch, 1, 2);
return ch;
}
int fgetc(FILE *f){
uint8_t ch = 0;
HAL_UART_Receive(&huart8, &ch, 1, 2);
return ch;
}
|