Files
CHJ/library/inc/lh32m0g3x_adc.h
2026-03-20 21:16:58 +08:00

472 lines
15 KiB
C
Executable File
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.

/******************************************************************************
* 版权所有:苏州领慧立芯科技有限公司
* 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端输入选择对于ADC0ADC0_AINP_CHANNEL_t对于ADC1ADC1_AINP_CHANNEL_t */
uint8_t AINM; /*!< AINM端输入选择对于ADC0ADC0_AINM_CHANNEL_t对于ADC1ADC1_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端输入选择。ADC0ADC0_AINP_CHANNEL_tADC1ADC1_AINP_CHANNEL_t */
uint8_t AINM_Channel[ADC_MAX_SEQUENCER_CHANNELS]; /*!< AINM端输入选择。ADC0ADC0_AINM_CHANNEL_tADC1ADC1_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**********************************/