- 新增完整的CMSIS解决方案配置,包含AC6/GCC/IAR/CLANG编译器支持 - 添加项目配置文件,定义了设备层、系统层、应用层的模块结构 - 配置ARM::CMSIS和GigaDevice::GD32E50x_DFP软件包依赖 - 创建多层代码架构:应用入口(main)、系统层(sys)、设备层(device) - 实现任务管理系统,包含任务调度器和任务执行器分离设计 - 集成ADC、CANFD、定时器、串口、温度采样等核心功能模块 - 添加详细的README文档说明项目结构和代码组织方式 - 配置AC6链接脚本和运行时环境文件 - 设置Git忽略规则以排除编译产物和临时文件
115 lines
4.1 KiB
Plaintext
115 lines
4.1 KiB
Plaintext
#ifndef DEVICE_ADC_H
|
||
#define DEVICE_ADC_H
|
||
|
||
#include <stdint.h>
|
||
|
||
/**
|
||
* @brief ADC 采样结果结构体。
|
||
* @note 保存外部 VIN_ADC、内部温度与内部参考电压的原始值,以及可直接使用的工程值。
|
||
*/
|
||
typedef struct {
|
||
uint16_t vin_raw; /**< @brief 外部 VIN_ADC(PA6)原始 ADC 数值。 */
|
||
uint16_t temp_raw; /**< @brief 内部温度通道原始 ADC 数值。 */
|
||
uint16_t vref_raw; /**< @brief 内部参考电压通道原始 ADC 数值。 */
|
||
float vin_adc_v; /**< @brief VIN_ADC 引脚处电压,单位 V(仅为分压后的 ADC 端电压)。 */
|
||
float vdda; /**< @brief 根据内部参考电压换算得到的 MCU 供电电压,单位 V。 */
|
||
float temperature; /**< @brief 根据温度通道换算得到的芯片温度,单位 ℃。 */
|
||
} adc_sample_t;
|
||
|
||
/**
|
||
* @brief 初始化 ADC 硬件及内部温度/VREF/VIN_ADC 通道。
|
||
* @param[in] 无。
|
||
* @param[out] 无。
|
||
* @retval 无返回值。
|
||
* @note 该函数完成 ADC 时钟、三通道扫描、DMA 循环缓存以及内部/外部采样通道使能。
|
||
*/
|
||
void adc_hw_init(void);
|
||
|
||
/**
|
||
* @brief 查询 ADC DMA 循环缓存是否已完成首次有效填充。
|
||
* @param[in] 无。
|
||
* @param[out] 无。
|
||
* @retval uint8_t 返回非 0 表示缓存已可用,返回 0 表示仍未准备好。
|
||
*/
|
||
uint8_t adc_dma_ready(void);
|
||
|
||
/**
|
||
* @brief 获取 ADC DMA 原始循环缓存只读指针。
|
||
* @param[in] 无。
|
||
* @param[out] 无。
|
||
* @retval const uint16_t* 返回长度为 3 的原始缓存指针,顺序为 VIN_ADC、温度通道、VREF 通道。
|
||
*/
|
||
const uint16_t *adc_dma_buffer_get(void);
|
||
|
||
/**
|
||
* @brief 执行指定通道的一次 ADC 单次采样。
|
||
* @param[in] channel 待采样的 ADC 通道号。
|
||
* @param[out] 无。
|
||
* @retval uint16_t 指定通道的原始 ADC 采样值。
|
||
* @note 在 DMA 缓存模式下,该函数优先返回已缓存的对应通道原始值;若通道不受支持则返回 0。
|
||
*/
|
||
uint16_t adc_single_read(uint8_t channel);
|
||
|
||
/**
|
||
* @brief 读取外部 VIN_ADC(PA6)通道的原始 ADC 值。
|
||
* @param[in] 无。
|
||
* @param[out] 无。
|
||
* @retval uint16_t 外部 VIN_ADC 通道的原始 ADC 值。
|
||
*/
|
||
uint16_t adc_read_vin_raw(void);
|
||
|
||
/**
|
||
* @brief 读取内部参考电压通道的原始 ADC 值。
|
||
* @param[in] 无。
|
||
* @param[out] 无。
|
||
* @retval uint16_t 内部参考电压通道的原始 ADC 值。
|
||
*/
|
||
uint16_t adc_read_vref_raw(void);
|
||
|
||
/**
|
||
* @brief 读取内部温度通道的原始 ADC 值。
|
||
* @param[in] 无。
|
||
* @param[out] 无。
|
||
* @retval uint16_t 内部温度通道的原始 ADC 值。
|
||
*/
|
||
uint16_t adc_read_temp_raw(void);
|
||
|
||
/**
|
||
* @brief 根据外部 VIN_ADC 原始值与 VDDA 计算 ADC 引脚处电压。
|
||
* @param[in] vin_raw 外部 VIN_ADC 通道原始 ADC 数值。
|
||
* @param[in] vdda 当前供电电压,单位 V。
|
||
* @param[out] 无。
|
||
* @retval float VIN_ADC 引脚电压,单位 V。
|
||
* @note 当前仅计算分压后的 ADC 端电压;若需换算输入母线电压,需要补充完整分压比。
|
||
*/
|
||
float adc_calculate_vin_adc_voltage(uint16_t vin_raw, float vdda);
|
||
|
||
/**
|
||
* @brief 根据内部参考电压原始值计算实际 VDDA。
|
||
* @param[in] vref_raw 内部参考电压通道原始 ADC 数值。
|
||
* @param[out] 无。
|
||
* @retval float 换算得到的 VDDA 电压值,单位 V。
|
||
* @note 当输入为 0 时返回默认 3.3V,避免除零异常。
|
||
*/
|
||
float adc_calculate_vdda(uint16_t vref_raw);
|
||
|
||
/**
|
||
* @brief 根据温度原始值与 VDDA 计算芯片温度。
|
||
* @param[in] temp_raw 内部温度通道原始 ADC 数值。
|
||
* @param[in] vdda 当前供电电压,单位 V。
|
||
* @param[out] 无。
|
||
* @retval float 换算得到的芯片温度,单位 ℃。
|
||
*/
|
||
float adc_calculate_temperature(uint16_t temp_raw, float vdda);
|
||
|
||
/**
|
||
* @brief 采集一组完整 ADC 样本并完成工程值换算。
|
||
* @param[in] sample 指向输出样本结构体的指针;允许为空。
|
||
* @param[out] sample 当指针非空时,写入 VIN/温度/VREF 原始值与换算结果。
|
||
* @retval 无返回值。
|
||
* @note 当 sample 为 NULL 时函数直接返回,不执行写操作。
|
||
*/
|
||
void adc_collect_sample(adc_sample_t *sample);
|
||
|
||
#endif /* DEVICE_ADC_H */
|