- 新增光泵磁力仪驱动模块,通过 USART2 中断接收 BCD 编码数据,采样率 115200bps - 重构数据包架构:引入标准包与扩展包(含光泵数据)两种类型,通过帧头魔数区分 - 新增 DataPacketWithOptic_t、CorrectedDataPacketWithOptic_t 两种扩展数据包类型 - 数据存储改为通用字节流写入(方案Y),支持任意包类型混流存储 - 将编译期配置集中到 app_config.h,包括 UART 输出、SD 存储、GPS 位置等开关 - 移除 ADC_SYNC GPIO 引脚配置,释放 PA2 用于 USART2_TX - 主循环 ProcessAdcData 改为按需选择数据包类型,光泵数据快照在 ADC 中断前完成 - 新增 USART2 错误回调处理,支持接收异常时自动恢复
71 lines
2.0 KiB
C
71 lines
2.0 KiB
C
#include "optic_mag_driver.h"
|
||
|
||
volatile uint32_t g_optic_mag_value = 0;
|
||
volatile uint8_t g_optic_mag_fresh = 0;
|
||
|
||
typedef enum {
|
||
OPTIC_STATE_IDLE = 0,
|
||
OPTIC_STATE_COLLECTING,
|
||
OPTIC_STATE_WAIT_END,
|
||
} OpticState_t;
|
||
|
||
static UART_HandleTypeDef *s_huart;
|
||
static uint8_t s_rx_byte;
|
||
static uint8_t s_bcd_buf[OPTIC_MAG_DATA_BYTES];
|
||
static uint8_t s_data_count;
|
||
static OpticState_t s_state;
|
||
|
||
void OpticMag_Init(UART_HandleTypeDef *huart)
|
||
{
|
||
s_huart = huart;
|
||
s_state = OPTIC_STATE_IDLE;
|
||
s_data_count = 0;
|
||
HAL_UART_Receive_IT(s_huart, &s_rx_byte, 1);
|
||
}
|
||
|
||
void OpticMag_UART_RxCpltCallback(UART_HandleTypeDef *huart)
|
||
{
|
||
if (huart != s_huart) return;
|
||
|
||
uint8_t byte = s_rx_byte;
|
||
|
||
switch (s_state) {
|
||
case OPTIC_STATE_IDLE:
|
||
if (byte == OPTIC_MAG_FRAME_START) {
|
||
s_data_count = 0;
|
||
s_state = OPTIC_STATE_COLLECTING;
|
||
}
|
||
break;
|
||
|
||
case OPTIC_STATE_COLLECTING:
|
||
s_bcd_buf[s_data_count++] = byte;
|
||
if (s_data_count == OPTIC_MAG_DATA_BYTES) {
|
||
s_state = OPTIC_STATE_WAIT_END;
|
||
}
|
||
break;
|
||
|
||
case OPTIC_STATE_WAIT_END:
|
||
if (byte == OPTIC_MAG_FRAME_END) {
|
||
// 取前9位BCD数字(忽略第10位),每字节低nibble为有效数字
|
||
uint32_t value = 0;
|
||
for (uint8_t i = 0; i < 9; i++) {
|
||
value = value * 10u + (s_bcd_buf[i] & 0x0Fu);
|
||
}
|
||
g_optic_mag_value = value;
|
||
g_optic_mag_fresh = 1;
|
||
}
|
||
// 无论结束字节是否合法,均回到IDLE(非法帧直接丢弃)
|
||
s_state = OPTIC_STATE_IDLE;
|
||
break;
|
||
}
|
||
|
||
HAL_UART_Receive_IT(s_huart, &s_rx_byte, 1);
|
||
}
|
||
|
||
void OpticMag_UART_ErrorCallback(UART_HandleTypeDef *huart)
|
||
{
|
||
if (huart != s_huart) return;
|
||
s_state = OPTIC_STATE_IDLE;
|
||
HAL_UART_Receive_IT(s_huart, &s_rx_byte, 1);
|
||
}
|