812 lines
33 KiB
C
812 lines
33 KiB
C
/************************************************************************************************/
|
||
/**
|
||
* @file ciu32l051_std_adc.h
|
||
* @author MCU Ecosystem Development Team
|
||
* @brief ADC STD库驱动头文件。
|
||
* 提供ADC相关的STD库操作函数声明、数据类型以及常量的定义。
|
||
*
|
||
*
|
||
**************************************************************************************************
|
||
* @attention
|
||
* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
|
||
*
|
||
**************************************************************************************************
|
||
*/
|
||
|
||
/* 避免头文件重复引用 */
|
||
#ifndef CIU32L051_STD_ADC_H
|
||
#define CIU32L051_STD_ADC_H
|
||
|
||
/************************************************************************************************/
|
||
/**
|
||
* @addtogroup CIU32L051_STD_Driver
|
||
* @{
|
||
*/
|
||
|
||
/**
|
||
* @defgroup ADC ADC
|
||
* @brief 模数转换器的STD库驱动
|
||
* @{
|
||
*/
|
||
/************************************************************************************************/
|
||
|
||
|
||
|
||
#ifdef __cplusplus
|
||
extern "C" {
|
||
#endif
|
||
|
||
/*------------------------------------------includes--------------------------------------------*/
|
||
#include "ciu32l051_std_common.h"
|
||
|
||
/*-----------------------------------------type define------------------------------------------*/
|
||
/************************************************************************************************/
|
||
/**
|
||
* @defgroup ADC_Types ADC Types
|
||
* @brief ADC数据类型定义
|
||
* @{
|
||
*/
|
||
/************************************************************************************************/
|
||
/**
|
||
* @brief ADC初始化结构体定义
|
||
*/
|
||
typedef struct
|
||
{
|
||
uint32_t clock_src; /**< 时钟源:同步时钟PCLK、异步时钟RCH16、SYSCLK及分频
|
||
@arg ADC_SYNC_CLK_PCLK_DIV1 ... */
|
||
|
||
uint32_t clock_presc; /**< 异步时钟分频配置
|
||
@arg ADC_ASYNC_CLK_DIV1 ... */
|
||
|
||
uint32_t trigger_edge; /**< 触发方式和极性配置
|
||
@arg ADC_TRIG_SW ... */
|
||
|
||
uint32_t trigger_source; /**< 转换触发源选择,当选择软件触发时,外部触发禁止
|
||
@arg ADC_EXTRIG_EXTI11 ... */
|
||
|
||
uint32_t sampt1; /**< 采样时间参数1,ADC外设具有两组采样时间参数,每个通道可选择其一
|
||
@arg ADC_SAMPTIME_3CYCLES ... */
|
||
|
||
uint32_t sampt2; /**< 采样时间参数2,ADC外设具有两组采样时间参数,每个通道可选择其一
|
||
@arg ADC_SAMPTIME_3CYCLES ... */
|
||
|
||
uint32_t overrun_mode; /**< 转换溢出后ADC_DR寄存器的数据存储方式,保留原数据或被新转换结果覆盖
|
||
@arg ADC_OVRN_MODE_PRESERVED ... */
|
||
|
||
uint32_t conver_mode; /**< 转换模式选择,可设置为单次扫描、循环扫描、循环间断转换模式
|
||
@arg ADC_SINGLE_CONVER_MODE ... */
|
||
|
||
uint32_t scan_dir; /**< 通道序列扫描方向配置
|
||
@arg ADC_SCAN_DIR_FORWARD ... */
|
||
|
||
} std_adc_init_t;
|
||
|
||
/**
|
||
* @}
|
||
*/
|
||
|
||
/*--------------------------------------------define--------------------------------------------*/
|
||
/************************************************************************************************/
|
||
/**
|
||
* @defgroup ADC_Constants ADC Constants
|
||
* @brief ADC常量定义及宏定义
|
||
* @{
|
||
*
|
||
*/
|
||
/************************************************************************************************/
|
||
/* ADC时钟源及分频系数 */
|
||
#define ADC_SYNC_CLK_PCLK_DIV1 ADC_CFG2_CKSRC_PCLK /**< ADC同步时钟: PCLK不分频 */
|
||
#define ADC_SYNC_CLK_PCLK_DIV2 ADC_CFG2_CKSRC_PCLK_DIV2 /**< ADC同步时钟: PCLK/2分频 */
|
||
#define ADC_SYNC_CLK_PCLK_DIV4 ADC_CFG2_CKSRC_PCLK_DIV4 /**< ADC同步时钟: PCLK/4分频 */
|
||
#define ADC_ASYNC_CLK_KCLK ADC_CFG2_CKSRC_KCLK /**< ADC异步时钟: KCLK */
|
||
|
||
/* ADC异步时钟分频系数 */
|
||
#define ADC_ASYNC_CLK_DIV1 ADC_CFG2_PRESC_DIV1 /**< ADC异步时钟: 不分频 */
|
||
#define ADC_ASYNC_CLK_DIV2 ADC_CFG2_PRESC_DIV2 /**< ADC异步时钟: 2分频 */
|
||
#define ADC_ASYNC_CLK_DIV4 ADC_CFG2_PRESC_DIV4 /**< ADC异步时钟: 4分频 */
|
||
#define ADC_ASYNC_CLK_DIV6 ADC_CFG2_PRESC_DIV6 /**< ADC异步时钟: 6分频 */
|
||
#define ADC_ASYNC_CLK_DIV8 ADC_CFG2_PRESC_DIV8 /**< ADC异步时钟: 8分频 */
|
||
#define ADC_ASYNC_CLK_DIV10 ADC_CFG2_PRESC_DIV10 /**< ADC异步时钟: 10分频 */
|
||
#define ADC_ASYNC_CLK_DIV12 ADC_CFG2_PRESC_DIV12 /**< ADC异步时钟: 12分频 */
|
||
#define ADC_ASYNC_CLK_DIV16 ADC_CFG2_PRESC_DIV16 /**< ADC异步时钟: 16分频 */
|
||
#define ADC_ASYNC_CLK_DIV32 ADC_CFG2_PRESC_DIV32 /**< ADC异步时钟: 32分频 */
|
||
#define ADC_ASYNC_CLK_DIV64 ADC_CFG2_PRESC_DIV64 /**< ADC异步时钟: 64分频 */
|
||
#define ADC_ASYNC_CLK_DIV128 ADC_CFG2_PRESC_DIV128 /**< ADC异步时钟: 128分频 */
|
||
|
||
/* ADC转换模式 */
|
||
#define ADC_SINGLE_CONVER_MODE ADC_CFG1_CONV_MOD_SINGLE /**< ADC单次扫描转换 */
|
||
#define ADC_CONTINUOUS_CONVER_MODE ADC_CFG1_CONV_MOD_CONTINUOUS /**< ADC循环扫描转换 */
|
||
#define ADC_DISCONTINUOUS_CONVER_MODE ADC_CFG1_CONV_MOD_DISCONTINUOUS /**< ADC循环间断转换 */
|
||
|
||
/* ADC通道扫描方向 */
|
||
#define ADC_SCAN_DIR_FORWARD (0x00000000U) /**< ADC转换通道: 正向扫描 */
|
||
#define ADC_SCAN_DIR_BACKWARD ADC_CFG1_SDIR /**< ADC转换通道: 反向扫描 */
|
||
|
||
/* ADC转换触发模式: 触发沿 */
|
||
#define ADC_TRIG_SW ADC_CFG1_TRIGEN_SW /**< 软件触发方式 */
|
||
#define ADC_TRIG_HW_EDGE_RISING ADC_CFG1_TRIGEN_HW_EDGE_RISING /**< 外部硬件触发使能: 上升沿触发 */
|
||
#define ADC_TRIG_HW_EDGE_FALLING ADC_CFG1_TRIGEN_HW_EDGE_FALLING /**< 外部硬件触发使能: 下降沿触发 */
|
||
#define ADC_TRIG_HW_EDGE_BOTH ADC_CFG1_TRIGEN_HW_EDGE_BOTH /**< 外部硬件触发使能: 双沿触发 */
|
||
|
||
/* ADC转换触发源 */
|
||
#define ADC_EXTRIG_TIM3_TRGO ADC_CFG1_TRIG_TIM3_TRGO /**< ADC触发源: TIM3 TRGO */
|
||
#define ADC_EXTRIG_TIM4_TRGO ADC_CFG1_TRIG_TIM4_TRGO /**< ADC触发源: TIM4 TRGO */
|
||
#define ADC_EXTRIG_TIM5_TRGO ADC_CFG1_TRIG_TIM5_TRGO /**< ADC触发源: TIM5 TRGO */
|
||
#define ADC_EXTRIG_TIM8_TRGO ADC_CFG1_TRIG_TIM8_TRGO /**< ADC触发源: TIM8 TRGO */
|
||
#define ADC_EXTRIG_EXTI2 ADC_CFG1_TRIG_EXTI2 /**< ADC触发源: 外部中断EXTI_2 */
|
||
#define ADC_EXTRIG_EXTI11 ADC_CFG1_TRIG_EXTI11 /**< ADC触发源: 外部中断EXTI_11 */
|
||
|
||
/* ADC转换溢出后ADC_DR寄存器数据存储方式 */
|
||
#define ADC_OVRN_MODE_PRESERVED (0x00000000U) /**< ADC_DR寄存器保留原数据 */
|
||
#define ADC_OVRN_MODE_OVERWRITTEN ADC_CFG1_OVRN_MOD /**< ADC_DR寄存器覆盖新数据 */
|
||
|
||
/* ADC转换采样时间参数组 */
|
||
#define ADC_SAMPTIME_GROUP_1 (0U) /**< 采样时间参数:组1 */
|
||
#define ADC_SAMPTIME_GROUP_2 (4U) /**< 采样时间参数:组2 */
|
||
|
||
/* ADC采样时间参数 */
|
||
#define ADC_SAMPTIME_3CYCLES ADC_SAMPT_SAMPT1_3CYCLES /**< 采样时间为3个时钟周期 */
|
||
#define ADC_SAMPTIME_7CYCLES ADC_SAMPT_SAMPT1_7CYCLES /**< 采样时间为7个时钟周期 */
|
||
#define ADC_SAMPTIME_12CYCLES ADC_SAMPT_SAMPT1_12CYCLES /**< 采样时间为12个时钟周期 */
|
||
#define ADC_SAMPTIME_19CYCLES ADC_SAMPT_SAMPT1_19CYCLES /**< 采样时间为19个时钟周期 */
|
||
#define ADC_SAMPTIME_39CYCLES ADC_SAMPT_SAMPT1_39CYCLES /**< 采样时间为39个时钟周期 */
|
||
#define ADC_SAMPTIME_79CYCLES ADC_SAMPT_SAMPT1_79CYCLES /**< 采样时间为79个时钟周期 */
|
||
#define ADC_SAMPTIME_119CYCLES ADC_SAMPT_SAMPT1_119CYCLES /**< 采样时间为119个时钟周期 */
|
||
#define ADC_SAMPTIME_159CYCLES ADC_SAMPT_SAMPT1_159CYCLES /**< 采样时间为159个时钟周期 */
|
||
#define ADC_SAMPTIME_239CYCLES ADC_SAMPT_SAMPT1_239CYCLES /**< 采样时间为239个时钟周期 */
|
||
#define ADC_SAMPTIME_319CYCLES ADC_SAMPT_SAMPT1_319CYCLES /**< 采样时间为319个时钟周期 */
|
||
#define ADC_SAMPTIME_479CYCLES ADC_SAMPT_SAMPT1_479CYCLES /**< 采样时间为479个时钟周期 */
|
||
#define ADC_SAMPTIME_639CYCLES ADC_SAMPT_SAMPT1_639CYCLES /**< 采样时间为639个时钟周期 */
|
||
#define ADC_SAMPTIME_959CYCLES ADC_SAMPT_SAMPT1_959CYCLES /**< 采样时间为959个时钟周期 */
|
||
#define ADC_SAMPTIME_1279CYCLES ADC_SAMPT_SAMPT1_1279CYCLES /**< 采样时间为1279个时钟周期 */
|
||
#define ADC_SAMPTIME_1919CYCLES ADC_SAMPT_SAMPT1_1919CYCLES /**< 采样时间为1919个时钟周期 */
|
||
|
||
/* ADC转换通道 */
|
||
#define ADC_CHANNEL_NONE (0x00000000U) /**< ADC 转换通道清除 */
|
||
#define ADC_CHANNEL_0 ADC_CHCFG_CHN0 /**< ADC 转换通道IN0 */
|
||
#define ADC_CHANNEL_1 ADC_CHCFG_CHN1 /**< ADC 转换通道IN1 */
|
||
#define ADC_CHANNEL_2 ADC_CHCFG_CHN2 /**< ADC 转换通道IN2 */
|
||
#define ADC_CHANNEL_3 ADC_CHCFG_CHN3 /**< ADC 转换通道IN3 */
|
||
#define ADC_CHANNEL_4 ADC_CHCFG_CHN4 /**< ADC 转换通道IN4 */
|
||
#define ADC_CHANNEL_5 ADC_CHCFG_CHN5 /**< ADC 转换通道IN5 */
|
||
#define ADC_CHANNEL_6 ADC_CHCFG_CHN6 /**< ADC 转换通道IN6 */
|
||
#define ADC_CHANNEL_7 ADC_CHCFG_CHN7 /**< ADC 转换通道IN7 */
|
||
#define ADC_CHANNEL_8 ADC_CHCFG_CHN8 /**< ADC 转换通道IN8 */
|
||
#define ADC_CHANNEL_9 ADC_CHCFG_CHN9 /**< ADC 转换通道IN9 */
|
||
#define ADC_CHANNEL_10 ADC_CHCFG_CHN10 /**< ADC 转换通道IN10 */
|
||
#define ADC_CHANNEL_11 ADC_CHCFG_CHN11 /**< ADC 转换通道IN11 */
|
||
#define ADC_CHANNEL_12 ADC_CHCFG_CHN12 /**< ADC 转换通道IN12 */
|
||
#define ADC_CHANNEL_13 ADC_CHCFG_CHN13 /**< ADC 转换通道IN13 */
|
||
#define ADC_CHANNEL_14 ADC_CHCFG_CHN14 /**< ADC 转换通道IN14 */
|
||
#define ADC_CHANNEL_15 ADC_CHCFG_CHN15 /**< ADC 转换通道IN15 */
|
||
#define ADC_CHANNEL_16 ADC_CHCFG_CHN16 /**< ADC 转换通道IN16 */
|
||
#define ADC_CHANNEL_19 ADC_CHCFG_CHN19 /**< ADC 转换通道IN19 */
|
||
#define ADC_CHANNEL_VTS ADC_CHCFG_CHN12 /**< ADC 内部转换通道VTS */
|
||
#define ADC_CHANNEL_VBGR ADC_CHCFG_CHN13 /**< ADC 内部转换通道VBGR */
|
||
#define ADC_CHANNEL_VBAT_DIV3 ADC_CHCFG_CHN14 /**< ADC 内部转换通道VBAT/3 */
|
||
#define ADC_CHANNEL_VDDA_DIV3 ADC_CHCFG_CHN14 /**< ADC 内部转换通道VDDA/3 */
|
||
#define ADC_CHANNEL_ALL ADC_CHCFG_CHN /**< ADC 全部转换通道 */
|
||
|
||
/* ADC模拟看门狗监测通道 */
|
||
#define ADC_AWDG_CHANNEL_NONE (0x00000000U) /**< ADC 模拟看门狗监测通道清除 */
|
||
#define ADC_AWDG_CHANNEL_0 ADC_AWDG1CR_AWDG1_CHN0 /**< ADC 模拟看门狗监测通道0 */
|
||
#define ADC_AWDG_CHANNEL_1 ADC_AWDG1CR_AWDG1_CHN1 /**< ADC 模拟看门狗监测通道1 */
|
||
#define ADC_AWDG_CHANNEL_2 ADC_AWDG1CR_AWDG1_CHN2 /**< ADC 模拟看门狗监测通道2 */
|
||
#define ADC_AWDG_CHANNEL_3 ADC_AWDG1CR_AWDG1_CHN3 /**< ADC 模拟看门狗监测通道3 */
|
||
#define ADC_AWDG_CHANNEL_4 ADC_AWDG1CR_AWDG1_CHN4 /**< ADC 模拟看门狗监测通道4 */
|
||
#define ADC_AWDG_CHANNEL_5 ADC_AWDG1CR_AWDG1_CHN5 /**< ADC 模拟看门狗监测通道5 */
|
||
#define ADC_AWDG_CHANNEL_6 ADC_AWDG1CR_AWDG1_CHN6 /**< ADC 模拟看门狗监测通道6 */
|
||
#define ADC_AWDG_CHANNEL_7 ADC_AWDG1CR_AWDG1_CHN7 /**< ADC 模拟看门狗监测通道7 */
|
||
#define ADC_AWDG_CHANNEL_8 ADC_AWDG1CR_AWDG1_CHN8 /**< ADC 模拟看门狗监测通道8 */
|
||
#define ADC_AWDG_CHANNEL_9 ADC_AWDG1CR_AWDG1_CHN9 /**< ADC 模拟看门狗监测通道9 */
|
||
#define ADC_AWDG_CHANNEL_10 ADC_AWDG1CR_AWDG1_CHN10 /**< ADC 模拟看门狗监测通道10 */
|
||
#define ADC_AWDG_CHANNEL_11 ADC_AWDG1CR_AWDG1_CHN11 /**< ADC 模拟看门狗监测通道11 */
|
||
#define ADC_AWDG_CHANNEL_12 ADC_AWDG1CR_AWDG1_CHN12 /**< ADC 模拟看门狗监测通道12 */
|
||
#define ADC_AWDG_CHANNEL_13 ADC_AWDG1CR_AWDG1_CHN13 /**< ADC 模拟看门狗监测通道13 */
|
||
#define ADC_AWDG_CHANNEL_14 ADC_AWDG1CR_AWDG1_CHN14 /**< ADC 模拟看门狗监测通道14 */
|
||
#define ADC_AWDG_CHANNEL_15 ADC_AWDG1CR_AWDG1_CHN15 /**< ADC 模拟看门狗监测通道15 */
|
||
#define ADC_AWDG_CHANNEL_16 ADC_AWDG1CR_AWDG1_CHN16 /**< ADC 模拟看门狗监测通道16 */
|
||
#define ADC_AWDG_CHANNEL_19 ADC_AWDG1CR_AWDG1_CHN19 /**< ADC 模拟看门狗监测通道19 */
|
||
#define ADC_AWDG_CHANNEL_VTS ADC_AWDG1CR_AWDG1_CHN12 /**< ADC 模拟看门狗监测通道VTS */
|
||
#define ADC_AWDG_CHANNEL_VBGR ADC_AWDG1CR_AWDG1_CHN13 /**< ADC 模拟看门狗监测通道VBGR */
|
||
#define ADC_AWDG_CHANNEL_VBAT_DIV3 ADC_AWDG1CR_AWDG1_CHN14 /**< ADC 模拟看门狗监测通道VBAT/3 */
|
||
#define ADC_AWDG_CHANNEL_VDDA_DIV3 ADC_AWDG1CR_AWDG1_CHN14 /**< ADC 模拟看门狗监测通道VDDA/3 */
|
||
#define ADC_AWDG_CHANNEL_ALL ADC_AWDG1CR_AWDG1_CHN /**< ADC 全部转换通道 */
|
||
|
||
/* ADC内部通道使能 */
|
||
#define ADC_INTERNAL_CHANNEL_NONE (0x00000000U) /**< ADC 内部通道全部禁止 */
|
||
#define ADC_INTERNAL_CHANNEL_VBGREN ADC_CFG2_VBGREN /**< ADC 内部通道VBGR使能 */
|
||
#define ADC_INTERNAL_CHANNEL_VTSEN ADC_CFG2_VTSEN /**< ADC 内部通道VTS使能 */
|
||
#define ADC_INTERNAL_CHANNEL_VBAT_DIV3 ADC_CFG2_VBAT_DIV3 /**< ADC 内部通道VBAT/3使能 */
|
||
#define ADC_INTERNAL_CHANNEL_VDDA_DIV3 ADC_CFG2_VDDA_DIV3 /**< ADC 内部通道VDDA/3使能 */
|
||
|
||
/* ADC中断源定义:IER中断寄存器 */
|
||
#define ADC_INTERRUPT_EOSAMP ADC_IER_EOSAMPIE /**< ADC采样结束中断 */
|
||
#define ADC_INTERRUPT_EOC ADC_IER_EOCIE /**< ADC单通道转换完成中断 */
|
||
#define ADC_INTERRUPT_EOS ADC_IER_EOSIE /**< ADC通道序列转换完成中断 */
|
||
#define ADC_INTERRUPT_OVRN ADC_IER_OVRNIE /**< ADC数据溢出中断 */
|
||
#define ADC_INTERRUPT_AWDG1 ADC_IER_AWDG1IE /**< ADC模拟看门狗1电压监控中断 */
|
||
#define ADC_INTERRUPT_EOCAL ADC_IER_EOCALIE /**< ADC校准结束中断 */
|
||
|
||
/* ADC状态定义:ISR状态寄存器 */
|
||
#define ADC_FLAG_EOSAMP ADC_ISR_EOSAMP /**< ADC采样结束状态 */
|
||
#define ADC_FLAG_EOC ADC_ISR_EOC /**< ADC单通道转换完成状态 */
|
||
#define ADC_FLAG_EOS ADC_ISR_EOS /**< ADC通道序列转换完成状态 */
|
||
#define ADC_FLAG_OVRN ADC_ISR_OVRN /**< ADC数据溢出状态 */
|
||
#define ADC_FLAG_AWDG1 ADC_ISR_AWDG1 /**< ADC模拟看门狗1监控电压状态 */
|
||
#define ADC_FLAG_EOCAL ADC_ISR_EOCAL /**< ADC校准状态 */
|
||
#define ADC_FLAG_ALL (ADC_ISR_EOSAMP | ADC_ISR_EOC | ADC_ISR_EOS \
|
||
| ADC_ISR_OVRN | ADC_ISR_AWDG1 | ADC_ISR_EOCAL) /**< ADC全部状态 */
|
||
|
||
/* VBGR校准参数定义 */
|
||
#define VBGR_CAL_ADDR ((uint16_t*)(BGR_CAL)) /**< VBGR校准参数存储地址 */
|
||
#define VBGR_CAL_VREF (3300U) /**< VBGR校准采用参考电压:3.3V */
|
||
|
||
/* 温度传感器校准参数定义 */
|
||
#define TS_CAL_ADDR_25 ((uint16_t*)(TS_CAL_25)) /**< 温度传感器校准参数存储地址:25℃ */
|
||
#define TS_CAL_ADDR_85 ((uint16_t*)(TS_CAL_85)) /**< 温度传感器校准参数存储地址:85℃ */
|
||
#define TS_CAL_TEMP_25 ((int32_t)25U) /**< 温度传感器校准温度:25℃ */
|
||
#define TS_CAL_TEMP_85 ((int32_t)85U) /**< 温度传感器校准温度:85℃ */
|
||
#define TS_CAL_VREF (3300U) /**< 温度传感器校准采用参考电压:3.3V */
|
||
|
||
/* 等待内部通道的启动稳定时间
|
||
VBGR通道启动稳定时间 15US
|
||
VTS通道启动稳定时间 18US
|
||
VBAT_DIV3和VDDA_DIV3通道启动稳定时间 15US
|
||
配置多个内部通道时,等待最大启动稳定时间即可
|
||
*/
|
||
#define ADC_VBGR_CHANNEL_DELAY (15U) /**< VBGR通道启动稳定时间 */
|
||
#define ADC_VTS_CHANNEL_DELAY (18U) /**< VTS通道启动稳定时间 */
|
||
#define ADC_VBAT_DIV3_CHANNEL_DELAY (15U) /**< VBAT/3通道启动稳定时间 */
|
||
#define ADC_VDDA_DIV3_CHANNEL_DELAY (15U) /**< VDDA/3通道启动稳定时间 */
|
||
|
||
/* ADC使能稳定时间
|
||
当ADC_CK时钟大于等于6MHz,需等待2.5us稳定时间
|
||
当ADC_CK时钟小于6MHz,需等待17个ADC时钟周期稳定时间
|
||
*/
|
||
#define ADC_EN_DELAY (3U) /**< ADC使能稳定时间 */
|
||
|
||
/* ADC参考电压源 */
|
||
#define ADC_REFERENCE_VREFBUF (0x00000000U) /**< VRFEBUF输出作为参考电压源,需使能VREFBUF,配置PA0引脚为模拟模式,外接1uF+0.1uF电容 */
|
||
#define ADC_REFERENCE_VREFP (0x00000000U) /**< VREF+引脚输入作为参考电压源,配置PA0引脚为模拟模式 */
|
||
#define ADC_REFERENCE_VDDA ADC_CFG2_REF /**< VDDA作为参考电压源 */
|
||
|
||
/* ADC最大采样值 */
|
||
#define ADC_CONVER_SCALE (4095U) /**< ADC最大采样值,用于ADC电压转换计算 */
|
||
|
||
|
||
/**
|
||
* @brief 根据ADC采集到的温度传感器数据,计算温度
|
||
* @param VREF 参考电压
|
||
* @param TS_DATA ADC采集的温度传感器电压值
|
||
* @retval 温度传感器采集的温度
|
||
*/
|
||
#define ADC_CALC_TEMPERATURE(VREF, TS_DATA) \
|
||
((((((int32_t)((TS_DATA * VREF) / TS_CAL_VREF) \
|
||
- (int32_t) *TS_CAL_ADDR_25)) \
|
||
* (int32_t)(TS_CAL_TEMP_85 - TS_CAL_TEMP_25)) \
|
||
/ (int32_t)((int32_t)*TS_CAL_ADDR_85 - (int32_t)*TS_CAL_ADDR_25)) \
|
||
+ TS_CAL_TEMP_25)
|
||
|
||
/**
|
||
* @}
|
||
*/
|
||
|
||
/*-------------------------------------------functions------------------------------------------*/
|
||
|
||
/************************************************************************************************/
|
||
/**
|
||
* @defgroup ADC_External_Functions ADC External Functions
|
||
* @brief ADC对外函数
|
||
* @{
|
||
*
|
||
*/
|
||
/************************************************************************************************/
|
||
/**
|
||
* @brief 使能ADC
|
||
* @retval 无
|
||
*/
|
||
__STATIC_INLINE void std_adc_enable(void)
|
||
{
|
||
ADC->CR = (ADC_CR_ADEN);
|
||
}
|
||
|
||
/**
|
||
* @brief 禁止ADC
|
||
* @retval 无
|
||
*/
|
||
__STATIC_INLINE void std_adc_disable(void)
|
||
{
|
||
ADC->CR = (ADC_CR_ADDIS);
|
||
}
|
||
|
||
/**
|
||
* @brief 获取ADC使能位状态
|
||
* @retval bool 返回逻辑表达式的判断结果
|
||
* @arg true: 表示ADC处于使能状态
|
||
* @arg false:表示ADC处于禁止状态
|
||
*/
|
||
|
||
__STATIC_INLINE bool std_adc_get_enable_status(void)
|
||
{
|
||
return ((ADC->CR & ADC_CR_ADEN) == ADC_CR_ADEN);
|
||
}
|
||
|
||
/**
|
||
* @brief 使能ADC的DMA传输
|
||
* @retval 无
|
||
*/
|
||
__STATIC_INLINE void std_adc_dma_enable(void)
|
||
{
|
||
ADC->CFG1 |= (ADC_CFG1_DMAEN);
|
||
}
|
||
|
||
/**
|
||
* @brief 禁止ADC的DMA传输
|
||
* @retval 无
|
||
*/
|
||
__STATIC_INLINE void std_adc_dma_disable(void)
|
||
{
|
||
ADC->CFG1 &= (~ADC_CFG1_DMAEN);
|
||
}
|
||
|
||
/**
|
||
* @brief 获取ADC的DMA位使能状态
|
||
* @retval bool 返回逻辑表达式的判断结果
|
||
* @arg true: 表示ADC的DMA已使能
|
||
* @arg false:表示ADC的DMA未使能
|
||
*/
|
||
__STATIC_INLINE bool std_adc_get_dma_status(void)
|
||
{
|
||
return((ADC->CFG1 & ADC_CFG1_DMAEN) == ADC_CFG1_DMAEN);
|
||
}
|
||
|
||
/**
|
||
* @brief 配置ADC时钟源
|
||
* @param clock_src ADC时钟源配置
|
||
* @arg ADC_SYNC_CLK_PCLK_DIV1:PCLK不分频
|
||
* @arg ADC_SYNC_CLK_PCLK_DIV2:PCLK 2分频
|
||
* @arg ADC_SYNC_CLK_PCLK_DIV4:PCLK 4分频
|
||
* @arg ADC_ASYNC_CLK_KCLK:KCLK
|
||
* @retval 无
|
||
*/
|
||
__STATIC_INLINE void std_adc_clock_source_config(uint32_t clock_src)
|
||
{
|
||
MODIFY_REG(ADC->CFG2, ADC_CFG2_CKSRC, clock_src);
|
||
}
|
||
|
||
/**
|
||
* @brief 配置ADC异步时钟分频
|
||
* @param presc ADC异步时钟源分频系数
|
||
* @arg ADC_ASYNC_CLK_DIV1:ADC_KCLK不分频
|
||
* @arg ADC_ASYNC_CLK_DIV2:ADC_KCLK 2分频
|
||
* @arg ADC_ASYNC_CLK_DIV4:ADC_KCLK 4分频
|
||
* @arg ...
|
||
* @arg ADC_ASYNC_CLK_DIV128:ADC_KCLK 128分频
|
||
* @retval 无
|
||
*/
|
||
__STATIC_INLINE void std_adc_asynchronous_clock_config(uint32_t presc)
|
||
{
|
||
MODIFY_REG(ADC->CFG2, ADC_CFG2_PRESC, presc);
|
||
}
|
||
|
||
/**
|
||
* @brief 使能ADC校准
|
||
* @note 当ADEN=1,ADC稳定后,且START=0、STOP=0、ADDIS=0,才允许通过软件将CALEN位置1
|
||
* @retval 无
|
||
*/
|
||
__STATIC_INLINE void std_adc_calibration_enable(void)
|
||
{
|
||
ADC->CR = (ADC_CR_CALEN);
|
||
}
|
||
|
||
/**
|
||
* @brief 启动ADC转换
|
||
* @retval 无
|
||
*/
|
||
__STATIC_INLINE void std_adc_start_conversion(void)
|
||
{
|
||
ADC->CR = (ADC_CR_START);
|
||
}
|
||
|
||
/**
|
||
* @brief 获取ADC工作状态
|
||
* @retval bool 返回逻辑表达式的判断结果
|
||
* @arg true: 表示ADC正处于工作状态
|
||
* @arg false:表示ADC处于未工作状态
|
||
*/
|
||
__STATIC_INLINE bool std_adc_get_conversion_status(void)
|
||
{
|
||
return ((ADC->CR & ADC_CR_START) == ADC_CR_START);
|
||
}
|
||
|
||
/**
|
||
* @brief ADC停止转换
|
||
* @note 仅当START=1且ADDIS=0时,软件将STOP位置1生效
|
||
* @retval 无
|
||
*/
|
||
__STATIC_INLINE void std_adc_stop_conversion(void)
|
||
{
|
||
ADC->CR = (ADC_CR_STOP);
|
||
}
|
||
|
||
/**
|
||
* @brief ADC中断使能
|
||
* @param interrupt ADC中断源
|
||
* @arg ADC_INTERRUPT_EOSAMP
|
||
* @arg ADC_INTERRUPT_EOC
|
||
* @arg ADC_INTERRUPT_EOS
|
||
* @arg ADC_INTERRUPT_OVRN
|
||
* @arg ADC_INTERRUPT_AWDG1
|
||
* @arg ADC_INTERRUPT_EOCAL
|
||
* @retval 无
|
||
*/
|
||
__STATIC_INLINE void std_adc_interrupt_enable(uint32_t interrupt)
|
||
{
|
||
ADC->IER |= (interrupt);
|
||
}
|
||
|
||
/**
|
||
* @brief ADC中断禁止
|
||
* @param interrupt ADC中断源
|
||
* @arg ADC_INTERRUPT_EOSAMP
|
||
* @arg ADC_INTERRUPT_EOC
|
||
* @arg ADC_INTERRUPT_EOS
|
||
* @arg ADC_INTERRUPT_OVRN
|
||
* @arg ADC_INTERRUPT_AWDG1
|
||
* @arg ADC_INTERRUPT_EOCAL
|
||
* @retval 无
|
||
*/
|
||
__STATIC_INLINE void std_adc_interrupt_disable(uint32_t interrupt)
|
||
{
|
||
ADC->IER &= (~interrupt);
|
||
}
|
||
|
||
/**
|
||
* @brief 获取ADC中断源使能状态
|
||
* @param interrupt ADC中断源信息
|
||
* @arg ADC_INTERRUPT_EOSAMP
|
||
* @arg ADC_INTERRUPT_EOC
|
||
* @arg ADC_INTERRUPT_EOS
|
||
* @arg ADC_INTERRUPT_OVRN
|
||
* @arg ADC_INTERRUPT_AWDG1
|
||
* @arg ADC_INTERRUPT_EOCAL
|
||
* @retval bool 返回逻辑表达式的判断结果
|
||
* @arg true: 表示指定的中断使能
|
||
* @arg false:表示指定的中断未使能
|
||
*/
|
||
|
||
__STATIC_INLINE bool std_adc_get_interrupt_enable(uint32_t interrupt)
|
||
{
|
||
return((ADC->IER & (interrupt)) == (interrupt));
|
||
}
|
||
|
||
/**
|
||
* @brief 获取ADC标志状态
|
||
* @param flag 获取ADC标志
|
||
* @arg ADC_FLAG_EOSAMP
|
||
* @arg ADC_FLAG_EOC
|
||
* @arg ADC_FLAG_EOS
|
||
* @arg ADC_FLAG_OVRN
|
||
* @arg ADC_FLAG_AWDG1
|
||
* @arg ADC_FLAG_EOCAL
|
||
* @retval bool 返回标志位状态
|
||
* @arg true: 表示当前标志为置位状态
|
||
* @arg false:表示当前标志为清除状态
|
||
*/
|
||
__STATIC_INLINE bool std_adc_get_flag(uint32_t flag)
|
||
{
|
||
return((ADC->ISR & (flag)) == (flag));
|
||
}
|
||
|
||
/**
|
||
* @brief 清除ADC标志
|
||
* @param flag 清除ADC标志
|
||
* @arg ADC_FLAG_EOSAMP
|
||
* @arg ADC_FLAG_EOC
|
||
* @arg ADC_FLAG_EOS
|
||
* @arg ADC_FLAG_OVRN
|
||
* @arg ADC_FLAG_AWDG1
|
||
* @arg ADC_FLAG_EOCAL
|
||
* @retval 无
|
||
*/
|
||
__STATIC_INLINE void std_adc_clear_flag(uint32_t flag)
|
||
{
|
||
ADC->ISR = (flag);
|
||
}
|
||
|
||
/**
|
||
* @brief 配置ADC转换模式
|
||
* @param conversion_mode 转换模式选择
|
||
* @arg ADC_SINGLE_CONVER_MODE
|
||
* @arg ADC_CONTINUOUS_CONVER_MODE
|
||
* @arg ADC_DISCONTINUOUS_CONVER_MODE
|
||
* @note 当START=0时,软件对此位域执行写操作生效
|
||
* @retval 无
|
||
*/
|
||
__STATIC_INLINE void std_adc_conversion_mode_config(uint32_t conversion_mode)
|
||
{
|
||
MODIFY_REG(ADC->CFG1, ADC_CFG1_CONV_MOD, conversion_mode);
|
||
}
|
||
|
||
/**
|
||
* @brief ADC通道使能
|
||
* @param channel 通道号选择
|
||
* @arg ADC_CHANNEL_NONE
|
||
* @arg ADC_CHANNEL_0
|
||
* @arg ...
|
||
* @arg ADC_CHANNEL_ALL
|
||
* @retval 无
|
||
*/
|
||
__STATIC_INLINE void std_adc_fix_sequence_channel_enable(uint32_t channel)
|
||
{
|
||
ADC->CHCFG |= (channel);
|
||
}
|
||
|
||
/**
|
||
* @brief ADC通道禁止
|
||
* @param channel 禁止通道选择
|
||
* @arg ADC_CHANNEL_0
|
||
* @arg ADC_CHANNEL_1
|
||
* @arg ...
|
||
* @arg ADC_CHANNEL_ALL
|
||
* @retval 无
|
||
*/
|
||
__STATIC_INLINE void std_adc_fix_sequence_channel_disable(uint32_t channel)
|
||
{
|
||
ADC->CHCFG &= (~channel);
|
||
}
|
||
|
||
/**
|
||
* @brief 配置ADC触发方式和极性
|
||
* @param trig_edge 触发极性选择
|
||
* @arg ADC_TRIG_SW(软件触发方式)
|
||
* @arg ADC_TRIG_HW_EDGE_RISING
|
||
* @arg ADC_TRIG_HW_EDGE_FALLING
|
||
* @arg ADC_TRIG_HW_EDGE_BOTH
|
||
* @retval 无
|
||
*/
|
||
__STATIC_INLINE void std_adc_trig_edge_config(uint32_t trig_edge)
|
||
{
|
||
MODIFY_REG(ADC->CFG1, ADC_CFG1_TRIGEN, trig_edge);
|
||
}
|
||
|
||
/**
|
||
* @brief 配置ADC外部触发源
|
||
* @param trig_source 外部触发源性选择
|
||
* @arg ADC_EXTRIG_TIM3_TRGO
|
||
* @arg ADC_EXTRIG_TIM4_TRGO
|
||
* @arg ADC_EXTRIG_TIM5_TRGO
|
||
* @arg ADC_EXTRIG_TIM8_TRGO
|
||
* @arg ADC_EXTRIG_EXTI2
|
||
* @arg ADC_EXTRIG_EXTI11
|
||
* @retval 无
|
||
*/
|
||
__STATIC_INLINE void std_adc_external_trig_source_config(uint32_t trig_source)
|
||
{
|
||
MODIFY_REG(ADC->CFG1, ADC_CFG1_TRIG_SEL, trig_source);
|
||
}
|
||
|
||
/**
|
||
* @brief ADC采样时间参数1配置
|
||
* @param sample_time 采样时间选择
|
||
* @arg ADC_SAMPTIME_3CYCLES
|
||
* @arg ...
|
||
* @arg ADC_SAMPTIME_1919CYCLES
|
||
* @retval 无
|
||
*/
|
||
__STATIC_INLINE void std_adc_sampt1_time_config(uint32_t sample_time)
|
||
{
|
||
MODIFY_REG(ADC->SAMPT, ADC_SAMPT_SAMPT1, sample_time);
|
||
}
|
||
|
||
/**
|
||
* @brief ADC采样时间参数2配置
|
||
* @param sample_time 采样时间选择
|
||
* @arg ADC_SAMPTIME_3CYCLES
|
||
* @arg ...
|
||
* @arg ADC_SAMPTIME_1919CYCLES
|
||
* @retval 无
|
||
*/
|
||
__STATIC_INLINE void std_adc_sampt2_time_config(uint32_t sample_time)
|
||
{
|
||
MODIFY_REG(ADC->SAMPT, ADC_SAMPT_SAMPT2, sample_time << ADC_SAMPT_SAMPT2_POS);
|
||
}
|
||
|
||
/**
|
||
* @brief 配置ADC通道采样时间
|
||
* @param samptx 采样时间参数组选择
|
||
* @arg ADC_SAMPTIME_GROUP_1
|
||
* @arg ADC_SAMPTIME_GROUP_2
|
||
* @param channel 通道采样时间选择
|
||
* @arg ADC_CHANNEL_0
|
||
* @arg ADC_CHANNEL_1
|
||
* @arg ...
|
||
* @arg ADC_CHANNEL_VBAT_DIV3
|
||
* @arg ADC_CHANNEL_VDDA_DIV3
|
||
* @retval 无
|
||
*/
|
||
__STATIC_INLINE void std_adc_channel_sample_time_select(uint32_t samptx, uint32_t channel)
|
||
{
|
||
if(samptx == ADC_SAMPTIME_GROUP_1)
|
||
{
|
||
ADC->SAMPT &= (~(channel << ADC_SAMPT_SAMPT_SEL_POS));
|
||
}
|
||
else
|
||
{
|
||
ADC->SAMPT |= (channel << ADC_SAMPT_SAMPT_SEL_POS);
|
||
}
|
||
}
|
||
|
||
/**
|
||
* @brief 配置ADC校准系数
|
||
* @param calibration_factor 参数范围为0x00~0x3F
|
||
* @retval 无
|
||
*/
|
||
__STATIC_INLINE void std_adc_calibration_factor_config(uint32_t calibration_factor)
|
||
{
|
||
ADC->CALFACT = calibration_factor;
|
||
}
|
||
|
||
/**
|
||
* @brief 使能ADC等待模式
|
||
* @note 用于避免数据未及时读取,转换溢出
|
||
* @retval 无
|
||
*/
|
||
__STATIC_INLINE void std_adc_wait_mode_enable(void)
|
||
{
|
||
ADC->CFG1 |= (ADC_CFG1_WAIT_MOD);
|
||
}
|
||
|
||
/**
|
||
* @brief 禁止ADC等待模式
|
||
* @retval 无
|
||
*/
|
||
__STATIC_INLINE void std_adc_wait_mode_disable(void)
|
||
{
|
||
ADC->CFG1 &= (~ADC_CFG1_WAIT_MOD);
|
||
}
|
||
|
||
/**
|
||
* @brief 配置通道序列扫描方向
|
||
* @param dir ADC通道扫描方向
|
||
* @arg ADC_SCAN_DIR_FORWARD
|
||
* @arg ADC_SCAN_DIR_BACKWARD
|
||
* @retval 无
|
||
*/
|
||
__STATIC_INLINE void std_adc_scan_direction_config(uint32_t dir)
|
||
{
|
||
MODIFY_REG(ADC->CFG1, ADC_CFG1_SDIR, dir);
|
||
}
|
||
|
||
/**
|
||
* @brief 配置ADC数据溢出管理方式
|
||
* @param ovrn_mode ADC数据溢出管理方式
|
||
* @arg ADC_OVRN_MODE_PRESERVED
|
||
* @arg ADC_OVRN_MODE_OVERWRITTEN
|
||
* @retval 无
|
||
*/
|
||
__STATIC_INLINE void std_adc_ovrn_mode_config(uint32_t ovrn_mode)
|
||
{
|
||
MODIFY_REG(ADC->CFG1, ADC_CFG1_OVRN_MOD, ovrn_mode);
|
||
}
|
||
|
||
/**
|
||
* @brief ADC内部通道使能
|
||
* @param inter_channel ADC内部通道
|
||
* @arg ADC_INTERNAL_CHANNEL_VBGREN
|
||
* @arg ADC_INTERNAL_CHANNEL_VTSEN
|
||
* @arg ADC_INTERNAL_CHANNEL_VBAT_DIV3
|
||
* @arg ADC_INTERNAL_CHANNEL_VDDA_DIV3
|
||
* @retval 无
|
||
*/
|
||
__STATIC_INLINE void std_adc_internal_channel_enable(uint32_t inter_channel)
|
||
{
|
||
ADC->CFG2 |= (inter_channel);
|
||
}
|
||
|
||
/**
|
||
* @brief ADC内部通道禁止
|
||
* @param inter_channel ADC内部通道
|
||
* @arg ADC_INTERNAL_CHANNEL_VBGREN
|
||
* @arg ADC_INTERNAL_CHANNEL_VTSEN
|
||
* @arg ADC_INTERNAL_CHANNEL_VBAT_DIV3
|
||
* @arg ADC_INTERNAL_CHANNEL_VDDA_DIV3
|
||
* @retval 无
|
||
*/
|
||
__STATIC_INLINE void std_adc_internal_channel_disable(uint32_t inter_channel)
|
||
{
|
||
ADC->CFG2 &= (~inter_channel);
|
||
}
|
||
|
||
/**
|
||
* @brief 选择ADC模拟看门狗监控通道
|
||
* @param channel ADC看门狗监控通道选择
|
||
* @arg ADC_AWDG_CHANNEL_NONE
|
||
* @arg ADC_AWDG_CHANNEL_0
|
||
* @arg ...
|
||
* @arg ADC_AWDG_CHANNEL_ALL
|
||
* @retval 无
|
||
*/
|
||
__STATIC_INLINE void std_adc_analog_watchdog_monit_channel(uint32_t channel)
|
||
{
|
||
MODIFY_REG(ADC->AWDG1CR, ADC_AWDG1CR_AWDG1_CHN, channel);
|
||
}
|
||
|
||
/**
|
||
* @brief 配置看门狗监控通道电压阈值
|
||
* @param high_threshold 阈值上限选择范围为 0x000~0xFFF
|
||
* @param low_threshold 阈值下限选择范围为 0x000~0xFFF
|
||
* @retval 无
|
||
*/
|
||
__STATIC_INLINE void std_adc_analog_watchdog_thresholds_config(uint32_t high_threshold, uint32_t low_threshold)
|
||
{
|
||
MODIFY_REG(ADC->AWDG1TR, (ADC_AWDG1TR_AWDG1_LT | ADC_AWDG1TR_AWDG1_HT), (high_threshold << 16U) | (low_threshold >> 0U));
|
||
}
|
||
|
||
/**
|
||
* @brief 获取ADC采样值
|
||
* @retval ADC转换值
|
||
*/
|
||
__STATIC_INLINE uint16_t std_adc_get_conversion_value(void)
|
||
{
|
||
return ((uint16_t)(ADC->DR));
|
||
}
|
||
|
||
/**
|
||
* @brief 使能低频触发
|
||
* @retval 无
|
||
*/
|
||
__STATIC_INLINE void std_adc_low_frequency_trig_enable(void)
|
||
{
|
||
ADC->CFG2 |= (ADC_CFG2_LFTRG);
|
||
}
|
||
|
||
/**
|
||
* @brief 禁止低频触发
|
||
* @retval 无
|
||
*/
|
||
__STATIC_INLINE void std_adc_low_frequency_trig_disable(void)
|
||
{
|
||
ADC->CFG2 &= (~ADC_CFG2_LFTRG);
|
||
}
|
||
|
||
/**
|
||
* @brief ADC参考电压源设置
|
||
* @arg ADC_REFERENCE_VREFBUF
|
||
* @arg ADC_REFERENCE_VREFP
|
||
* @arg ADC_REFERENCE_VDDA
|
||
* @note VRFEBUF输出作为参考电压源,需使能VREFBUF,配置PA0引脚为模拟模式,外接1uF+0.1uF电容;
|
||
* VREF+引脚输入作为参考电压源,配置PA0引脚为模拟模式;
|
||
* @retval 无
|
||
*/
|
||
__STATIC_INLINE void std_adc_set_reference_source(uint32_t reference_voltage)
|
||
{
|
||
MODIFY_REG(ADC->CFG2, ADC_CFG2_REF, reference_voltage);
|
||
}
|
||
|
||
/* ADC初始化函数 */
|
||
void std_adc_init(std_adc_init_t *adc_init_param);
|
||
/* ADC结构体初始化*/
|
||
void std_adc_struct_init(std_adc_init_t *adc_init_struct);
|
||
/* ADC去初始化函数 */
|
||
void std_adc_deinit(void);
|
||
|
||
/**
|
||
* @}
|
||
*/
|
||
|
||
#ifdef __cplusplus
|
||
}
|
||
#endif
|
||
|
||
/**
|
||
* @}
|
||
*/
|
||
|
||
/**
|
||
* @}
|
||
*/
|
||
|
||
#endif /* CIU32L051_STD_ADC_H */
|