#include "includes.h" /******************************************************************************* * Software Version : 测试版本 * Publication Date :2021-10-07 11:33 * Description : 逻辑架构整理 *******************************************************************************/ uint32_t test_tick = 0; S_RTC w_rtc = {0x20,0x43,0x13,0x03,0x16,0x06,0x21}; int main() { SystemInit(); PWR_UnitModCfg(ENABLE, UNIT_SYS_PLL); /* PLL上电 */ DelayMs(3); SetSysClock(CLK_SOURCE_HSE_32MHz); /* 外部晶振 PLL 输出32MHz */ SysTick_Config(FREQ_SYS/10000); //滴答定时器初始化 -- 100us定时必须设置的一个定时器 R8_UART0_IER = RB_IER_RESET; R8_UART1_IER = RB_IER_RESET; R8_UART2_IER = RB_IER_RESET; R8_UART3_IER = RB_IER_RESET; SPI_SRAM_Init(); //初始化spi Flash_Init(); R8_UART0_IER = 0x00; R8_UART1_IER = 0x00; R8_UART2_IER = 0x00; R8_UART3_IER = 0x00; #if (USE_CORE_TYPE == 1) //使用C1F核心板 //C1F不使用KEY和RTC USART_INIT(USART_1,512000); //C1F使用串口1作为调试打印串口,同时需要把 DEBUG=1 #elif (USE_CORE_TYPE == 2) //使用C1核心板 uint8_t rev = 0,temp_rev = 0; RTC_Init(); USART_INIT(USART_0,512000); //C1使用串口0作为调试打印串口,同时需要把 DEBUG=0 #endif //USE_CORE_TYPE == CORE_TYPE_C1F Multipexing_IO_Init(); #if (USE_CORE_TYPE == 1) //使用C1F核心板 //C1F不使用 #elif (USE_CORE_TYPE == 2) //使用C1核心板 // if(KEY_TEST1_Status == 0x00) //进入测试状态 // { // Dbg_Println(DBG_BIT_SYS_STATUS_bit,"BLY_C1_TEST START....\r\n"); // while(1) // { // if(SysTick_1ms - test_tick > 30000) //长时间没有进行测试便自动退出 // { // test_tick = SysTick_1ms; // temp_rev = ~temp_rev; // Dbg_Println(DBG_BIT_SYS_STATUS_bit,"BLY_C1_TEST END!!!\r\n"); // break; // } // // RTC_TASK(); // UART0_RECEIVE(); // rev = BLV_C1_TestData_Process(); // if(rev == 0x01) test_tick = SysTick_1ms; //有处理数据,将时间刷新 // } // } if(RTC_ReadDate(&RTC_Raw_Data)) { Dbg_Println(DBG_BIT_SYS_STATUS_bit,"RTC时间: 20%X-%X-%X %X:%X:%X 星期%X\r\n",RTC_Raw_Data.year,RTC_Raw_Data.month,RTC_Raw_Data.day,RTC_Raw_Data.hour,RTC_Raw_Data.minute,RTC_Raw_Data.second,RTC_Raw_Data.week); /*该时间计数,一分钟清零一次*/ Log_Time_ms = RTC_DATA_Type_Cast_DEC(RTC_Raw_Data.second)*1000; } #endif //USE_CORE_TYPE == CORE_TYPE_C1F /*正常APP*/ Dbg_Println(DBG_BIT_SYS_STATUS_bit,"BLY_Cx_APP Start %s...\r\n",SoftwareVer); #ifndef DBG_STATUS Dbg_Switch = 0x00;//0x09; //打开调试信息 #else Dbg_Switch = DBG_STATUS; //打开调试信息 #endif /*环境变量初始化*/ Environment_Variable_Init(); BLV_DevAction_AllData_Init(); TempPrompt_Fun_Init(); //2024-03-29 #if MQTT_EN // ALiYun_Machine_Init(&mqtt_info, NET485_PRODUCTKEY, NET485_DEVICE_NAME, NET485_DEVICE_SECRET, 120); //阿里云参数初始化 // MQTT_SET_SUB_Topic(&mqtt_info, NET485_SUBLISH); //设置订阅参数 // ALiYun_Machine_Init(&mqtt_info, FRG_PRODUCTKEY, FRG_DEVICE_NAME, FRG_DEVICE_SECRET, FRG_PUBLISH_ALIY, 120); //阿里云参数初始化 //MQTT_SET_SUB_Topic(&mqtt_info, FRG_SUBLISH); //设置订阅参数 // Dbg_Println(DBG_BIT_SYS_STATUS_bit,"MQTT_Flash_Parameter_Init:%d", MQTT_Flash_Parameter_Init(&mqtt_info)); //从flash获取参数初始化mqtt Dbg_Println(DBG_BIT_SYS_STATUS_bit,"ALIYUN_Flash_Parameter_Init:%d", ALIYUN_Flash_Parameter_Init(&mqtt_info)); //从flash获取参数初始化阿里云 #endif Dbg_Switch = 0x00; WDT_Init(); while(1) { WDT_Feed(); NetWork_Task(); //网络任务 #if MQTT_EN { Mqtt_Task(); //MQTT任务 2023-03-17 } #endif CH57xNET_MainTask(); /* CH57xNET库主任务函数,需要在主循环中不断调用 */ if(CH57xNET_QueryGlobalInt())CH57xNET_HandleGlobalInt(); /* 查询中断,如果有中断,则调用全局中断处理函数 */ /*正式任务*/ RTC_TASK(); Multipexing_IO_Task(); BLV_Authorize_Task(); //串口接收处理函数 UART0_RECEIVE(); UART1_RECEIVE(); UART2_RECEIVE(); UART3_RECEIVE(); BLV_BUS485Port_ModeTask(); BLV_PollPort_ModeTask(); BLV_ActivePort_ModeTask(); BLV_Nor_Dev_ModeTask(); Data_Receiving_Process(); // BLV_DEVICE_Action_Scan(); BLV_DevAction_Task(); BLV_DevDly_Task(); BLV_NETUpload_Logging_Task(); TempPrompt_Fun_Task(); //2024-03-29 LOG_Save_Global_Parameters(); //2025-09-09 添加 } } void Data_Receiving_Process(void) { uint16_t data_len = 0; // uint32_t pc_addr = 0; #if (USE_CORE_TYPE == 1) //使用C1F核心板 if(g_Uart[USART_1].RX_Buffer_WriteAddr != g_Uart[USART_1].RX_Buffer_ReadAddr) { data_len = SRAM_Read_Word(g_Uart[USART_1].RX_Buffer_ReadAddr); /*串口1数据处理*/ Dbg_Println(DBG_BIT_SYS_STATUS_bit,"USART_1 Revice Len:%d",data_len); // pc_addr = Find_Device_List_Information(DEV_PCTEST_TYPE,DEV_PCTEST_Addr); if(DevActionGlobal.pc_addr != 0x00) { BLV_PC_DEVICE_TEST_Data_Processing(DevActionGlobal.pc_addr,g_Uart[USART_1].RX_Buffer_ReadAddr+2,data_len); }else { Dbg_Println(DBG_BIT_SYS_STATUS_bit,"UART1 Data Len Fail"); } g_Uart[USART_1].RX_Buffer_ReadAddr += SRAM_Uart_Buffer_Size; if(g_Uart[USART_1].RX_Buffer_ReadAddr > SRAM_UART1_RecvBuffer_End_Addr) g_Uart[USART_1].RX_Buffer_ReadAddr = SRAM_UART1_RecvBuffer_Start_Addr; } #elif (USE_CORE_TYPE == 2) //使用C1核心板 if(g_Uart[USART_0].RX_Buffer_WriteAddr != g_Uart[USART_0].RX_Buffer_ReadAddr) { data_len = SRAM_Read_Word(g_Uart[USART_0].RX_Buffer_ReadAddr); /*串口0数据处理*/ Dbg_Println(DBG_BIT_SYS_STATUS_bit,"USART_0 Revice Len:%d",data_len); // pc_addr = Find_Device_List_Information(DEV_PCTEST_TYPE,DEV_PCTEST_Addr); if(DevActionGlobal.pc_addr != 0x00) { BLV_PC_DEVICE_TEST_Data_Processing(DevActionGlobal.pc_addr,g_Uart[USART_0].RX_Buffer_ReadAddr+2,data_len); }else { Dbg_Println(DBG_BIT_SYS_STATUS_bit,"UART0 Data Len Fail"); } g_Uart[USART_0].RX_Buffer_ReadAddr += SRAM_Uart_Buffer_Size; if(g_Uart[USART_0].RX_Buffer_ReadAddr > SRAM_UART0_RecvBuffer_End_Addr) g_Uart[USART_0].RX_Buffer_ReadAddr = SRAM_UART0_RecvBuffer_Start_Addr; } #endif //USE_CORE_TYPE == CORE_TYPE_C1F } void Environment_Variable_Init(void) { char temp_string[40] = {0}; UINT8 temp_vers[4] = {0}; uint32_t temp_unix = 0; uint8_t temp1 = 0,temp2 = 0,temp_save = 0; uint32_t temp_ProjectCode = 0; /*Launcher 版本 - MCU Flash 中 0x10000*/ MCU_Flash_Read((uint8_t *)temp_string,20,Launcher_SoftwareVer_Addr); SRAM_DMA_Write_Buff((uint8_t *)temp_string,20,SRAM_Launcher_SoftwareVer_Addr); Dbg_Println(DBG_BIT_SYS_STATUS_bit,"Launcher Version:%s",temp_string); LOG_LogicInfo_DebugRecord("Launcher Version:%s",temp_string); //打印当前使用的Launcher版本 LOG_LogicInfo_DebugRecord("APP Version:%s",SoftwareVer); //初始化环境变量 2025-09-08 从外部SRAM中读取全局变量信息 /*初始化日志TFTP起始地址*/ Dbg_Println(DBG_BIT_SYS_STATUS_bit,"SRAM_LOG_Start_Address:%08X",SRAM_Read_DW(SRAM_LOG_Start_Address)); Dbg_Println(DBG_BIT_SYS_STATUS_bit,"SRAM_TFTP_LOG_READ_Address:%08X",SRAM_Read_DW(SRAM_TFTP_LOG_READ_Address)); Dbg_Println(DBG_BIT_SYS_STATUS_bit,"SRAM_FLASH_LOG_READ_Address:%08X",SRAM_Read_DW(SRAM_FLASH_LOG_READ_Address)); temp1 = SRAM_Read_Byte(SRAM_LOGFlag_Reset_Source); temp2 = SRAM_Read_Byte(SRAM_LOGFlag_Addr_INIT); Dbg_Println(DBG_BIT_SYS_STATUS_bit,"Debug Switch:%08X",SRAM_Read_DW(SRAM_LOGFlag_Debug_Switch)); /*需要对Launcher4.4与 大于Launcher4.6 同时做兼容*/ if(temp1 == RST_FLAG_SW) { SRAM_Write_DW(0x01,SRAM_LOG_RCU_Reboot_Reason); Dbg_Println(DBG_BIT_SYS_STATUS_bit,"软件复位!"); } else if(temp1 == RST_FLAG_RPOR) { SRAM_Write_DW(0x02,SRAM_LOG_RCU_Reboot_Reason); Dbg_Println(DBG_BIT_SYS_STATUS_bit,"上电复位RPOR!"); } else if(temp1 == RST_FLAG_MR) { SRAM_Write_DW(0x03,SRAM_LOG_RCU_Reboot_Reason); Dbg_Println(DBG_BIT_SYS_STATUS_bit,"外部手动复位!"); } else if(temp1 == RST_FLAG_GPWSM) { SRAM_Write_DW(0x04,SRAM_LOG_RCU_Reboot_Reason); Dbg_Println(DBG_BIT_SYS_STATUS_bit,"从下电模式唤醒时的复位GRWSM!"); } else if( (temp2 == 0x03) || ((temp1 == RST_FLAG_WTR) && (temp2 == 0x02)) ) { /*如果Launcher的版本是处于版本V04.4以下的,不管任何复位都是看门狗复位, Launcher版本为V04.7的,看门狗复位才是真是的看门狗复位 目前发布的Launcher版本大致有: Launcher_C1F_V04 Launcher_C1F_V04.4 Launcher_C1F_V04.7 */ if(strncmp((char *)temp_string,"Launcher_C1F_V04.7",strlen("Launcher_C1F_V04.7")) == 0x00) { SRAM_Write_DW(0x05,SRAM_LOG_RCU_Reboot_Reason); }else{ SRAM_Write_DW(0x06,SRAM_LOG_RCU_Reboot_Reason); } Dbg_Println(DBG_BIT_SYS_STATUS_bit,"看门狗超时复位!"); } else { SRAM_Write_DW(0x07,SRAM_LOG_RCU_Reboot_Reason); /*情况不符,重新清楚日志地址*/ Set_Log_Current_Address(SRAM_LOG_DATA_Address); SRAM_Set_TFTP_READ_LOG_Address(SRAM_LOG_DATA_Address); SRAM_Set_FLASH_READ_LOG_Address(SRAM_LOG_DATA_Address); SRAM_Write_DW(0x00,SRAM_LOGFlag_Debug_Switch); Dbg_Println(DBG_BIT_SYS_STATUS_bit,"LOG Flag Error!%02x %02x",temp1,temp2); } SRAM_Write_DW(0x00,SRAM_LOGFlag_Reset_Source); SRAM_Write_DW(0x00,SRAM_LOGFlag_Addr_INIT); Read_Flash_Register_Data(); //读取Flash中映射寄存器数据 /*读取逻辑文件信息 - test*/ temp1 = Read_LogicFile_Information(0x01,(uint8_t *)temp_string); if(temp1 == 0x00) { Dbg_Println(DBG_BIT_SYS_STATUS_bit,"配置文件发布作者:%s",temp_string); LOG_LogicInfo_DebugRecord("配置文件发布作者:%s",temp_string); } temp1 = Read_LogicFile_Information(0x02,(uint8_t *)temp_string); if(temp1 == 0x00) { Dbg_Println(DBG_BIT_SYS_STATUS_bit,"配置软件版本:%d-%d-%d-%d",temp_string[0],temp_string[1],temp_string[2],temp_string[3]); LOG_LogicInfo_DebugRecord("配置软件版本:%d-%d-%d-%d",temp_string[0],temp_string[1],temp_string[2],temp_string[3]); } temp1 = Read_LogicFile_Information(0x03,(uint8_t *)temp_string); if(temp1 == 0x00) { Dbg_Println(DBG_BIT_SYS_STATUS_bit,"逻辑发布时间: %04d-%02d-%02d %02d:%02d:%02d \r\n",(temp_string[0]*256+temp_string[1]),temp_string[2],temp_string[3],temp_string[4],temp_string[5],temp_string[6]); LOG_LogicInfo_DebugRecord("逻辑发布时间: %04d-%02d-%02d %02d:%02d:%02d \r\n",(temp_string[0]*256+temp_string[1]),temp_string[2],temp_string[3],temp_string[4],temp_string[5],temp_string[6]); } temp1 = Read_LogicFile_Information(0x04,(uint8_t *)temp_string); if(temp1 == 0x00) { Dbg_Println(DBG_BIT_SYS_STATUS_bit,"酒店名称:%s",temp_string); LOG_LogicInfo_DebugRecord("酒店名称:%s",temp_string); } temp1 = Read_LogicFile_Information(0x06,(uint8_t *)temp_string); if(temp1 == 0x00) { Dbg_Println(DBG_BIT_SYS_STATUS_bit,"酒店分组:%s",temp_string); LOG_LogicInfo_DebugRecord("酒店分组:%s",temp_string); } temp1 = Read_LogicFile_Information(0x07,(uint8_t *)temp_string); if(temp1 == 0x00) { Dbg_Println(DBG_BIT_SYS_STATUS_bit,"房型别名:%s",temp_string); LOG_LogicInfo_DebugRecord("房型别名:%s",temp_string); } /*读取项目编码 配置版本 MAC地址*/ ProjectCode = SRAM_Read_DW(SRAM_Register_Start_ADDRESS + Register_ProjectCode_OFFSET); temp1 = Read_LogicFile_Information(0x05,(uint8_t *)temp_string); if(temp1 == 0x00) { temp_ProjectCode = temp_string[3]; temp_ProjectCode<<=8; temp_ProjectCode |= temp_string[2]; temp_ProjectCode<<=8; temp_ProjectCode |= temp_string[1]; temp_ProjectCode<<=8; temp_ProjectCode |= temp_string[0]; //Flash中保存的项目编码与逻辑文件中的项目编码不符,以逻辑文件中项目编码为准。 if(temp_ProjectCode != ProjectCode) { Dbg_Println(DBG_BIT_SYS_STATUS_bit,"逻辑文件项目编码与程序保存项目编码不同"); ProjectCode = temp_ProjectCode; SRAM_Write_DW(temp_ProjectCode,SRAM_Register_Start_ADDRESS + Register_ProjectCode_OFFSET); temp_save = 0x01; } }else { if(ProjectCode == 0xFFFFFFFF) //未配置项目编码,使用默认值 { Dbg_Println(DBG_BIT_SYS_STATUS_bit,"项目编码采用默认值"); ProjectCode = 1182; //项目编码 - 默认值 } } SRAM_Read_Buff(temp_vers,4,SRAM_Register_Start_ADDRESS + Register_ConfigVersion_OFFSET); temp1 = Read_LogicFile_Information(0x08,(uint8_t *)temp_string); if(temp1 == 0x00) { if((temp_vers[0] != temp_string[0]) || (temp_vers[1] != temp_string[1]) || (temp_vers[2] != temp_string[2])) { Dbg_Println(DBG_BIT_SYS_STATUS_bit,"逻辑文件版本号不同"); temp_vers[3] = 0x00; //该字节没用 memcpy(temp_vers, temp_string, 3); memcpy(Versions, temp_vers, 3); //将配置软件版本 - 3Byte SRAM_Write_Buff(temp_vers,4,SRAM_Register_Start_ADDRESS + Register_ConfigVersion_OFFSET); temp_save = 0x01; }else { memcpy(Versions, temp_vers, 3); //将配置软件版本 - 3Byte } } /*2022-11-17 初始化TFTP日志标记*/ SRAM_Write_DW(SYS_Log_Switch,SRAM_Register_Start_ADDRESS + Register_TFTPStatus_OFFSET); /*2022-11-17*/ SRAM_Write_DW(SRAM_UDP_RecvData_Startaddr,SRAM_UDP_RecvData_Writeaddr); //2024-02-23 避免上电后,地址错误导致复位 SRAM_Read_Buff(temp_vers, 4, SRAM_Register_Start_ADDRESS + Register_NETMACKADDR_OFFSET); if(temp_vers[0] == 0xFF && temp_vers[1] == 0xFF && temp_vers[2] == 0xFF && temp_vers[3] == 0xFF) //未配置MAC地址,使用默认值 { } else { memcpy(&MACAddr[2], temp_vers, 4); //将MAC修改为配置值 } /*读取授权时间 与 锁定状态*/ temp_unix = SRAM_Read_DW(SRAM_Register_Start_ADDRESS + Register_MandateExpiresTime_OFFSET); temp1 = SRAM_Read_Byte(SRAM_Register_Start_ADDRESS + Register_MandateLock_OFFSET); if(temp1 != 0x01) temp1 = 0x00; Dbg_Println(DBG_BIT_SYS_STATUS_bit,"Mandate UNIX:%ld,Lock_state:%02x",temp_unix,temp1); BLV_Set_Authorize_Status(temp_unix,temp1); /* C1 不需要读取时间,因为有RTC时间 C1F - 从Flash中读取MCU当前时间 - C1F没有RTC时间,需要定期保存时间到Flash中,同时会定期向服务器要数据*/ #if (USE_CORE_TYPE == 1) //使用C1F核心板 #elif (USE_CORE_TYPE == 2) //使用C1核心板 temp_unix = SRAM_Read_DW(SRAM_Register_Start_ADDRESS + Register_CurrentUsageTime_OFFSET); Unix_Conversion_To_RTC(&w_rtc,temp_unix); #endif //寄存器参数有改变,重新保存一下 if(temp_save == 0x01) Retain_Flash_Register_Data(); Dbg_Println(DBG_BIT_SYS_STATUS_bit,"ProjectCode:%d",ProjectCode); Dbg_Println(DBG_BIT_SYS_STATUS_bit,"Versions:%02X.%02X.%02X.%02X",Versions[3],Versions[2],Versions[1],Versions[0]); Dbg_Println(DBG_BIT_SYS_STATUS_bit,"MACAddr:%02X.%02X.%02X.%02X.%02X.%02X",MACAddr[0],MACAddr[1],MACAddr[2],MACAddr[3],MACAddr[4],MACAddr[5]); Dbg_Println(DBG_BIT_SYS_STATUS_bit,"SYS UNIX:%ld",temp_unix); //初始化设备上报缓冲区 - 2025-10-21 SRAM_Write_DW(SRAM_UDP_SendData_Startaddr,SRAM_UDP_SendData_Writeaddr); SRAM_Write_DW(SRAM_UDP_SendData_Startaddr,SRAM_UDP_SendData_Readaddr); //初始化设备故障缓冲区 - 2025-10-21 SRAM_Write_DW(SRAM_DEVICE_ONLINE_STATE_START_ADDR,SRAM_DEVICE_ONLINE_STATE_WRITE_ADDR); SRAM_Write_DW(SRAM_DEVICE_ONLINE_STATE_START_ADDR,SRAM_DEVICE_ONLINE_STATE_READ_ADDR); //上电初始化环境值 SRAM_Write_Byte(0x00,SRAM_UDP_ELEReport_Action); SRAM_Write_Byte(0x00,SRAM_UDP_ELEReport_EleState); SRAM_Write_Byte(0x00,SRAM_UDP_ELEReport_EleState_Last); SRAM_Write_Byte(0x00,SRAM_UDP_ELEReport_CardState); SRAM_Write_Byte(0x00,SRAM_UDP_ELEReport_CardState_Last); SRAM_Write_Byte(0x00,SRAM_UDP_ELEReport_CardType); SRAM_Write_Byte(0x00,SRAM_UDP_ELEReport_CardType_Last); SRAM_Write_Byte(0x00,SRAM_UDP_ELEReport_VirtualCard); SRAM_Write_Byte(0x00,SRAM_UDP_ELEReport_VirtualCard_Last); SRAM_Write_Byte(0x00,SRAM_UDP_Report_CarbonSatet); SRAM_Write_DW(0x00,SRAM_UDP_ELEReport_EleState_Tick); SRAM_Write_DW(0x00,SRAM_UDP_ELEReport_CardState_Tick); SRAM_Write_DW(0x00,SRAM_UDP_ELEReport_CardType_Tick); SRAM_Write_DW(0x00,SRAM_UDP_ELEReport_VirtualCard_Tick); } void BLV_Authorize_Task(void) { static uint32_t sys_tick = 0; uint32_t temp_unix = 0,curr_unix = 0; // char tembuf[16]; if(SysTick_1ms - sys_tick > 10000) { sys_tick = SysTick_1ms; Dbg_Println(DBG_BIT_SYS_STATUS_bit,"RTC时间: 20%02X-%02X-%02X %02X:%02X:%02X 星期%X",RTC_Raw_Data.year,RTC_Raw_Data.month,RTC_Raw_Data.day,RTC_Raw_Data.hour,RTC_Raw_Data.minute,RTC_Raw_Data.second,RTC_Raw_Data.week); temp_unix = RTC_Conversion_To_Unix(&RTC_Raw_Data); BLV_Authorize_Processing(temp_unix); if(Get_Authorize_Lock_Status() == 0x01) { if(SRAM_Read_Byte(SRAM_Service_Take_Electricity_State) != 0x02) { SRAM_Write_Byte(0x02,SRAM_Service_Take_Electricity_State); Dbg_Println(DBG_BIT_SYS_STATUS_bit,"MCU断电"); } Dbg_Println(DBG_BIT_SYS_STATUS_bit,"MCU授权到期:%08X now:%08X-----",Get_Authorize_UnixTime(),temp_unix); } // memset(tembuf,0,16); // SRAM_Read_Buff((uint8_t *)tembuf,16,SRAM_Register_Start_ADDRESS + Register_RoomNumNote_OFFSET); // Dbg_Println(DBG_BIT_SYS_STATUS_bit,"%04d_%s_20%02X%02X%02X%02X%02X%02X.txt",ProjectCode,tembuf,RTC_Raw_Data.year,RTC_Raw_Data.month,RTC_Raw_Data.day,RTC_Raw_Data.hour,RTC_Raw_Data.minute,RTC_Raw_Data.second); /*运行操作12时间保存,将时间保存到Flash中*/ curr_unix = SRAM_Read_DW(SRAM_Register_Start_ADDRESS + Register_CurrentUsageTime_OFFSET); if(temp_unix - curr_unix > 43200) { SRAM_Write_DW(temp_unix,SRAM_Register_Start_ADDRESS + Register_CurrentUsageTime_OFFSET); Retain_Flash_Register_Data(); } } } /******************************************************************************* * Function Name : BLV_NETUpload_Logging_Task * Description : 网络上传日志任务 - 定期上传数据和存储数据达到一定量 * Input : None * Return : None *******************************************************************************/ void BLV_NETUpload_Logging_Task(void) { uint32_t log_addrs = 0,log_addrs1 = 0,log_data_len = 0; static uint32_t log_upload_tick = 0; static uint8_t Log_upload_state = 0; static uint8_t Log_upload_flag = 0; // static uint8_t Log_TFTP_DNS_num = 0; /*2022-11-17 start 1.服务器设置日志上报状态 2.主机运行3000h关闭日志上报*/ static uint32_t Log_switch_tick = 0; static uint32_t Log_close_tick = 0; static uint32_t close_hour = 0; if(SysTick_1s - Log_switch_tick > 15) { Log_switch_tick = SysTick_1s; if(SRAM_Read_DW(SRAM_Register_Start_ADDRESS + Register_TFTPStatus_OFFSET)!=SYS_Log_Switch) { Dbg_Println(DBG_BIT_SYS_STATUS_bit,"TFTP LOG Change,SRAM:%08X--SYS_Log_Switch:%08X",\ SRAM_Read_DW(SRAM_Register_Start_ADDRESS + Register_TFTPStatus_OFFSET),SYS_Log_Switch); SYS_Log_Switch = SRAM_Read_DW(SRAM_Register_Start_ADDRESS + Register_TFTPStatus_OFFSET); LOG_LogicInfo_DebugRecord("TFTP LOG Change,SRAM:%08X--SYS_Log_Switch:%08X",\ SRAM_Read_DW(SRAM_Register_Start_ADDRESS + Register_TFTPStatus_OFFSET),SYS_Log_Switch); } // else // { // Dbg_Println(DBG_BIT_SYS_STATUS_bit,"TFTP LOG SAME,SRAM:%08X--SYS_Log_Switch:%08X\n",\ // SRAM_Read_DW(SRAM_Register_Start_ADDRESS + Register_TFTPStatus_OFFSET),SYS_Log_Switch); // } } /*2024-04-08 start*/ if(SysTick_1s - Log_close_tick > 86400) //24h记录一次 { Log_close_tick = SysTick_1s; close_hour = SRAM_Read_DW(SRAM_Register_Start_ADDRESS + Register_TFTPUploadTime_OFFSET); close_hour += 24; SRAM_Write_DW(close_hour,SRAM_Register_Start_ADDRESS + Register_TFTPUploadTime_OFFSET); if(close_hour >= tftp_log.Time) { SYS_Log_Switch = 0x00; Dbg_Println(DBG_BIT_SYS_STATUS_bit,"TFTP LOG OverTime Stop Report!!!!"); SRAM_Write_DW(SYS_Log_Switch,SRAM_Register_Start_ADDRESS + Register_TFTPStatus_OFFSET); LOG_LogicInfo_DebugRecord("TFTP LOG OverTime Stop Report!!!!"); } } /*2024-04-08 end*/ if(SysTick_1s - test_tick >= 300) { test_tick = SysTick_1s; // if(server_info.tftp_dns_flag != 0x01) return ; //TFTP 域名解析失败,任务直接结束 Dbg_Println(DBG_BIT_SYS_STATUS_bit,"TFTP Log start....\r\n"); /*判断日志不为空,开始保存日志文件*/ log_addrs = SRAM_Get_TFTP_READ_Log_Address(); //TFTP读取日志地址 log_addrs1 = Get_Log_Current_Address(); //日志当前地址 if(log_addrs1 > log_addrs) { log_data_len = log_addrs1 - log_addrs; }else if(log_addrs1 < log_addrs) { log_data_len = SRAM_LOG_End_Address - log_addrs; log_data_len += log_addrs1 - SRAM_LOG_DATA_Address; }else if(log_addrs1 == log_addrs) { return ; } if((log_data_len >= TFTP_LOG_Exceed_Size) || (SysTick_1s - log_upload_tick > TFTP_LOG_Exceed_Time)) //日志上报条件 { Log_upload_flag = 0x01; Log_upload_state = 0x01; // Log_TFTP_DNS_num = 0; server_info.dns_sta = DNS_INIT; Dbg_Println(DBG_BIT_SYS_STATUS_bit,"TFTP Log start 解析域名..."); /*正常应该先判断*/ } } /*日志达到传输条件,*/ if(Log_upload_flag) { switch(Log_upload_state) { case 0x01: //开始DNS域名解析TFTP日志传输地址,解析成功开始上传日志 #if TFTP_DNS_EN { UINT8 ret = DnsQuery_Task(&net_info.SocketId[2], (UINT8*)TFTPSERVER_NAME_DNS, server_info.tftp_ip); /* DNS查询 */ if(ret == 1) { if((server_info.tftp_ip[0] == 0x00) && (server_info.tftp_ip[1] == 0x00)) //无效地址 { Dbg_Println(DBG_BIT_NET_STATUS_bit,"DNS 无效地址"); Log_TFTP_DNS_num++; if(Log_TFTP_DNS_num > 5) { Log_TFTP_DNS_num = 0; if(dns_buf) { free(dns_buf); //释放DNS空间 dns_buf = NULL; } /*域名解析失败,这次就不传输了。等待之后尝试*/ Log_upload_state = 0; Log_upload_flag = 0; Dbg_Println(DBG_BIT_NET_STATUS_bit,"TFTP IP DNS失败"); } }else{ Log_upload_state = 0x02; server_info.tftp_dns_flag = 0x01; if(dns_buf) { free(dns_buf); //释放DNS空间 dns_buf = NULL; } } }else if(ret == 2) { Dbg_Println(DBG_BIT_NET_STATUS_bit,"TFTP IP DNS超时"); Log_TFTP_DNS_num++; if(Log_TFTP_DNS_num > 5) { Log_TFTP_DNS_num = 0; if(dns_buf) { free(dns_buf); //释放DNS空间 dns_buf = NULL; } /*域名解析失败,这次就不传输了。等待之后尝试*/ Log_upload_state = 0; Log_upload_flag = 0; Dbg_Println(DBG_BIT_NET_STATUS_bit,"TFTP IP DNS失败"); } } } #else Log_upload_state = 0x02; #endif break; case 0x02: //开始日志传输 log_addrs = SRAM_Get_TFTP_READ_Log_Address(); //TFTP读取日志地址 log_addrs1 = Get_Log_Current_Address(); //日志当前地址 if(IAPVarTypeStruct_Ptr == NULL) { log_upload_tick = SysTick_1s; Dbg_Println(DBG_BIT_SYS_STATUS_bit,"分配升级参数空间!"); IAPVarTypeStruct_Ptr = (IAPVarTypeStruct*)malloc(sizeof(IAPVarTypeStruct)); //分配空间 memset(IAPVarTypeStruct_Ptr, 0, sizeof(IAPVarTypeStruct)); IAPVarTypeStruct_Ptr->IapType = IAPTFTPLOG; IAPVarTypeStruct_Ptr->IapState = IAPSTART; IAPVarTypeStruct_Ptr->FlashWriteAddress = log_addrs1; //同时保存写入地址 /*同时将日志写入起始地址与结束地址保存起来*/ Dbg_Println(DBG_BIT_SYS_STATUS_bit,"log_addrs:%08X log_addrs1:%08X",log_addrs,log_addrs1); SRAM_Set_SD_LOG_READ_Start_Address(log_addrs); SRAM_Set_SD_LOG_READ_End_Address(IAPVarTypeStruct_Ptr->FlashWriteAddress); }else { Dbg_Println(DBG_BIT_SYS_STATUS_bit,"IAP参数空间未释放..."); if(IAPVarTypeStruct_Ptr->IapState != IAPSTART) //当前IAP不在处理中 { IAPVarTypeStruct_Ptr->IapType = IAPTFTPLOG; IAPVarTypeStruct_Ptr->IapState = IAPSTART; IAPVarTypeStruct_Ptr->FlashWriteAddress = log_addrs1; //同时保存写入地址 /*同时将日志写入起始地址与结束地址保存起来*/ Dbg_Println(DBG_BIT_SYS_STATUS_bit,"log_addrs:%08X log_addrs1:%08X \r\n",log_addrs,log_addrs1); SRAM_Set_SD_LOG_READ_Start_Address(log_addrs); SRAM_Set_SD_LOG_READ_End_Address(IAPVarTypeStruct_Ptr->FlashWriteAddress); }else { switch(IAPVarTypeStruct_Ptr->IapType) { case IAPTFTPLOG: Dbg_Println(DBG_BIT_SYS_STATUS_bit,"IAP日志数据上报处理中..."); break; case IAPTFTPREAD: Dbg_Println(DBG_BIT_SYS_STATUS_bit,"IAP云端升级处理中..."); break; case IAPTFTPWRITE: Dbg_Println(DBG_BIT_SYS_STATUS_bit,"IAP局域网升级处理中..."); break; default: Dbg_Println(DBG_BIT_SYS_STATUS_bit,"IAP Error : %X",IAPVarTypeStruct_Ptr->IapType); break; } } } Log_upload_state = 0; Log_upload_flag = 0; break; default: Log_upload_state = 0; Log_upload_flag = 0; break; } } } /******************************************************************************* * Function Name : MCU_Flash_Read * Description : MCU Flash数据读取函数 * Input : pBuffer:写入数据 NumByteToWrite:写入数据长度 -- 写入长度必须为4的倍速 writeAddr:写入地址 codeflash: startAddr - 0x00000000 size - 0x3E800 dataflash: startAddr - 0x3E800(DATA_FLASH_ADDR) size - 0x0800(DATA_FLASH_SIZE) *******************************************************************************/ void MCU_Flash_Read(uint8_t* pBuffer,uint16_t NumByteToRead,uint32_t ReadAddr) { PUINT32 p32; uint16_t i = 0; p32 = (PUINT32)(ReadAddr); for(i = 0;i