203 lines
6.7 KiB
C
203 lines
6.7 KiB
C
/*
|
||
* 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;
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
|