/** ****************************************************************************** * @file RefreshMenu.c * @author Vincent * @version V1.0.0 * @date 23-12-2015 * @brief ****************************************************************************** ****************************************************************************** */ /* Includes ------------------------------------------------------------------*/ #include "RefreshMenu.h" //#include "FLASH_Block_Api.h" #include "protocol.h" #include "can_app.h" #include "flash_if.h" #include "Rom_check.h" #include "iwdg.h" /* Private variables ---------------------------------------------------------*/ //download_t _; //updatecount_t __; download_t downLoad; updatecount_t update; uint8_t flag_FlashWR[1024]; /* 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 { HAL_Delay(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; /*上电即开始应答*/ // __.AckEnable = ENABLE; // update.UpdateStatus = 0; update.TimeCounter_Startup = 1000; /*应答*/ //update.uwTimeThreshold = 100; //100 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(); CA_RxData_Process(&CAN_RxBuf_Struct1); // Protocol_Ack(); startUpAck(); updateAck(); timeOutAck(); if(downLoad.finished == ENABLE) { //downLoad.finished = DISABLE; HAL_CAN_DeInit(&hcan); JumpToApp(APPLICATION_ADDRESS); //downLoad.finished = DISABLE; } } } void timeOutAck(void) { if((downLoad.finished == DISABLE) && (downLoad.step != 0)) { if(update.TimeCounter_Update > 1000 ) //1000ms { update.TimeCounter_Update = 0; sendUpdateAck(CMD_ACK_ERR , downLoad.packagecount); } } } /*上电启动,或复位后*/ void startUpAck(void) { // startUpSendCount=0; 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: if( RomCheck() == SUCCESS ) { //HAL_Delay(1000); sendUpdateAck(downLoad.userCmd , 0x0000); downLoad.finished = ENABLE; } else { sendUpdateAck(CMD_ACK_ERR , 0x0000); } 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 <= 1024) && ( 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(); HAL_Delay(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 *********************************/