arduino_midi_player/Midi/music-box-nv32-master/nv32lib/drivers/acmp/acmp.c
2025-03-24 14:30:56 +08:00

170 lines
4.2 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.

/**************************************************************************!
* 技术讨论QQ群 123763203
* 官网 www.navota.com
*
* @file acmp.c
* @brief 模拟比较器(ACMP)函数库
* @author Navota
* @date 2018-3-1
****************************************************************************/
#include "common.h"
#include "acmp.h"
/****************************************************************************!
* @ 存放ACMP回调函数接口
****************************************************************************/
ACMP_CallbackPtr ACMP_Callback[2] = {(ACMP_CallbackPtr)NULL};
/**************************************************************************/
void ACMP0_Isr(void);
void ACMP1_Isr(void);
/*****************************************************************************//*!
*
* @brief 初始化ACMP模块
*
* @param pACMPx 指向ACMP寄存器基址
* @param pConfig 控制参数
*
* @return none.
*
* @see ACMP_DeInit.
*
*****************************************************************************/
void ACMP_Init(ACMP_Type *pACMPx, ACMP_ConfigType *pConfig)
{
if(ACMP0 == pACMPx)
{
/* 使能ACMP模块的总线时钟 */
SIM->SCGC |= SIM_SCGC_ACMP0_MASK;
/* 使能ACMP中断 */
if(pConfig->sCtrlStatus.bits.bIntEn)
NVIC_EnableIRQ(ACMP0_IRQn);
}
else
{
SIM->SCGC |= SIM_SCGC_ACMP1_MASK;
if(pConfig->sCtrlStatus.bits.bIntEn)
NVIC_EnableIRQ(ACMP1_IRQn);
}
/*选择ACMP正输入和负输入正输入和负输入引脚不同*/
pACMPx->C0 = pConfig->sPinSelect.byte;
ACMP_ConfigDAC(pACMPx, &pConfig->sDacSet );
//pACMPx->C1 = pConfig->sDacSet.byte;
pACMPx->C2 = pConfig->sPinEnable.byte;
pACMPx->CS = pConfig->sCtrlStatus.byte;
}
/*****************************************************************************//*!
*
* @brief 配置ACMP控制寄存器1.
*
* @param pACMPx 指向ACMP模块寄存器基地址
* @param pDACConfig 指向 ACMP DAC 控制结构体.
*
* @return none.
*
*****************************************************************************/
void ACMP_ConfigDAC(ACMP_Type *pACMPx, ACMP_DACType *pDACConfig)
{
pACMPx->C1 = pDACConfig->byte;
}
/*****************************************************************************//*!
*
* @brief 复位ACMP模块.
*
* @param pACMPx 指向ACMP模块寄存器基地址
*
* @return none.
*
* @see ACMP_Init.
*
*****************************************************************************/
void ACMP_DeInit(ACMP_Type *pACMPx)
{
if(ACMP0 == pACMPx)
{
if(pACMPx->CS & ACMP_CS_ACIE_MASK)
NVIC_DisableIRQ(ACMP0_IRQn);
}
else
{
if(pACMPx->CS & ACMP_CS_ACIE_MASK)
NVIC_DisableIRQ(ACMP1_IRQn);
}
pACMPx->CS = 0;
pACMPx->C0 = 0;
pACMPx->C1 = 0;
pACMPx->C2 = 0;
if(ACMP0 == pACMPx)
{
SIM->SCGC &= ~SIM_SCGC_ACMP0_MASK;
}
else
{
SIM->SCGC &= ~SIM_SCGC_ACMP1_MASK;
}
}
/*****************************************************************************//*!
*
* @brief 设置ACMP回调函数通过中断服务函数调用回调函数.
*
* @param pACMPx 指向ACMP模块寄存器基地址.
* @param pfnCallback 回调函数.
*
* @return none.
*
*
*****************************************************************************/
void ACMP_SetCallback(ACMP_Type *pACMPx, ACMP_CallbackPtr pfnCallback)
{
if(ACMP0 == pACMPx)
{
ACMP_Callback[0] = pfnCallback;
}
else
{
ACMP_Callback[1] = pfnCallback;
}
}
/*****************************************************************************//*!
*
* @brief ACMP0 中断服务函数.
*
* @param none.
*
* @return none.
*
*****************************************************************************/
void ACMP0_Isr(void)
{
if(ACMP_Callback[0])
{
ACMP_Callback[0](); /*调用回调函数*/
}
}
/*****************************************************************************//*!
*
* @brief ACMP1 中断服务函数
*
* @param none.
*
* @return none.
*
*****************************************************************************/
void ACMP1_Isr(void)
{
if(ACMP_Callback[1])
{
ACMP_Callback[1](); /* 调用回调函数*/
}
}