rt-thread/bsp/essemi/es8p508x/libraries/Library/Source/lib_adc.c

302 lines
8.6 KiB
C
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), 2017, Shanghai Eastsoft Microelectronics Co., Ltd
*文件名: lib_timer.c
*作 者: Liut
*版 本: V1.00
*日 期: 2017/07/14
*描 述: ADC模块库函数
*备 注: 适用于 ES8P508x芯片
本软件仅供学习和演示使用,对用户直接引用代码所带来的风险或后果不承担任何法律责任。
***************************************************************/
#include "lib_adc.h"
/***************************************************************
函数名ADC_Init
描 述初始化ADC模块
输入值:初始化配置结构体地址
输出值:无
返回值:无
***************************************************************/
void ADC_Init(ADC_InitStruType * ADC_InitStruct)
{
ADC->VREFCON.VREF_EN = ENABLE; //内部VREFP使能
ADC->VREFCON.IREF_EN = ENABLE; //IREF使能位
ADC->CON1.VCMBUF_EN = ENABLE; //ADC共模电压VCM BUF使能
ADC ->CON1.VCMBUF_HS = ENABLE; //ADC共模电压VCM BUF高速模式使能
ADC->CON1.HSEN = ENABLE; //ADC转换速度高速
ADC->CHS.VDD5_FLAG_EN = DISABLE; //屏蔽VDD检测控制
ADC->CON1.CLKS = ADC_InitStruct->ADC_ClkS; //ADCCON1:bit3 ADC时钟源选择
ADC->CON1.CLKDIV = ADC_InitStruct->ADC_ClkDiv; //ADCCON1:bit2-0 ADC时钟源预分频
ADC->CON1.VREFP = ADC_InitStruct->ADC_VrefP; //ADCCON1:bit9-8 ADC正向参考电压选择
ADC->CON1.SMPS = ADC_InitStruct->ADC_SampS; //ADCCON1:bit12 ADC采样模式选择
ADC->CHS.CHS = ADC_InitStruct->ADC_ChS; //ADCCHS:bit0-3 ADC模拟通道选择
ADC->CON1.ST = ADC_InitStruct->ST; //ADCCON1:bit20-16 ADC采样时间选择 ST*2+1个Tadclk
//ADC->VREFCON.VREF_SEL=ADC_InitStruct->VREF_SEL;//内部参考电压选择
ADC->CON1.VREFN = ADC_InitStruct->ADC_VREFN; //负向参考电压使能位
ADC->CON1.VRBUF_EN = ADC_InitStruct->ADC_VRBUF_EN; //VREF BUF使能位
}
/***************************************************************
函数名ADC_Set_CH
描 述选择ADC模拟通道
输入值:通道
输出值:无
返回值:无
***************************************************************/
void ADC_Set_CH(ADC_TYPE_CHS AdcCH)
{
ADC->CHS.CHS = AdcCH;
}
/***************************************************************
函数名ADC_GetConvValue
描 述获取ADC转换结果
输入值:无
输出值:无
返回值:转换值
***************************************************************/
uint16_t ADC_GetConvValue(void)
{
return ((uint16_t)ADC->DR.DR);
}
/***************************************************************
函数名ADC_GetConvStatus
描 述获取ADC转换状态
输入值:无
输出值:无
返回值RESET(完成)/SET(正在转换)
***************************************************************/
FlagStatus ADC_GetConvStatus(void)
{
FlagStatus bitstatus = RESET;
/* 检测转换状态寄存器 */
if ((ADC->CON0.TRIG != (uint32_t)RESET))
bitstatus = SET; //正在转换
else
bitstatus = RESET; //转换完成
return bitstatus;
}
/***************************************************************
函数名ADC_ACPConfig
描 述ADC 自动比较功能初始化
输入值ADC_ACP_InitStruct 自动比较功能初始化结构体
输出值:无
返回值SUCCESS 成功
ERROR 失败
***************************************************************/
ErrorStatus ADC_ACPConfig(ADC_ACP_TypeDef *ADC_ACP_InitStruct)
{
if(ADC_ACP_InitStruct->ACPC_OVER_TIME > ADC_ACPC_OVFL_TIME_MAX
||ADC_ACP_InitStruct->ACPC_TIMES > ADC_ACPC_TIMES_MAX
||ADC_ACP_InitStruct->ACPC_MIN_TARGET > ADC_ACP_MIN_MAX
||ADC_ACP_InitStruct->ACPC_MAX_TARGET > ADC_ACP_MAX_MAX)
{
return ERROR;
}
if(ADC_ACP_InitStruct->ACP_EN == ENABLE)
{
if(ADC->CON1.CLKS == ADC_ClkS_PCLK)
{
ADC->ACPC.CLKS = ADC_ACPC_CLKS_PCLK;
}
else
{
ADC->ACPC.CLKS = ADC_ACPC_CLKS_LRC;
}
ADC->ACPC.OVFL_TIME = ADC_ACP_InitStruct ->ACPC_OVER_TIME;
ADC->ACPC.TIMES = ADC_ACP_InitStruct->ACPC_TIMES;
ADC->IE.ACPOVIE = ENABLE;
/* 假设用户将高阀值设置成0(最小值),我们可以认为其想关闭该功能 */
if(ADC_ACP_InitStruct ->ACPC_MAX_TARGET ==0x0)
{
ADC->IE.ACPMAXIE = DISABLE;
}
else
{
ADC->ACPCMP.CMP_MAX =ADC_ACP_InitStruct ->ACPC_MAX_TARGET;
ADC->IE.ACPMAXIE = ENABLE;
}
/* 假设用户将低阀值设置成0xfff(最大值),我们可以认为其想关闭该功能 */
if(ADC_ACP_InitStruct ->ACPC_MIN_TARGET == 0xfff)
{
ADC->IE.ACPMINIE = DISABLE;
}
else
{
ADC->ACPCMP.CMP_MIN =ADC_ACP_InitStruct ->ACPC_MIN_TARGET;
ADC->IE.ACPMINIE = ENABLE;
}
ADC->CON0.ACP_EN = ENABLE;
}
else
{
ADC->CON0.ACP_EN = DISABLE;
}
return SUCCESS;
}
/***************************************************************
函数名ADC_SampStart
描 述ADC 采样软件控制-启动函数
输入值:无
输出值:无
返回值SUCCESS 成功
ERROR 失败
***************************************************************/
ErrorStatus ADC_SoftStart(void)
{
if(ADC->CON1.SMPS == ADC_SMPS_HARD)
return ERROR;
ADC ->CON1.SMPON = SET;
return SUCCESS;
}
/***************************************************************
函数名ADC_SampStop
描 述ADC 采样软件控制-停止函数
输入值:无
输出值:无
返回值SUCCESS 成功
ERROR 失败
***************************************************************/
ErrorStatus ADC_SoftStop(void)
{
if(ADC->CON1.SMPS == ADC_SMPS_HARD)
return ERROR;
ADC->CON1.SMPON = RESET;
return SUCCESS;
}
/***************************************************************
函数名ADC_GetACPMeanValue
描 述ADC 获得单次自动比较平均值
输入值:无
输出值:无
返回值:采样数据
***************************************************************/
uint16_t ADC_GetACPMeanValue(void)
{
return ((uint16_t)ADC->ACPMEAN.MEAN_DATA);
}
/***************************************************************
函数名ADC_GetACPMINValue
描 述ADC 获得单次自动比较平均值
输入值:无
输出值:无
返回值:采样数据
***************************************************************/
uint16_t ADC_GetACPMinValue(void)
{
return ((uint16_t)ADC->ACPCMP.CMP_MIN);
}
/***************************************************************
函数名ADC_GetACPMAXValue
描 述ADC 获得单次自动比较平均值
输入值:无
输出值:无
返回值:采样数据
***************************************************************/
uint16_t ADC_GetACPMaxValue(void)
{
return ((uint16_t)ADC->ACPCMP.CMP_MAX);
}
/***************************************************************
函数名ADC_GetFlagStatus
描 述读取ADC标志位状态
输入值IFNameADC中断标志
输出值:无
返回值SET/RESET
***************************************************************/
FlagStatus ADC_GetFlagStatus(ADC_TYPE_IF IFName)
{
FlagStatus bitstatus = RESET;
/* 检查中断标志位 */
if (((ADC->IF.Word & IFName) != (uint32_t)RESET))
bitstatus = SET; //转换完成
else
bitstatus = RESET; //无中断
return bitstatus;
}
/***************************************************************
函数名ADC_GetITStatus
描 述读取ADC中断状态未使能相应中断时不会返回SET
输入值:无
输出值:无
返回值SET中断/RESET无中断
***************************************************************/
ITStatus ADC_GetITStatus(ADC_TYPE_IE IEName)
{
ITStatus bitstatus = RESET;
/* 检查中断标志位 */
if (((ADC->IE.Word & IEName) != (uint32_t)RESET))
bitstatus = SET; //转换完成,进中断
else
bitstatus = RESET; //无中断
return bitstatus;
}
/***************************************************************
函数名ADC_ClearIFStatus
描 述ADC 清除特定类型中断
输入值IFName 中断类型选择
ADC_IF ADC中断
ADC_IF_ACPMIN 自动转换低阀值超出中断
ADC_IF_ACPMAX 自动转换高阀值超出中断
ADC_IF_ACPOVER 自动转换溢出中断
输出值:无
返回值SUCCESS 成功
ERROR 失败
***************************************************************/
ErrorStatus ADC_ClearIFStatus(ADC_TYPE_IF IFName)
{
ADC->IF.Word = (uint32_t)IFName;
return SUCCESS;
}
/***************************************************************
函数名ADC_Reset
描 述ADC复位
输入值:无
输出值:无
返回值:无
***************************************************************/
void ADC_Reset(void)
{
ADC->CON0.Word = 0x00000030;
ADC->CON1.Word = 0x00041000;
ADC->CHS.Word = 0x00000100;
ADC->IE.Word = 0x00000000;
ADC->IF.Word = 0x00000000;
ADC->ACPC.Word = 0x00000000;
ADC->ACPCMP.Word = 0x0FFF0000;
ADC->VREFCON.Word = 0x00000000;
}
/*************************END OF FILE**********************/