STM_ATEM/User/data_packet.c
zhoujie fee2e96eaa feat(system): 优化系统性能并简化监控模块
- 新增VSCode编辑器配置,启用保存时自动格式化
- 新增DMA2_Stream5和USART1中断处理函数,优化SPI传输性能
- 移除TIM1相关配置和性能监控模块,简化系统架构
- 优化GPIO配置,将ADC_SYNC和PA8引脚合并配置
- 简化系统监控模块,仅保留采样计数和数据溢出统计
- 优化SPI配置,使用16位数据宽度并提高DMA优先级
- 提高USART波特率(USART1:2Mbps, USART3:921600bps)
- 优化LTC2508驱动,增加初始化状态检查和缓冲区大小
- 修正数据存储模块,使用校正数据包而非校正结果结构体
- 优化RS485驱动,使用中断传输并添加传输完成回调
- 更新IOC配置文件,移除TIM1并调整中断优先级配置
- 新增系统监控简化说明文档,详细记录架构变更
2026-02-06 22:45:25 +08:00

106 lines
2.9 KiB
C

#include "data_packet.h"
#include "stddef.h"
#include "stm32f4xx_hal.h"
// CRC16-MODBUS算法实现
uint16_t Calculate_CRC16(const uint8_t *data, uint16_t len) {
uint16_t crc = 0xFFFF;
for (uint16_t i = 0; i < len; i++) {
crc ^= data[i];
for (uint8_t j = 0; j < 8; j++) {
if (crc & 0x0001) {
crc = (crc >> 1) ^ 0xA001;
} else {
crc = crc >> 1;
}
}
}
return crc;
}
void PackData(DataPacket_t *packet, int32_t adc1, int32_t adc2, int32_t adc3)
{
if (packet == NULL) return;
// 设置包头
packet->start_byte = PACKET_START_BYTE;
// 设置时间戳
packet->timestamp = HAL_GetTick();
// 设置ADC数据
packet->adc_data1 = adc1;
packet->adc_data2 = adc2;
packet->adc_data3 = adc3;
// 计算校验和 (不包括校验和字段本身和包尾)
uint16_t checksum = Calculate_CRC16((uint8_t*)packet,
sizeof(DataPacket_t) - sizeof(packet->checksum) - sizeof(packet->end_byte));
packet->checksum = checksum;
// 设置包尾
packet->end_byte = PACKET_END_BYTE;
}
uint8_t ValidatePacket(const DataPacket_t *packet)
{
if (packet == NULL) return 0;
// 检查包头
if (packet->start_byte != PACKET_START_BYTE) return 0;
// 检查包尾
if (packet->end_byte != PACKET_END_BYTE) return 0;
// 验证校验和
uint16_t calculated_crc = Calculate_CRC16((uint8_t*)packet,
sizeof(DataPacket_t) - sizeof(packet->checksum) - sizeof(packet->end_byte));
if (calculated_crc != packet->checksum) return 0;
return 1; // 验证通过
}
uint8_t ValidateCorrectedPacket(const CorrectedDataPacket_t *packet)
{
if (packet == NULL) return 0;
// 检查包头
if (packet->start_byte != PACKET_START_BYTE) return 0;
// 检查包尾
if (packet->end_byte != PACKET_END_BYTE) return 0;
// 验证校验和
uint16_t calculated_crc = Calculate_CRC16((uint8_t*)packet,
sizeof(CorrectedDataPacket_t) - sizeof(packet->checksum) - sizeof(packet->end_byte));
if (calculated_crc != packet->checksum) return 0;
return 1; // 验证通过
}
void PackCorrectedData(CorrectedDataPacket_t *packet, float x, float y, float z)
{
if (packet == NULL) return;
// 设置包头
packet->start_byte = PACKET_START_BYTE;
// 设置时间戳
packet->timestamp = HAL_GetTick();
// 设置校正后数据
packet->corrected_x = x;
packet->corrected_y = y;
packet->corrected_z = z;
// 计算校验和
uint16_t checksum = Calculate_CRC16((uint8_t*)packet,
sizeof(CorrectedDataPacket_t) - sizeof(packet->checksum) - sizeof(packet->end_byte));
packet->checksum = checksum;
// 设置包尾
packet->end_byte = PACKET_END_BYTE;
}