STM_ATEM/User/optic_mag_driver.c
zhoujie bc37e14fba feat(optic_mag): 集成光泵磁力仪驱动并重构数据包架构
- 新增光泵磁力仪驱动模块,通过 USART2 中断接收 BCD 编码数据,采样率 115200bps
- 重构数据包架构:引入标准包与扩展包(含光泵数据)两种类型,通过帧头魔数区分
- 新增 DataPacketWithOptic_t、CorrectedDataPacketWithOptic_t 两种扩展数据包类型
- 数据存储改为通用字节流写入(方案Y),支持任意包类型混流存储
- 将编译期配置集中到 app_config.h,包括 UART 输出、SD 存储、GPS 位置等开关
- 移除 ADC_SYNC GPIO 引脚配置,释放 PA2 用于 USART2_TX
- 主循环 ProcessAdcData 改为按需选择数据包类型,光泵数据快照在 ADC 中断前完成
- 新增 USART2 错误回调处理,支持接收异常时自动恢复
2026-06-07 22:50:54 +08:00

71 lines
2.0 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.

#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);
}