/* * rw_logging.c * * Created on: Jul 29, 2025 * Author: cc */ #include "includes.h" /******************************************************************************* * Function Name : Log_CheckSum * Description : 和校验取反,数据内容从SRAM中读取 *******************************************************************************/ uint8_t Log_CheckSum(uint32_t addr,uint8_t len) { uint8_t data_sum = 0; for(uint8_t i = 0;i SRAM_LOG_End_Address)) rev = SRAM_LOG_DATA_Address; return rev; } /******************************************************************************* * Function Name : Set_Log_Current_Address * Description : 设置SRAM中日志当前写入地址 *******************************************************************************/ void Set_Log_Current_Address(uint32_t W_addr) { uint32_t Last_addr = W_addr; uint8_t write_buff[4] = {0}; if((Last_addr < SRAM_LOG_DATA_Address) || (Last_addr > SRAM_LOG_End_Address)) Last_addr = SRAM_LOG_DATA_Address; write_buff[0] = (uint8_t)(Last_addr & 0xFF); write_buff[1] = (uint8_t)((Last_addr >> 8) & 0xFF); write_buff[2] = (uint8_t)((Last_addr >> 16) & 0xFF); write_buff[3] = (uint8_t)((Last_addr >> 24) & 0xFF); SRAM_DMA_Write_Buff(write_buff,0x04,SRAM_LOG_WRITE_Address); } /******************************************************************************* * Function Name : SRAM_Get_READ_Log_Address * Description : 获取SRAM中当前读日志地址 *******************************************************************************/ uint32_t SRAM_Get_READ_Log_Address(void) { uint32_t rev = 0; uint8_t read_buff[4] = {0}; SRAM_DMA_Read_Buff(read_buff,0x04,SRAM_LOG_READ_Address); rev = read_buff[3]; rev <<= 8; rev |= read_buff[2]; rev <<= 8; rev |= read_buff[1]; rev <<= 8; rev |= read_buff[0]; if((rev < SRAM_LOG_DATA_Address) || (rev > SRAM_LOG_End_Address)) rev = SRAM_LOG_DATA_Address; return rev; } /******************************************************************************* * Function Name : SRAM_Set_READ_LOG_Address * Description : 设置SRAM中当前读日志地址 *******************************************************************************/ void SRAM_Set_READ_LOG_Address(uint32_t r_addr) { uint32_t Last_addr = r_addr; uint8_t write_buff[4] = {0}; if((Last_addr < SRAM_LOG_DATA_Address) || (Last_addr > SRAM_LOG_End_Address)) Last_addr = SRAM_LOG_DATA_Address; write_buff[0] = (uint8_t)(Last_addr & 0xFF); write_buff[1] = (uint8_t)((Last_addr >> 8) & 0xFF); write_buff[2] = (uint8_t)((Last_addr >> 16) & 0xFF); write_buff[3] = (uint8_t)((Last_addr >> 24) & 0xFF); SRAM_DMA_Write_Buff(write_buff,0x04,SRAM_LOG_READ_Address); } /******************************************************************************* * Function Name : 日志保存功能 * Description : 日志每一个小时将SRAM中的日志数据进行封装, 封装就只是加上包头包尾及当前的年月日时, *******************************************************************************/ uint8_t Log_write_sram(uint8_t data_type,uint8_t *buff,uint16_t len) { uint32_t Last_add = 0; uint8_t temp = 0,temp_len = 0,temp_number = 0; uint8_t temp_buff[20] = {0}; uint16_t data_len = len,temp_date = 0,write_len = 0; uint32_t Log_Hour_Tick = SysTick_1ms - Log_Time_ms; //2021-09-23 Log_Time_ms该变量在中断中有进行写操作,防止出错,禁止全局变量在中断与while中同时读写 Log_Hour_Tick += (uint32_t)HEX_Conversion_To_DEC(RTC_Raw_Data.minute)*60000; Log_Hour_Tick += (uint32_t)HEX_Conversion_To_DEC(RTC_Raw_Data.hour)*3600000; if(data_len >= Log_Data_Len_MAX) data_len = Log_Data_Len_MAX; //限定数据长度 write_len = S_Log_Data + data_len + 1; /*第一步:读取日志写入地址 与 日志编号*/ SRAM_DMA_Read_Buff(temp_buff,0x0A,SRAM_LOG_WRITE_Address); Last_add = temp_buff[3]; //读取日志写入地址 Last_add <<= 8; Last_add |= temp_buff[2]; Last_add <<= 8; Last_add |= temp_buff[1]; Last_add <<= 8; Last_add |= temp_buff[0]; temp_number = temp_buff[8]; //读取日志编号 //当前地址是否有效,并且可以将该日志保存 if((Last_add + write_len) >= SRAM_LOG_End_Address) { Last_add = SRAM_LOG_DATA_Address; } /*第二步:按照指定格式保存日志*/ temp_buff[temp_len++] = LOG_Data_Hand; //数据头 temp_buff[temp_len++] = temp_buff[8]; //数据序列号 temp_buff[temp_len++] = write_len; //数据长度 2Byte temp_buff[temp_len++] = (write_len >> 8) & 0xFF; temp_buff[temp_len++] = 0x00; temp_date = (HEX_Conversion_To_DEC(RTC_Raw_Data.year) << 10) + (HEX_Conversion_To_DEC(RTC_Raw_Data.month) << 5) + HEX_Conversion_To_DEC(RTC_Raw_Data.day); temp_buff[temp_len++] = (temp_date >> 8) & 0xFF; temp_buff[temp_len++] = temp_date & 0xFF; temp_buff[temp_len++] = data_type; temp_buff[temp_len++] = Log_Hour_Tick & 0xFF; temp_buff[temp_len++] = (Log_Hour_Tick >> 8) & 0xFF; temp_buff[temp_len++] = (Log_Hour_Tick >> 16) & 0xFF; temp_buff[temp_len++] = (Log_Hour_Tick >> 24) & 0xFF; SRAM_DMA_Write_Buff(temp_buff,S_Log_Data,Last_add); //数据 SRAM_DMA_Write_Buff(buff,data_len,Last_add + S_Log_Data); //数据 SRAM_Write_Byte(Log_Data_End,Last_add + S_Log_Data + data_len); //数据尾 /*计算数据校验*/ temp = Log_CheckSum(Last_add,write_len); SRAM_Write_Byte(temp,Last_add + S_Log_Check); //校验值 /*第三:刷新日志写入地址 以及日志序号*/ Last_add = Last_add + write_len; Set_Log_Current_Address(Last_add); if(temp_number >= 0xFF) { temp_number = 0x00; }else { temp_number++; } SRAM_Write_Byte(temp_number,SRAM_LOG_Serial_Number); //数据尾 return 0; }