天天看點

stm32iap程式互相跳轉hardfault的問題

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