/** ****************************************************************************** * @file RefreshMenu.c * @author Vincent * @version V1.0.0 * @date 23-12-2015 * @brief ****************************************************************************** ****************************************************************************** */ /* Includes ------------------------------------------------------------------*/ #include "RefreshMenu.h" #include "protocol.h" #include "can_app.h" #include "flash_if.h" /* Private variables ---------------------------------------------------------*/ download_t downLoad; updatecount_t update; uint8_t flag_FlashWR[2048]; extern void delay_1ms(uint32_t count); /* Private variables ---------------------------------------------------------*/ /* Private function prototypes -----------------------------------------------*/ void Protocol_Ack(void); void updateAck(void); void startUpAck(void); void timeOutAck(void); typedef void (*iapfun)(void); //定义一个函数类型的参数 iapfun jumpFun; void JumpToApp(__IO uint32_t ApplicationAddress) { __IO uint32_t temp; /* Test if user code is programmed starting from address "APPLICATION_ADDRESS" */ if (((*(__IO uint32_t*)ApplicationAddress) &0x2FFE0000 ) == 0x20000000) { /* Get add */ temp = (*(__IO uint32_t*)(ApplicationAddress + 4)); jumpFun =(iapfun)temp; /* Initialize user application's Stack Pointer */ __set_MSP(*(__IO uint32_t*)ApplicationAddress); /* Jump to user application */ jumpFun(); } else { delay_1ms(1); //downLoad.finished = DISABLE; } } /******************************************************************************* * Function: void User_Manu_Init(void) * Discrible: 初始化 * Input: * Output: * Return: * Others: * date version author record * ----------------------------------------------- * 20180419 V1.0 VINCENT Create *********************************************************************************/ void User_Manu_Init(void) { FLASH_If_Init(); //_.ackcmd = ACK_REQ; downLoad.step = 0; downLoad.packagecount = 0; downLoad.wrenable = DISABLE; downLoad.finished = DISABLE; downLoad.startUpSendCount = 0; update.TimeCounter_Startup = 1000; update.TimeCounter_Update = 0; } /******************************************************************************* * Function: void User_Main_Manu(void) * Discrible: 主菜单 * Input: * Output: * Return: * Others: * date version author record * ----------------------------------------------- * 20180419 V1.0 VINCENT Create *********************************************************************************/ void User_Main_Manu(void) { while(1) { // Iwdg_Refresh(); CAN_RxData_Process(&CAN_RxBuf_Struct1); startUpAck(); updateAck(); timeOutAck(); if(downLoad.finished == ENABLE) { delay_1ms(50); can_deinit(CAN0); gpio_bit_reset(GPIOC, GPIO_PIN_1); JumpToApp(APPLICATION_ADDRESS); } } } void timeOutAck(void) { if((downLoad.finished == DISABLE) && (downLoad.step != 0)) { if(update.TimeCounter_Update > 3000 ) //3000ms { update.TimeCounter_Update = 0; sendUpdateAck(CMD_ACK_ERR , downLoad.packagecount); downLoad.finished = ENABLE; } } } /*上电启动,或复位后*/ void startUpAck(void) { if(downLoad.step == 0 ) { if(downLoad.startUpSendCount < 4) { if(update.TimeCounter_Startup >= 50) //200ms { update.TimeCounter_Startup = 0; downLoad.startUpSendCount++; sendBootInfo(); } } else { downLoad.finished = ENABLE; } } } void updateAck(void) { if( update.AckEnable == ENABLE ) { update.AckEnable = DISABLE; switch(downLoad.step) { case 1: sendUpdateAck(downLoad.userCmd , 0x0000); break; case 2: sendUpdateAck(downLoad.userCmd , downLoad.packagecount); break; case 3: sendUpdateAck(downLoad.userCmd , 0x0000); downLoad.finished = ENABLE; break; case 5: sendAck(); downLoad.step = 0; downLoad.finished = DISABLE; downLoad.startUpSendCount = 0; break; default : break; } } if(downLoad.wrenable == ENABLE) { downLoad.wrenable = DISABLE; //写flash if((downLoad.packagecount <= 2048) && ( downLoad.packagecount > 0 ) ) { if(flag_FlashWR[downLoad.packagecount - 1] == 0 ) { if(FLASH_If_Write( (downLoad.packagecount - 1) * PACKET_128B_SIZE + APPLICATION_ADDRESS, (uint32_t *)downLoad.dataBuff_128B, 32) != FLASHIF_OK ) { while(1) { sendUpdateAck(CMD_ACK_ERR_FLASH , 0xee); // Iwdg_Refresh(); delay_1ms(1000); } } flag_FlashWR[downLoad.packagecount - 1] = 1; /* 写完FLASH后立即应答,清超时计数 */ update.AckEnable = ENABLE; /*清除超时标志*/ update.TimeCounter_Update = 0; } else { /*重复写入,可能是上位机没有接收到正确应答信号,重发了数据包, 应答一个正确信号,让上位机发送下一包数据*/ sendUpdateAck(CMD_ACK_OK, downLoad.packagecount); sendUpdateAck(CMD_ACK_ERR_FLASH , 0xe1); } } else { sendUpdateAck(CMD_ACK_ERR_FLASH , 0xe2); } } } /******************************************************************************* * Function: void Period_Stick(void) * Discrible: 周期定时器 * Input: * Output: * Return: * Others: * date version author record * ----------------------------------------------- * 20160307 V1.0 VINCENT Create *********************************************************************************/ void Period_Stick(void) { update.TimeCounter_Startup++; update.TimeCounter_Update++; } /************************ (C) END OF FILE *********************************/