CIU32_L051_M307R/Peripheral/CIU32L051_Lib/Include/ciu32l051_std_adc.h

812 lines
33 KiB
C
Raw Permalink 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.

/************************************************************************************************/
/**
* @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; /**< 采样时间参数1ADC外设具有两组采样时间参数每个通道可选择其一
@arg ADC_SAMPTIME_3CYCLES ... */
uint32_t sampt2; /**< 采样时间参数2ADC外设具有两组采样时间参数每个通道可选择其一
@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_DIV1PCLK不分频
* @arg ADC_SYNC_CLK_PCLK_DIV2PCLK 2分频
* @arg ADC_SYNC_CLK_PCLK_DIV4PCLK 4分频
* @arg ADC_ASYNC_CLK_KCLKKCLK
* @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_DIV1ADC_KCLK不分频
* @arg ADC_ASYNC_CLK_DIV2ADC_KCLK 2分频
* @arg ADC_ASYNC_CLK_DIV4ADC_KCLK 4分频
* @arg ...
* @arg ADC_ASYNC_CLK_DIV128ADC_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=1ADC稳定后且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 */