#ifndef __LKS32MC09X_EXTI_H__
#define __LKS32MC09X_EXTI_H__

#include "lks32mc09x_reg.h"
#define EXTI_CR_P0_0  0  // GPIO 0[0]/P0[0]外部触发类型选择
#define EXTI_CR_P0_2  1  // GPIO 0[2]/P0[2]外部触发类型选择
#define EXTI_CR_P0_11 2  // GPIO 0[11]/P0[11]外部触发类型选择
#define EXTI_CR_P0_12 3  // GPIO 0[12]/P0[12]外部触发类型选择
#define EXTI_CR_P0_13 4  // GPIO 0[13]/P0[13]外部触发类型选择
#define EXTI_CR_P0_14 5  // GPIO 0[14]/P0[14]外部触发类型选择
#define EXTI_CR_P0_15 6  // GPIO 0[15]/P0[15]外部触发类型选择
#define EXTI_CR_P1_0  7  // GPIO 1[0]/P1[0]外部触发类型选择
#define EXTI_CR_P2_0  8  // GPIO 2[0]/P2[0]外部触发类型选择
#define EXTI_CR_P2_3  9  // GPIO 2[3]/P2[3]外部触发类型选择
#define EXTI_CR_P2_4  10 // GPIO 2[4]/P2[4]外部触发类型选择
#define EXTI_CR_P2_5  11 // GPIO 2[5]/P2[5]外部触发类型选择
#define EXTI_CR_P2_6  12 // GPIO 2[6]/P2[6]外部触发类型选择
#define EXTI_CR_P2_7  13 // GPIO 2[7]/P2[7]外部触发类型选择
#define EXTI_CR_P2_9  14 // GPIO 2[9]/P2[9]外部触发类型选择
#define EXTI_CR_P2_13 15 // GPIO 2[13]/P2[13]外部触发类型选择

#define EXTI_IF_P2_0  BIT15 // 外部中断标志。中断标志高有效，写 1 清零
#define EXTI_IF_P2_13 BIT14 // 外部中断标志。中断标志高有效，写 1 清零
#define EXTI_IF_P2_6  BIT13 // 外部中断标志。中断标志高有效，写 1 清零
#define EXTI_IF_P2_5  BIT12 // 外部中断标志。中断标志高有效，写 1 清零
#define EXTI_IF_P2_4  BIT11 // 外部中断标志。中断标志高有效，写 1 清零
#define EXTI_IF_P2_3  BIT10 // 外部中断标志。中断标志高有效，写 1 清零
#define EXTI_IF_P2_9  BIT9  // 外部中断标志。中断标志高有效，写 1 清零
#define EXTI_IF_P2_7  BIT8  // 外部中断标志。中断标志高有效，写 1 清零
#define EXTI_IF_P1_0  BIT7  // 外部中断标志。中断标志高有效，写 1 清零
#define EXTI_IF_P0_15 BIT6  // 外部中断标志。中断标志高有效，写 1 清零
#define EXTI_IF_P0_14 BIT5  // 外部中断标志。中断标志高有效，写 1 清零
#define EXTI_IF_P0_13 BIT4  // 外部中断标志。中断标志高有效，写 1 清零
#define EXTI_IF_P0_12 BIT3  // 外部中断标志。中断标志高有效，写 1 清零
#define EXTI_IF_P0_11 BIT2  // 外部中断标志。中断标志高有效，写 1 清零
#define EXTI_IF_P0_2  BIT1  // 外部中断标志。中断标志高有效，写 1 清零
#define EXTI_IF_P0_0  BIT0  // 外部中断标志。中断标志高有效，写 1 清零

#define EXTI_CLKO_HSE BIT4 // 晶振时钟输出
#define EXTI_CLKO_ADC BIT3 // ADC 时钟输出
#define EXTI_CLKO_PLL BIT2 // PLL 输出 注意：由于GPIO本身输出能力的限制，选择PLL输出到gpio上时，用示波器只能在gpio上看到频率为96Mhz的一个微弱的信号
#define EXTI_CLKO_HSI BIT1 // HRC 输出
#define EXTI_CLKO_LSI BIT0 // LRC 输出
#define EXTI_CLKO_0   0    // 不输出任何时钟
/**
 * EXTI触发信号定义
 */
typedef enum
{
    EXTI_Trigger_None    = 0x00, ///< 不触发
    EXTI_Trigger_Negedge = 0x01, ///< 下降沿触发
    EXTI_Trigger_Posedge = 0x02, ///< 上升沿触发
    EXTI_Trigger_Edge    = 0x03  ///< 上升沿、下降沿均触发
} EXTI_Mode_TypeDef;

/**
 * @brief 复位EXTI模块
 *
 * @param EXTIx EXTI模块指针
 */
void EXTI_Reset(EXTI_TypeDef *EXTIx);

/**
 * @brief 配置GPIO引脚的中断触发模式
 *
 * @param EXTIx EXTI模块指针
 * @param GPIO_PinSource GPIO引脚源
 * @param EXTI_Trigger 触发模式
 */
void EXTI_TriggerConfig(EXTI_TypeDef *EXTIx, uint8_t EXTI_CR_x, EXTI_Mode_TypeDef EXTI_Trigger);

/**
 * @brief 使能GPIO引脚的中断标志
 *
 * @param GPIOx GPIO模块指针
 * @param GPIO_PinSource GPIO引脚源
 */
void EXTI_EnableIRQFlag(EXTI_TypeDef *EXTIx, uint32_t EXTI_IF_x);

/**
 * @brief 失能GPIO引脚的中断标志
 *
 * @param GPIOx GPIO模块指针
 * @param GPIO_PinSource GPIO引脚源
 */
void EXTI_DisableIRQFlag(EXTI_TypeDef *EXTIx, uint32_t EXTI_IF_x);

/**
 * @brief 清除GPIO引脚的中断标志
 *
 * @param GPIOx GPIO模块指针
 * @param GPIO_PinSource GPIO引脚源
 */
void EXTI_ClearIRQFlag(EXTI_TypeDef *EXTIx, uint32_t EXTI_IF_x);

/**
 * @brief 获取GPIO引脚的中断标志状态
 *
 * @param GPIOx GPIO模块指针
 * @param GPIO_PinSource GPIO引脚源
 * @return 中断标志状态
 * @retval 0 无中断
 * @retval 1 有中断
 */
uint8_t EXTI_GetIRQFlag(EXTI_TypeDef *EXTIx, uint32_t EXTI_IF_x);

/**
 * @brief 输出时钟选择
 *
 * @param EXTIx EXTI模块指针
 * @param EXTI_CLKO_x 输出的时钟信号
 */
void EXTI_SetClko(EXTI_TypeDef *EXTIx, uint32_t EXTI_CLKO_x);
#endif
