在原來的程式做了一個序列槽更新,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();
}
}