问题描述:(所用平台是STM32F207+DP83848)
APP用的是RT-THREAD的,bootloader用的是裸机版本的。我的做法是在APP中通过finish敲命令后在flash中置更新程序标志,然后切换到bootloader程序。bootloader程序检查更新程序标志是否置起,如果置起则等待更新命令(有超时跳转到APP操作),当程序更新完毕或者超时跳转到APP,则把升级程序的标志清掉。
遇到的问题是在从APP切换到bootloader后,bootloader是跑起来了,有打印信息,但是就是网络ping不通,所以无法通过网络更新程序。
之后发现在跳转到bootloader后不能ping通网络,但是每次按键复位芯片后都可以正常ping通网络且可以正常下载程序。发现这个规律后索性在APP中敲命令置起更新程序标志后软件复位芯片,复位后芯片默认从bootloader启动。之后发现这样bootloader可以正常ping通网络,可以正常下载程序了。
说明:我的bootloader程序flash对应是0x08000000开始,APP是从0x08010000开始,并且也在APP中把中断向量表映射到(NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x10000);)相应地址。
以下附上从APP中前换到bootloader函数,大家帮忙分析下问题到底处在哪里。
```typedef void (*pFunction)(void);
pFunction Jump_To_Application;
uint32_t JumpAddress;
void Clear_All_INT_FLAG(void)
{
ETH_DMAClearITPendingBit(ETH_DMA_IT_R);
ETH_DMAClearITPendingBit(ETH_DMA_IT_NIS);
TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
EXTI_ClearITPendingBit(EXTI_Line11);
USART_ClearITPendingBit(USART1, USART_IT_IDLE);
USART_ClearITPendingBit(USART1,USART_IT_TXE);
USART_ClearITPendingBit(USART1,USART_IT_TC);
USART_ClearITPendingBit(USART2, USART_IT_IDLE);
USART_ClearITPendingBit(USART2,USART_IT_TXE);
USART_ClearITPendingBit(USART2,USART_IT_TC);
USART_ClearITPendingBit(USART3, USART_IT_IDLE);
USART_ClearITPendingBit(USART3,USART_IT_TXE);
USART_ClearITPendingBit(USART3,USART_IT_TC);
}
void Iap_Updata_load(void)
{
“);
/ do nothing /
while(1);
}
return ;
}```
下面附上相应的log信息:
1.这个是从APP敲命令前换到bootloader的信息及ping信息:
相关ping信息(红色圈住部分是重启后在bootloader的ping信息):