/********************************************************************************
 * @file    INT_Example.c
 * @author  SOC AE Team
 * @version V1.1
 * @date    2025-06-27
 * @brief   配置IO为INT输入口，并且开启相关的中断。
 *
 *******************************************************************************/
#include "sc32_conf.h"
#include "Function_Init.h"

void INT_Example_Function(void)
{
  INT_InitTypeDef INT_InitStruct; //定义INT初始化结构体变量
  GPIO_InitTypeDef GPIO_InitStruct; //定义GPIO初始化结构体变量，定义为外部中断前需要将IO口设置为上拉输入
  
  //PA0设置为上升沿中断
  GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
  GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_PU;
  GPIO_Init(GPIOA, &GPIO_InitStruct);
  
  INT_InitStruct.INT_Channel = INT_Channel_0;
  INT_InitStruct.INT_INTSEL = INT_INTSEL_PA;
  INT_InitStruct.INT_Trigger = INT_Trigger_Rising;
  INT_Init(&INT_InitStruct);

  //PB2设置为上升沿中断
  GPIO_InitStruct.GPIO_Pin = GPIO_Pin_2;
  GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_PU;
  GPIO_Init(GPIOB, &GPIO_InitStruct);
  
  INT_InitStruct.INT_Channel = INT_Channel_2;
  INT_InitStruct.INT_INTSEL = INT_INTSEL_PB;
  INT_InitStruct.INT_Trigger = INT_Trigger_Falling;
  INT_Init(&INT_InitStruct);

  
  //PC9设置为上升下降沿中断
  GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;
  GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_PU;
  GPIO_Init(GPIOC, &GPIO_InitStruct);
  INT_InitStruct.INT_Channel = INT_Channel_9;
  INT_InitStruct.INT_INTSEL = INT_INTSEL_PC;
  INT_InitStruct.INT_Trigger = INT_Trigger_Rising_Falling;
  INT_Init(&INT_InitStruct);
  
  //PC12设置为上升下降沿中断
  GPIO_InitStruct.GPIO_Pin = GPIO_Pin_12;
  GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_PU;
  GPIO_Init(GPIOC, &GPIO_InitStruct);
  INT_InitStruct.INT_Channel = INT_Channel_12;
  INT_InitStruct.INT_INTSEL = INT_INTSEL_PC;
  INT_InitStruct.INT_Trigger = INT_Trigger_Rising_Falling;
  INT_Init(&INT_InitStruct);

  /* 开启对应的中断 */
  INT_ITConfig(INT_Channel_0, INT_IT_Rising, ENABLE);
  NVIC_EnableIRQ(INT0_IRQn);

  INT_ITConfig(INT_Channel_2, INT_Trigger_Falling, ENABLE);
  NVIC_EnableIRQ(INT1_7_IRQn);

  INT_ITConfig(INT_Channel_9, INT_Trigger_Rising_Falling, ENABLE);
  NVIC_EnableIRQ(INT8_11_IRQn);
  
  INT_ITConfig(INT_Channel_12, INT_Trigger_Rising_Falling, ENABLE);
  NVIC_EnableIRQ(INT12_15_IRQn);
  while(1);
}

void INT_Example_INT0Handler(void)
{
  if(INT_GetFlagStatus(INT_Channel_0, INT_Flag_Rising)) //判断INT0标志位
  {
    INT_ClearFlag(INT_Channel_0);
    printf("INT0上升沿中断已触发！\r\n");
  }
}

void INT_Example_INT1_7Handler(void)
{
  if(INT_GetFlagStatus(INT_Channel_2, INT_Flag_Falling)) //判断INT1_7标志位
  {
    INT_ClearFlag(INT_Channel_2);
    printf("INT2下降沿中断已触发！\r\n");
  }
}

void INT_Example_INT8_11_Handler(void)
{
  if(INT_GetFlagStatus(INT_Channel_9, INT_Flag_Rising)) //判断INT8_11标志位
  {
    INT_ClearFlag(INT_Channel_9);
    printf("INT9上升沿中断已触发！\r\n");
  }
  if(INT_GetFlagStatus(INT_Channel_9, INT_Flag_Falling)) //判断INT8_11标志位
  {
    INT_ClearFlag(INT_Channel_9);
    printf("INT9下降沿中断已触发！\r\n");
  }
}

void INT_Example_INT12_15_Handler(void)
{
  if(INT_GetFlagStatus(INT_Channel_12, INT_Flag_Rising)) //判断INT12_15标志位
  {
    INT_ClearFlag(INT_Channel_12);
    printf("INT12上升沿中断已触发！\r\n");
  }
  if(INT_GetFlagStatus(INT_Channel_12, INT_Flag_Falling)) //判断INT12_15标志位
  {
    INT_ClearFlag(INT_Channel_12);
    printf("INT12下降沿中断已触发！\r\n");
  }
}
