在调试IAP网络升级遇到跳转之后bootloader程序网络不通

发布于 2015-03-18 13:19:47
问题描述:(所用平台是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;
#define USER_FLASH_FIRST_PAGE_ADDRESS 0x08000000 /* Only as example see comment */
#define USER_FLASH_LAST_PAGE_ADDRESS 0x080E0000
#define USER_FLASH_END_ADDRESS 0x080FFFFF
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)
{
#define IAP_UPDATA_FLAG 0XAA
u8 temp[ADDR_TOTAL]={0};
SPI_FLASH_HighSpeedReadCont(temp,CMD_0XC1_SAVE_FLAG1,ADDR_TOTAL);
temp[UPDATA_FLAG] = IAP_UPDATA_FLAG;
Flash_Sector_Erase(CMD_0XC1_SAVE_FLAG1);
SPI_FLASH_WriteCont(temp,CMD_0XC1_SAVE_FLAG1,ADDR_TOTAL);
__set_FAULTMASK(1); // 关总中断
/* disable interrupt first */
Clear_All_INT_FLAG();//清除我在APP中打开的中断的标志
//reset_chip();//软件复位芯片
rt_hw_interrupt_disable();
if (((*(__IO uint32_t*)USER_FLASH_FIRST_PAGE_ADDRESS) & 0x2FFE0000 ) == 0x20000000)
{
/* Jump to user application */
JumpAddress = *(__IO uint32_t*) (USER_FLASH_FIRST_PAGE_ADDRESS + 4);
Jump_To_Application = (pFunction) JumpAddress;
/* Initialize user application's Stack Pointer */
__set_MSP(*(__IO uint32_t*) USER_FLASH_FIRST_PAGE_ADDRESS);
Jump_To_Application();
}
else
{/* Otherwise, do nothing */
rt_kprintf("do nothing
");
/* do nothing */
while(1);
}
return ;
}

下面附上相应的log信息:
1.这个是从APP敲命令前换到bootloader的信息及ping信息:
{C0X3UWI6J(NS4HE}URBPYT.png
)A_AJ_OXP{QBN[W}JUI@2RV.png
2.当打开reset_chip();//软件复位芯片函数,让芯片复位后bootloader的信息及ping信息:
可以正常更新程序(相应log信息):
578M5]QLUI%(NGC]{}{S2MV.png
相关ping信息(红色圈住部分是重启后在bootloader的ping信息):
11111A910.png

查看更多

关注者
0
被浏览
2.1k
2 个回答
aozima
aozima 2015-03-18
拒绝白嫖,拒绝键盘侠!
好长,没看完。

简单点说就是网络不通,那么去查不通的原因,而不要纠结为什么有了bootloader就不通,因为程序本来就是有问题的,可能有些地方没初始化而使用了默认的状态。
刚好有bootloader把它复现出来了而已。

比如MII/RMII的IO状态不确定导致在PHY复位时对其设置了错误的参数。
dump出PHY的寄存器并逐个解析。

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友

手机
浏览

扫码手机浏览