/********************************************************************************
 * @file    CMP_Interrupt.c
 * @author  SOC AE Team
 * @version V1.1
 * @date    2025-06-27
 * @brief   CMP0电压和5/16 VDD进行比较，CMP0电压需要外接电压源。
 *
 *******************************************************************************/
#include "sc32_conf.h"
#include "Function_Init.h"

#if defined(SC32f10xx)||defined(SC32f12xx)
  static volatile uint8_t CMP_Flag;
#endif
void CMP_Interrupt_Function(void)
{
#if defined(SC32f10xx)||defined(SC32f12xx)

  volatile uint16_t CMP_Value;
  CMP_InitTypeDef CMP_InitStruct; //定义CMP初始化结构体变量
  GPIO_InitTypeDef GPIO_InitStruct; //定义GPIO初始化结构体变量，定义为外部中断前需要将IO口设置为上拉输入
  
  RCC_APB2Cmd(ENABLE);  //CMP外设挂载在APB2时钟上
#if defined(SC32f12xx)
//PA5设置为上升沿中断
  GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5;
  GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_PU;
  GPIO_Init(GPIOA, &GPIO_InitStruct);
#elif  defined(SC32f10xx)
//PA5设置为上升沿中断
  GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
  GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_PU;
  GPIO_Init(GPIOA, &GPIO_InitStruct);	

#endif
  CMP_InitStruct.CMP_Negative = CMP_Negative_5D16VDD;  //CMP负端为5/16 VDD
  CMP_InitStruct.CMP_Positive = CMP_Positive_CMP0;  //CMP正端为CMP0输入管脚
  CMP_InitStruct.CMP_TriggerMode = CMP_TriggerMode_RISE_FALL; //上升沿和下降沿都能触发CMP标志位置起

  CMP_Init(CMP, &CMP_InitStruct); //根据结构体标志位配置CMP
	
  NVIC_EnableIRQ(CMP_IRQn);
  CMP_Cmd(CMP,ENABLE);	//使能CMP；
  
  while(1)
  {
    if(CMP_Flag == 1)
    {
      CMP_Flag = 0;
      printf("Comparator triggers a rising edge interrupt~\r\n");
    }
    else if(CMP_Flag == 2)
    {
      CMP_Flag = 0;
      printf("Comparator triggers a falling edge interrupt~\r\n");
    }
  }

#endif
}
#if defined(SC32f10xx)||defined(SC32f12xx)
void CMP_Interrupt_CMPHandler(void)
{
  if(CMP_GetFlagStatus(CMP,CMP_FLAG_IF)) //判断CMP标志位
  {
    CMP_ClearFlag(CMP,CMP_FLAG_IF);  //清除CMP标志位
    
    if(CMP_GetCMPSTA(CMP) == CMP_CMPSTA_High)	//触发的是上升沿中断
    {
      CMP_Flag = 1;
    }
    else	//触发的是下降沿中断
    {
      CMP_Flag = 2;
    }
  }
}

#endif
