- 新增VSCode编辑器配置,启用保存时自动格式化 - 新增DMA2_Stream5和USART1中断处理函数,优化SPI传输性能 - 移除TIM1相关配置和性能监控模块,简化系统架构 - 优化GPIO配置,将ADC_SYNC和PA8引脚合并配置 - 简化系统监控模块,仅保留采样计数和数据溢出统计 - 优化SPI配置,使用16位数据宽度并提高DMA优先级 - 提高USART波特率(USART1:2Mbps, USART3:921600bps) - 优化LTC2508驱动,增加初始化状态检查和缓冲区大小 - 修正数据存储模块,使用校正数据包而非校正结果结构体 - 优化RS485驱动,使用中断传输并添加传输完成回调 - 更新IOC配置文件,移除TIM1并调整中断优先级配置 - 新增系统监控简化说明文档,详细记录架构变更
106 lines
2.9 KiB
C
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;
|
|
}
|