| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301 |
- /***************************************************************
- *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标志位状态
- 输入值:IFName:ADC中断标志
- 输出值:无
- 返回值: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**********************/
|