金牌会员
- 积分
- 1208
- 金钱
- 1208
- 注册时间
- 2017-8-25
- 在线时间
- 167 小时
|
3金钱
IAP跳转程序出现通讯完直接跳转会出现死机的状态,断电重启后通过main初始化函数跳转就可以正常跳转,不知道这是什么原因,望大神指教,下面是相应程序
//Bootloader main函数
int main(void)
{
__set_PRIMASK(0); //¿ªÆô×ÜÖжÏ
RCC_Configuration();
GPIO_Configuration();
NVIC_Configuration();
STMFLASH_Read(FLASH_SAVE_ADDR,(uint16_t *)&pa.Para_W_R[0],FLASH_PARA_NUM); //Read Flash
USART_Init_DMA(serUsart1,115200);
if(((*(vu32*)(FLASH_APP1_ADDR+4))&0xFF000000)==0x08000000&&pa.stru_W_R.Sys_Param.SYS_KEY.Bit.IAP_Upgrade==0)//ÅжÏÊÇ·ñΪ0X08XXXXXX.
{
iap_load_app(FLASH_APP1_ADDR);//Ö´ÐÐFLASH APP´úÂë
}
else if(pa.stru_W_R.Sys_Param.SYS_KEY.Bit.IAP_Upgrade)
{
pa.stru_W_R.Sys_Param.SYS_KEY.Bit.IAP_Upgrade=0;
FLASH_Write_ALL();
}
xTaskCreate((TaskFunction_t )start_task, //ÈÎÎñº¯Êý
(const char* )"start_task", //ÈÎÎñÃû³Æ
(uint16_t )START_STK_SIZE, //ÈÎÎñ¶ÑÕ»´óС
(void* )NULL, //´«µÝ¸øÈÎÎñº¯ÊýµÄ²ÎÊý
(UBaseType_t )START_TASK_PRIO, //ÈÎÎñÓÅÏȼ¶
(TaskHandle_t* )&StartTask_Handler); //ÈÎÎñ¾ä±ú
vTaskStartScheduler(); //¿ªÆôÈÎÎñµ÷¶È
}
//串口任务执行FLASH
switch (sg_RtuFlag)
{
case RTU_HARD:
if(USART_GetRxString((u8 *)&RT_RecvPack.RR_Hard, 1))
{
switch(RT_RecvPack.RR_Hard)
{
case IAP_STX:
sg_RtuFlag =RTU_PACKET;
s_TimeWhen =0;
break;
case IAP_EOT:
if(((*(vu32*)(FLASH_APP1_ADDR+4))&0xFF000000)==0x08000000)
{
iap_load_app(FLASH_APP1_ADDR);//Ö´ÐÐFLASH APP´úÂë
}
break;
default:
MODBUS_ptlClrPtlData_LAN();
break;
}
}
break;
//跳转到应用程序
void iap_load_app(u32 appxaddr)
{
if(((*(vu32*)appxaddr)&0x2FFE0000)==0x20000000) //¼ì²éÕ»¶¥µØÖ·ÊÇ·ñºÏ·¨.
{
__set_PRIMASK(1); //关闭总中断
jump2app=(iapfun)*(vu32*)(appxaddr+4); //Óû§´úÂëÇøµÚ¶þ¸ö×ÖΪ³ÌÐò¿ªÊ¼µØÖ·(¸´Î»µØÖ·)
MSR_MSP(*(vu32*)appxaddr); //³õʼ»¯APP¶ÑÕ»Ö¸Õë(Óû§´úÂëÇøµÄµÚÒ»¸ö×ÖÓÃÓÚ´æ·ÅÕ»¶¥µØÖ·)
jump2app(); //跳转到APP
}
}
|
|