Files
RCU_C1P_Launcher/MCU_Driver/rw_logging.c
caocong 094fd76a72 新增:首次提交
首次提交,上传Launcher工程
2026-01-05 09:40:42 +08:00

203 lines
6.7 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*
* 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<len;i++)
{
data_sum += SRAM_Read_Byte(addr+i);
}
return ~data_sum;
}
/*******************************************************************************
* Function Name : Data_CheckSum
* Description : 和校验取反
*******************************************************************************/
uint8_t Data_CheckSum(uint8_t* data,uint16_t len)
{
uint8_t data_sum = 0;
for(uint16_t i = 0;i<len;i++)
{
data_sum += data[i];
}
return ~data_sum;
}
/*******************************************************************************
* Function Name : Get_Log_Current_Address
* Description : 获取SRAM中日志当前写入地址
*******************************************************************************/
uint32_t Get_Log_Current_Address(void)
{
uint32_t rev = 0;
uint8_t read_buff[4] = {0};
SRAM_DMA_Read_Buff(read_buff,0x04,SRAM_LOG_WRITE_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 : 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;
}