stm32iap程序相互跳转hardfault的问题

在STM32上实现APP跳转至Bootloader时遇到串口中断后进入hardfault的问题,尝试复位串口和DMA通道无效,当前解决方案为使用软件系统复位代替跳转,寻求更优解决办法。

在原来的程序做了一个串口升级,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();								
	}
}		 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值