/********************************************************************************
 * @file    COMP_AnalogWatchdog.c
 * @author  SOC AE Team
 * @version V1.1
 * @date    2025-06-27
 * @brief   使用CMP作为模拟看门狗，当VDD电压小于1.5V时，芯片进行复位。
 *
 *******************************************************************************/
#include "sc32_conf.h"
#include "Function_Init.h"
#if defined(SC32f10xx)|| defined(SC32f12xx)
static volatile uint8_t CMP_Flag;

void CMP_AnalogWatchdog_Function(void)
{
  volatile uint16_t CMP_Value;
  CMP_InitTypeDef CMP_InitStruct; //定义CMP初始化结构体变量

  RCC_APB2Cmd(ENABLE);  //CMP外设挂载在APB2时钟上
  CMP_Cmd(CMP, ENABLE);	//使能CMP；

  /* 配置正负端输入，CMP中断触发条件为 VDD < 1.5V/10*16 = 2.4V */
  CMP_InitStruct.CMP_Negative = CMP_Negative_10D16VDD;  //CMP负端为10/16 VDD
#if defined(SC32f10xx) 
  CMP_InitStruct.CMP_Positive = CMP_Positive_1_5V;  //CMP正端为内部1.5V基准源
#elif defined(SC32f12xx)
  CMP_InitStruct.CMP_Positive = CMP_Positive_1_6V;  //CMP正端为内部1.6V基准源	
#endif
  CMP_InitStruct.CMP_TriggerMode = CMP_TriggerMode_RISE; //VDD变小时，正端向大于负端趋势变化，上升沿

  CMP_Init(CMP, &CMP_InitStruct); //根据结构体标志位配置CMP

  CMP_ClearFlag(CMP, CMP_FLAG_IF); //清除CMP标志位

  NVIC_EnableIRQ(CMP_IRQn);

  printf("CMP Analog Watchdog Initialization successful!\r\n");
  /* 判断初始状态正端是否已大于负端，如果是则直接复位 */
  if(CMP_GetCMPSTA(CMP) == CMP_CMPSTA_High)
  {
    printf("CMP Analog Watchdog Reset!\r\n");
    NVIC_SystemReset();
  }

  while(1);
}

void CMP_AnalogWatchdog_CMPHandler(void)
{
  /* 发生了上升沿中断，复位 */
  if(CMP_GetFlagStatus(CMP, CMP_FLAG_IF)) //判断CMP标志位
  {
    CMP_ClearFlag(CMP, CMP_FLAG_IF); //清除CMP标志位
    printf("CMP Analog Watchdog Reset!\r\n");
    NVIC_SystemReset();
  }
}
#endif
