Files
DCU_APP/GD32E508_DCU_APP/device/adc.h
T
cbb f63114f5fd feat(canfd): 切换 CANFD 接收为中断驱动和环形缓冲机制
- 将 CANFD 接收机制由轮询改为 FIFO0 的中断事件驱动处理
- 实现循环取空硬件 FIFO0,提高接收效率和响应速度
- 引入环形缓冲区缓存接收帧,支持多路通道多帧队列管理
- 置位解析任务标志位,实现接收数据的异步解析
- 增加接收中断统计,包括 FIFO 满和溢出计数
- 重构临界区代码,使用自定义函数保护中断状态
- 修改接收过滤器配置,支持按掩码匹配标准帧进入 FIFO0
- 使能 CAN FIFO0 多种中断标志,包括非空、满和溢出中断
2026-05-30 00:24:31 +08:00

133 lines
4.8 KiB
C++
Raw 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.
#ifndef DEVICE_ADC_H
#define DEVICE_ADC_H
#include <stdint.h>
/**
* @brief ADC 采样模块。
* @note 负责 VIN_ADC、内部温度与内部参考电压的 DMA 扫描采样与工程值换算。
*/
class Adc {
public:
/**
* @brief ADC 采样结果结构体。
* @note 保存外部 VIN_ADC、内部温度与内部参考电压的原始值,以及可直接使用的工程值。
*/
struct Sample {
uint16_t vin_raw; /**< 外部 VIN_ADC(PA6)原始 ADC 数值。 */
uint16_t temp_raw; /**< 内部温度通道原始 ADC 数值。 */
uint16_t vref_raw; /**< 内部参考电压通道原始 ADC 数值。 */
float vin_adc_v; /**< VIN_ADC 引脚处电压(分压后的 ADC 端电压),单位 V。 */
float vdda; /**< 根据内部参考电压换算得到的 MCU 供电电压,单位 V。 */
float temperature; /**< 根据温度通道换算得到的芯片温度,单位 ℃。 */
uint8_t valid; /**< 采样是否有效:1=有效,0=存在原始值/换算异常。 */
};
/**
* @brief 初始化 ADC 硬件、扫描通道与 DMA 循环缓存。
* @param[in] 无。
* @param[out] 无。
* @retval 无返回值。
* @note 完成 ADC 三通道扫描、DMA 循环搬运、PA6(VIN_ADC) 模拟输入配置以及内部通道校准。
*/
static void init();
/**
* @brief 查询 ADC DMA 缓存是否已完成首次有效填充。
* @param[in] 无。
* @param[out] 无。
* @retval bool true 表示 DMA 循环缓存已可用,false 表示仍未准备好。
*/
static bool dmaReady();
/**
* @brief 获取 ADC DMA 原始循环缓存只读指针。
* @param[in] 无。
* @param[out] 无。
* @retval const uint16_t* 返回长度为 \p kChannelCount 的原始缓存指针。
* @note 缓冲区顺序为:VIN_ADC → 温度通道 → VREF 通道。
*/
static const uint16_t *dmaBuffer();
/**
* @brief 读取指定通道在 DMA 缓存中的原始 ADC 值。
* @param[in] channel 目标 ADC 通道号。
* @param[out] 无。
* @retval uint16_t 对应通道原始值;不受支持的通道返回 0。
*/
static uint16_t readRaw(uint8_t channel);
/**
* @brief 读取外部 VIN_ADC(PA6)通道原始值。
* @param[in] 无。
* @param[out] 无。
* @retval uint16_t VIN_ADC 原始 ADC 数值。
*/
static uint16_t readVinRaw();
/**
* @brief 读取内部参考电压原始值。
* @param[in] 无。
* @param[out] 无。
* @retval uint16_t 内部 VREFINT 通道原始 ADC 数值。
*/
static uint16_t readVrefRaw();
/**
* @brief 读取内部温度通道原始值。
* @param[in] 无。
* @param[out] 无。
* @retval uint16_t 内部温度通道原始 ADC 数值。
*/
static uint16_t readTempRaw();
/**
* @brief 根据 VIN_ADC 原始值与 VDDA 计算 ADC 引脚处电压。
* @param[in] vinRaw VIN_ADC 通道原始 ADC 数值。
* @param[in] vdda 当前 MCU 供电电压,单位 V。
* @param[out] 无。
* @retval float VIN_ADC 引脚电压,单位 V。
* @note 当前仅计算分压后的 ADC 端电压;若需换算输入母线电压,需要补充完整分压比。
*/
static float calculateVinAdcVoltage(uint16_t vinRaw, float vdda);
/**
* @brief 根据内部参考电压原始值计算 VDDA。
* @param[in] vrefRaw 内部 VREFINT 通道原始 ADC 数值。
* @param[out] 无。
* @retval float 换算得到的 MCU 供电电压,单位 V。
* @note 当 vrefRaw 为 0 时返回默认值 VDDA,避免除零异常。
*/
static float calculateVdda(uint16_t vrefRaw);
/**
* @brief 根据温度原始值与 VDDA 计算芯片温度。
* @param[in] tempRaw 内部温度通道原始 ADC 数值。
* @param[in] vdda 当前 MCU 供电电压,单位 V。
* @param[out] 无。
* @retval float 换算得到的芯片温度,单位 ℃。
*/
static float calculateTemperature(uint16_t tempRaw, float vdda);
/**
* @brief 采集一组完整 ADC 样本并完成工程值换算。
* @param[in] sample 指向输出 Sample 的指针;允许为空。
* @param[out] sample 当指针非空时,写入 VIN/温度/VREF 原始值与换算结果。
* @retval 无返回值。
* @note 当 sample 为 nullptr 时直接返回,不执行写操作。
*/
static void collectSample(Sample *sample);
private:
/**
* @brief 初始化 ADC DMA 通道配置。
* @param[in] 无。
* @param[out] 无。
* @retval 无返回值。
*/
static void initDma();
};
using adc_sample_t = Adc::Sample;
#endif /* DEVICE_ADC_H */