在原来的程序做了一个串口升级,bootloader:无系统,app:ucosiii,bootloader烧写app没问题,boot跳转app也正常,但app跳回bootloader成功后,中断向量表偏移也配置过了,中断也确实可以进,但出串口中断会进hardfault,orz。
试过跳转前加用 USART_DeInit和DMA_DeInit复位boot用到的串口和dma通道,无效
目前解决方法是软件系统复位代替app跳回iap,复位有些不方便,但在这个项目影响不大,希望能找到更好的办法吧
出问题的中断函数
void USART1_IntHandler(void)
{
uint32_t temp = 0;
if(USART_GetITStatus(USART1,USART_IT_IDLE)!= RESET)
{
Uart1_Rx_Fifo.in = BSP_UART1_RX_SIZE - DMA_GetCurrDataCounter(DMA1_Channel5);
temp = USART1->SR;
temp = USART1->DR;
USART_ClearITPendingBit(USART1,USART_IT_IDLE);
}
else if(USART_GetITStatus(USART1,USART_IT_TC)!= RESET)
{
USART_ClearITPendingBit(USART1,USART_IT_TC);
DMA_Cmd(DMA1_Channel4, DISABLE);
}
}
跳转函数
void APP2Boot(void)
{
OS_ERR err;
uint16_t otaStatus=0;
FLASH_Read(FLASH_OTA_STATUS_ADDR,&otaStatus,1)
if(otaStatus==1)
{
NVIC_SystemReset();
//__ASM volatile("cpsid i");
//iap_load_app(FLASH_BOOT_ADDR);
}
}
void Boot2App(void)
{
FLASH_Read(FLASH_OTA_STATUS_ADDR,&otaStatus,1);
if(otaStatus==0)
{
INTX_DISABLE();
if(((*(vu32*)(FLASH_APP_ADDR+4))&0xFF000000)==0x08000000)
iap_load_app(FLASH_APP_ADDR);
}
}
void iap_load_app(u32 appxaddr)
{
iapfun jump2app;
if(((*(vu32*)appxaddr)&0x2FFE0000)==0x20000000)
{
jump2app=(iapfun)*(vu32*)(appxaddr+4);
MSR_MSP(*(vu32*)appxaddr);
jump2app();
}
}