/****************************************************************************** * 版权所有:苏州领慧立芯科技有限公司 * Copyright (c) 2020-2025 Suzhou Legendsemi Technology Co., Ltd. ****************************************************************************** * All rights reserved. Distributed under MIT license. * The file is encoded in UTF-8 without signature. * @file lh32m0g30x_adc.h * @version 2025-09-22 ******************************************************************************/ /* Define to prevent recursive inclusion -------------------------------------*/ #ifndef __LH32M0G3x_ADC_H #define __LH32M0G3x_ADC_H #ifdef __cplusplus extern "C" { #endif /* Includes ------------------------------------------------------------------*/ #include "lh32m0xx_lhl.h" /* Public Definition ---------------------------------------------------------*/ /** * @brief ADC_IT Group */ #define ADC_IT_ERR ((uint32_t)0x2) /* 错误中断的使能 */ #define ADC_IT_RDY ((uint32_t)0x1) /* 数据ready中断的使能 */ #define ADC_IT_ALL ((uint32_t)(ADC_IT_ERR | ADC_IT_RDY)) /** * @brief ADC_FLAG Group */ #define ADC_FLAG_RDY ((uint32_t)0x1000) /* ADC的数据ready指示 */ #define ADC_FLAG_ERR ((uint32_t)0x0800) /* ADC的错误指示 */ #define ADC_FLAG_POR ((uint32_t)0x0400) /* 上电复位指示 */ /** * @brief ADC_ERROR Group */ #define ADC1_ERROR_COMP_UV ((uint32_t)0x4000) /* ADC 1 数字比较器低于下阈值 */ #define ADC1_ERROR_COMP_OV ((uint32_t)0x2000) /* ADC 1 数字比较器超上阈值 */ #define ADC1_ERROR_AINP_OV ((uint32_t)0x1000) /* ADC 1 AIN正端输入overflow; */ #define ADC1_ERROR_AINP_UV ((uint32_t)0x0800) /* ADC 1 AIN正端输入underflow */ #define ADC1_ERROR_AINM_OV ((uint32_t)0x0400) /* ADC 1 AIN负端输入overflow */ #define ADC1_ERROR_AINM_UV ((uint32_t)0x0200) /* ADC 1 AIN负端输入underflow */ #define ADC1_ERROR_PGA_OV ((uint32_t)0x0100) /* ADC 1 PGA输入溢出 */ #define ADC0_ERROR_COMP_UV ((uint32_t)0x0080) /* ADC 0 数字比较器低于下阈值 */ #define ADC0_ERROR_COMP_OV ((uint32_t)0x0040) /* ADC 0 数字比较器超上阈值 */ #define ADC0_ERROR_AINP_OV ((uint32_t)0x0020) /* ADC 0 AIN正端输入overflow */ #define ADC0_ERROR_AINP_UV ((uint32_t)0x0010) /* ADC 0 AIN正端输入underflow */ #define ADC0_ERROR_AINM_OV ((uint32_t)0x0008) /* ADC 0 AIN负端输入overflow */ #define ADC0_ERROR_AINM_UV ((uint32_t)0x0004) /* ADC 0 AIN负端输入underflow */ #define ADC0_ERROR_PGA_OV ((uint32_t)0x0002) /* ADC 0 PGA输入溢出 */ #define ADC_ERROR_MEM_CRC ((uint32_t)0x0001) /* ADC寄存器校验 */ #define ADC_ERROR_ALL ((uint32_t)0x7FFF) /* ADC所有错误诊断全开 */ typedef enum{ ADC_0 = 1u, ADC_1 = 2u, } ADC_ID_t; typedef enum{ REF_INTERNAL_2P5V = 0u, REF_INTERNAL_2P048V, REF_INTERNAL_1P25V, REF_INTERNAL_4P096V, REF_INTERNAL_OFF, } REF_VOLTAGE_t; // typedef enum{ // REF_VOLTAGE_2P5V = 0u, // REF_VOLTAGE_2P048V, // REF_VOLTAGE_1P25V, // REF_VOLTAGE_4P096V, // REF_DISABLE, //} REF_VOLTAGE_t; //typedef struct //{ // REF_MODE_t REF0_Mode; /*!< REF0基准电压:4.096/2.5/2.048/1.25 */ // // FunctionalState REF0_Boost; /*!< REFBUF0_BOOST_EN */ // FunctionalState REF0; /*!< Ref0 buffer enable。控制ADC的VREF+作为参考时的驱动使能。 */ // // REF_MODE_t REF1_Mode; /*!< REF1基准电压:4.096/2.5/2.048/1.25 */ // // FunctionalState REF1_Boost; /*!< REFBUF1_BOOST_EN */ // FunctionalState REF1; /*!< Ref1 buffer enable。控制VDRIVE引脚的驱动使能。 */ // //} REF_InitTypeDef; typedef struct { REF_VOLTAGE_t VREF; /*!< REF0基准电压:4.096/2.5/2.048/1.25/禁用 */ FunctionalState VREF_Boost; /*!< REFBUF0_BOOST_EN */ REF_VOLTAGE_t VDRIVE; /*!< REF1基准电压:4.096/2.5/2.048/1.25/禁用 */ FunctionalState VDRIVE_Boost; /*!< REFBUF1_BOOST_EN */ } REF_InitTypeDef; typedef enum { ADC_MODE_IDLE = 0u, ADC_MODE_CONTINUOUS_CONVERSION, ADC_MODE_SINGLE_CONVERSION, } ADC_MODE_t; typedef enum { ADC_TRIGGER_SOFTWARE = 0u, ADC_TRIGGER_HARDWARE, } ADC_TRIGGER_t; typedef enum { ADC_CODE_UNIPOLAR = 0u, ADC_CODE_BIPOLAR, } ADC_CODE_t; typedef enum{ ADC_REF_REFP_to_REFN = 0u, ADC_REF_EXTREFP_to_EXTREFN, ADC_REF_REFP_to_AVSS, ADC_REF_VDRIVE_to_AVSS, } ADC_REF_SELECT_t; typedef enum { ADC_PGA_GAIN_1 = 0u, ADC_PGA_GAIN_2, ADC_PGA_GAIN_4, ADC_PGA_GAIN_8, ADC_PGA_GAIN_16, ADC_PGA_GAIN_32, ADC_PGA_GAIN_64, ADC_PGA_GAIN_128, ADC_PGA_BYPASS, } ADC_PGA_t; typedef enum { ADC0_AINP_AIN0 = 0x00u, ADC0_AINP_AIN1, ADC0_AINP_AIN2, ADC0_AINP_AIN3, ADC0_AINP_AIN4, ADC0_AINP_AIN5, ADC0_AINP_AIN6, ADC0_AINP_AIN7, ADC0_AINP_AIN8, ADC0_AINP_AIN9, ADC0_AINP_AIN10, ADC0_AINP_AIN11, ADC0_AINP_AVSS = 0x10u, ADC0_AINP_REFP, ADC0_AINP_CALIBP, } ADC0_AINP_CHANNEL_t; typedef enum { ADC0_AINM_AIN0 = 0x00u, ADC0_AINM_AIN1, ADC0_AINM_AIN2, ADC0_AINM_AIN3, ADC0_AINM_AIN4, ADC0_AINM_AIN5, ADC0_AINM_AIN6, ADC0_AINM_AIN7, ADC0_AINM_AIN8, ADC0_AINM_AIN9, ADC0_AINM_AIN10, ADC0_AINM_AIN11, ADC0_AINM_AVSS = 0x10u, ADC0_AINM_REFP, ADC0_AINM_CALIBN, } ADC0_AINM_CHANNEL_t; typedef enum { ADC1_AINP_AIN0 = 0x00u, ADC1_AINP_AIN1, ADC1_AINP_AIN2, ADC1_AINP_AIN3, ADC1_AINP_AIN4, ADC1_AINP_AIN5, ADC1_AINP_AIN6, ADC1_AINP_AIN7, ADC1_AINP_AIN8, ADC1_AINP_AIN9, ADC1_AINP_AIN10, ADC1_AINP_AIN11, ADC1_AINP_TEMPP = 0x10u, ADC1_AINP_AVSS, ADC1_AINP_REFP, ADC1_AINP_DACP, ADC1_AINP_LOOPP, ADC1_AINP_AVDDP, ADC1_AINP_IOVDDP, ADC1_AINP_CALIBP, } ADC1_AINP_CHANNEL_t; typedef enum { ADC1_AINM_AIN0 = 0x00u, ADC1_AINM_AIN1, ADC1_AINM_AIN2, ADC1_AINM_AIN3, ADC1_AINM_AIN4, ADC1_AINM_AIN5, ADC1_AINM_AIN6, ADC1_AINM_AIN7, ADC1_AINM_AIN8, ADC1_AINM_AIN9, ADC1_AINM_AIN10, ADC1_AINM_AIN11, ADC1_AINM_TEMPN = 0x10u, ADC1_AINM_AVSS, ADC1_AINM_REFP, ADC1_AINM_DACN, ADC1_AINM_LOOPN, ADC1_AINM_AVDDN, ADC1_AINM_IOVDDN, ADC1_AINM_CALIBN, } ADC1_AINM_CHANNEL_t; typedef enum { ADC_SPS_7813 = 0u, ADC_SPS_3906, ADC_SPS_1953, ADC_SPS_977, ADC_SPS_488, ADC_SPS_244, ADC_SPS_122, ADC_SPS_61, ADC_SPS_60, ADC_SPS_30, ADC_SPS_15, ADC_SPS_50 = 16u, ADC_SPS_25, ADC_SPS_12P5, ADC_SPS_10 = 24u, ADC_SPS_5, ADC_SPS_2P5, } ADC_DATA_RATE_t; typedef struct{ ADC_MODE_t Mode; /*!< ADC转换模式控制. Continuous or Single mode. */ ADC_TRIGGER_t Trigger; /*!< 选择ADC启动的触发源 */ uint8_t AINP; /*!< AINP端输入选择,对于ADC0:ADC0_AINP_CHANNEL_t;对于ADC1:ADC1_AINP_CHANNEL_t */ uint8_t AINM; /*!< AINM端输入选择,对于ADC0:ADC0_AINM_CHANNEL_t;对于ADC1:ADC1_AINM_CHANNEL_t */ ADC_PGA_t PGA; /*!< PGA增益倍数 或 BYPASS */ ADC_DATA_RATE_t FS; /*!< 数据输出速率*/ ADC_CODE_t Code; /*!< ADC数据输出单极性/双极性控制 */ ADC_REF_SELECT_t ReferenceSelect; /*!< ADC基准源选择 */ FunctionalState REF_BUFP; /*!< 基准源正输入缓冲器 */ FunctionalState REF_BUFM; /*!< 基准源负输入缓冲器 */ FunctionalState REF_Precharge; /*!< 基准源采样电容预充电,增加少许功耗 */ uint8_t Reserved; /*!< 保留位 */ float Reference; /*!< 可选基准值,单位:伏(基准为电压类型)或欧姆(基准为比例电阻) */ } ADC_InitTypeDef; /*----------------- ADC 通道序列器配置 -----------------------------------------*/ #ifndef ADC_MAX_SEQUENCER_CHANNELS #define ADC_MAX_SEQUENCER_CHANNELS 8 #endif /* 单ADC 带状态位的转换数据结构体 */ typedef struct { uint32_t ADC_Status; uint32_t ADC_Data; } ADC_Data_t; /* 双ADC 带状态位的转换数据结构体 */ typedef struct { uint32_t Dummy0; uint32_t Dummy1; uint32_t ADC0_Status; uint32_t ADC0_Data; uint32_t Dummy2; uint32_t ADC1_Status; uint32_t ADC1_Data; uint32_t Dummy3; } ADC_DualData_t; /* 单ADC 通道序列器配置文件 */ typedef struct { uint32_t ADC_CONTROL; uint32_t CHANNEL_CFG; } ADC_Config_t; /* 双ADC 通道序列器配置文件 */ typedef struct { uint32_t INTERRUPT_CONTROL_0; uint32_t ADC_CONTROL_0; uint32_t CHANNEL_CFG_0; uint32_t CONFIGURATION_0; uint32_t ADC_CONTROL_1; uint32_t CHANNEL_CFG_1; uint32_t CONFIGURATION_1; uint32_t FILTER_1; } ADC_DualConfig_t; /* 单ADC 通道序列器参数结构体 */ typedef struct { ADC_Config_t* ADC_CFG; ADC_ID_t ADC_ID; /*!< 使用序列器的ADC_0或ADC_1 */ uint8_t Active_Channels; /*!< 序列器使能的通道数量:2 to ADC_MAX_SEQUENCER_CHANNELS */ FunctionalState Cycle_Mode; /*!< 循环模式:软件触发一次所有通道无限循环;硬件触发一次所有通道采集完毕等待下次触发 */ ADC_TRIGGER_t Sequencer_Trigger; /*!< 触发源:软件或硬件 */ uint8_t AINP_Channel[ADC_MAX_SEQUENCER_CHANNELS]; /*!< AINP端输入选择。ADC0:ADC0_AINP_CHANNEL_t;ADC1:ADC1_AINP_CHANNEL_t */ uint8_t AINM_Channel[ADC_MAX_SEQUENCER_CHANNELS]; /*!< AINM端输入选择。ADC0:ADC0_AINM_CHANNEL_t;ADC1:ADC1_AINM_CHANNEL_t */ } ADC_SingleCSInitTypeDef; /* 双ADC 通道序列器参数结构体 */ typedef struct { ADC_DualConfig_t* ADC_CFGs; ADC_ID_t ADC_ID; /*!< Reserved。双序列器默认使用双ADC */ uint8_t Active_Channels; /*!< 序列器使能的通道数量:2 to ADC_MAX_SEQUENCER_CHANNELS */ FunctionalState Cycle_Mode; /*!< 循环模式:软件触发一次所有通道无限循环;硬件触发一次所有通道采集完毕等待下次触发 */ ADC_TRIGGER_t Sequencer_Trigger; /*!< 触发源:软件或硬件 */ ADC0_AINP_CHANNEL_t AINP0_Channel[ADC_MAX_SEQUENCER_CHANNELS]; /*!< ADC0 AINP端输入选择 */ ADC0_AINM_CHANNEL_t AINM0_Channel[ADC_MAX_SEQUENCER_CHANNELS]; /*!< ADC0 AINM端输入选择 */ ADC1_AINP_CHANNEL_t AINP1_Channel[ADC_MAX_SEQUENCER_CHANNELS]; /*!< ADC1 AINP端输入选择 */ ADC1_AINM_CHANNEL_t AINM1_Channel[ADC_MAX_SEQUENCER_CHANNELS]; /*!< ADC1 AINM端输入选择 */ } ADC_DualCSInitTypeDef; typedef enum { EXC_CURRENT_0uA = 0u, EXC_CURRENT_50uA, EXC_CURRENT_100uA, EXC_CURRENT_150uA, EXC_CURRENT_200uA, EXC_CURRENT_250uA, EXC_CURRENT_300uA, EXC_CURRENT_350uA, EXC_CURRENT_400uA, EXC_CURRENT_450uA, EXC_CURRENT_500uA, EXC_CURRENT_600uA, EXC_CURRENT_700uA, EXC_CURRENT_800uA, EXC_CURRENT_900uA, EXC_CURRENT_1000uA, } IEXC_RANGE_t; typedef enum { EXC_CURRENT_SRC0 = 1u, EXC_CURRENT_SRC1 = 2u, EXC_CURRENT_DUAL = 3u, } IEXC_SOURCE_t; typedef enum { EXC_CURRENT_AIN2 = 2u, EXC_CURRENT_AIN3 = 3u, EXC_CURRENT_AIN4 = 4u, EXC_CURRENT_AIN5 = 5u, EXC_CURRENT_AIN7 = 7u, EXC_CURRENT_AIN8 = 8u, EXC_CURRENT_AIN10 = 10u, EXC_CURRENT_AIN11 = 11u, } IEXC_CHANNEL_t; typedef enum { BIAS_VOLTAGE_AIN0 = 0x0001u, BIAS_VOLTAGE_AIN1 = 0x0002u, BIAS_VOLTAGE_AIN2 = 0x0004u, BIAS_VOLTAGE_AIN3 = 0x0008u, BIAS_VOLTAGE_AIN4 = 0x0010u, BIAS_VOLTAGE_AIN5 = 0x0020u, BIAS_VOLTAGE_AIN6 = 0x0040u, BIAS_VOLTAGE_AIN7 = 0x0080u, BIAS_VOLTAGE_AIN8 = 0x0100u, BIAS_VOLTAGE_AIN9 = 0x0200u, BIAS_VOLTAGE_AIN10 = 0x0400u, BIAS_VOLTAGE_AIN11 = 0x0800u, } VBIAS_CHANNEL_t; typedef enum { BURNOUT_CURRENT_0uA = 0u, BURNOUT_CURRENT_0_5uA, BURNOUT_CURRENT_2uA, BURNOUT_CURRENT_4uA, } BURNOUT_CURRENT_t; /* Function Prototype --------------------------------------------------------*/ LHL_StatusTypeDef LHL_REF_Init(REF_InitTypeDef* REF_Init); LHL_StatusTypeDef LHL_ADC_Init(ADC_ID_t ADCx, ADC_InitTypeDef* ADC_Init); void LHL_ADC_DeInit(ADC_ID_t ADCx); void LHL_ADC_ITConfig(ADC_ID_t ADCx, uint32_t ADC_ITs, FunctionalState NewState); void LHL_ADC_SetVREF(REF_VOLTAGE_t voltage, FunctionalState NewState); void LHL_ADC_SetVDRIVE(REF_VOLTAGE_t voltage, FunctionalState NewState); void LHL_ADC_ErrorConfig(uint32_t ADC_ERRs, FunctionalState NewState); FlagStatus LHL_ADC_GetError(uint32_t ADC_ERR); void LHL_ADC_Start(ADC_ID_t ADCx); void LHL_ADC_Stop(ADC_ID_t ADCx); LHL_StatusTypeDef LHL_ADC_PollForConversion (ADC_ID_t ADCx, uint32_t Timeout); uint32_t LHL_ADC_GetData(ADC_ID_t ADCx); float LHL_ADC_GetVoltage(const uint32_t raw_data, ADC_InitTypeDef* ADC_Init); ITStatus LHL_ADC_GetPending(ADC_ID_t ADCx, uint32_t ADC_IT_FLAG); void LHL_ADC_SetSync(FunctionalState NewState); void LHL_ADC_StartExcitationCurrent(IEXC_SOURCE_t source, IEXC_RANGE_t range, IEXC_CHANNEL_t channel); void LHL_ADC_StopExcitationCurrent(IEXC_SOURCE_t source); void LHL_ADC_StartBiasVoltage(VBIAS_CHANNEL_t channel); void LHL_ADC_StopBiasVoltage(void); void LHL_ADC_StartBurnoutCurrent(ADC_ID_t ADCx, BURNOUT_CURRENT_t current); void LHL_ADC_StopBurnoutCurrent(ADC_ID_t ADCx); void LHL_ADC_DMACmd(ADC_ID_t ADCx, FunctionalState NewState); LHL_StatusTypeDef LHL_ADC_SingleChannelSequencerInit(ADC_InitTypeDef* ADC_Init, ADC_SingleCSInitTypeDef* ADC_CSInit); LHL_StatusTypeDef LHL_ADC_DualChannelSequencerInit(ADC_InitTypeDef* ADC_Init, ADC_DualCSInitTypeDef* ADC_DualCSInit); #ifdef __cplusplus } #endif #endif /*********************************End of File**********************************/