#include "lks32mc09x_exti.h"
static uint16_t exti_ie_flg = 0;
/**
 * @brief 复位EXTI模块
 *
 * @param EXTIx EXTI模块指针
 */
void EXTI_Reset(EXTI_TypeDef *EXTIx)
{
    // 复位EXTI模块寄存器
    EXTIx->CR0 = 0;
    EXTIx->CR1 = 0;
    EXTIx->IE  = 0;
    EXTIx->IF  = 0;
}

/**
 * @brief 配置GPIO引脚的中断触发模式
 *
 * @param GPIOx GPIO模块指针
 * @param GPIO_PinSource GPIO引脚源
 * @param EXTI_Trigger 触发模式
 */
void EXTI_TriggerConfig(EXTI_TypeDef *EXTIx, uint8_t EXTI_CR_x, EXTI_Mode_TypeDef EXTI_Trigger)
{
    // 根据GPIO引脚源和触发模式配置EXTI触发寄存器
    if (EXTI_CR_x < 8) // cr0
    {
        EXTIx->CR0 &= ~(0x03 << (EXTI_CR_x * 2));
        EXTIx->CR0 |= (EXTI_Trigger << (EXTI_CR_x * 2));
    }
    else // cr1
    {
        EXTIx->CR1 &= ~(0x03 << ((EXTI_CR_x - 8) * 2));
        EXTIx->CR1 |= (EXTI_Trigger << ((EXTI_CR_x - 8) * 2));
    }
}

/**
 * @brief 使能外部中断标志
 *
 * @param EXTIx EXTI模块指针
 * @param EXTI_IF_x 外部中断源
 */
void EXTI_EnableIRQFlag(EXTI_TypeDef *EXTIx, uint32_t EXTI_IF_x)
{
    exti_ie_flg |= EXTI_IF_x;
    if (exti_ie_flg & 0x7f)
    {
        EXTIx->IE |= BIT0;
    }
    else
    {
        EXTIx->IE &= ~BIT0;
    }
    if (exti_ie_flg & 0x80)
    {
        EXTIx->IE |= BIT1;
    }
    else
    {
        EXTIx->IE &= ~BIT1;
    }
    if (exti_ie_flg & 0xff00)
    {
        EXTIx->IE |= BIT2;
    }
    else
    {
        EXTIx->IE &= ~BIT2;
    }
}

/**
 * @brief 失能外部中断标志
 *
 * @param EXTIx EXTI模块指针
 * @param EXTI_IF_x 外部中断源
 */
void EXTI_DisableIRQFlag(EXTI_TypeDef *EXTIx, uint32_t EXTI_IF_x)
{
    exti_ie_flg &= ~EXTI_IF_x;
    if (exti_ie_flg & 0x3f)
    {
        EXTIx->IE |= BIT0;
    }
    else
    {
        EXTIx->IE &= ~BIT0;
    }
    if (exti_ie_flg & 0x80)
    {
        EXTIx->IE |= BIT1;
    }
    else
    {
        EXTIx->IE &= ~BIT1;
    }
    if (exti_ie_flg & 0xff00)
    {
        EXTIx->IE |= BIT2;
    }
    else
    {
        EXTIx->IE &= ~BIT2;
    }
}

/**
 * @brief 清除GPIO引脚的中断标志
 *
 * @param GPIOx GPIO模块指针
 * @param GPIO_PinSource GPIO引脚源
 */
void EXTI_ClearIRQFlag(EXTI_TypeDef *EXTIx, uint32_t EXTI_IF_x)
{
    // 清除对应GPIO引脚的中断标志
    EXTIx->IF = 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)
{
    // 获取对应GPIO引脚的中断标志状态
    return EXTIx->IF & EXTI_IF_x;
}
/**
 * @brief 输出时钟选择
 *
 * @param EXTIx EXTI模块指针
 * @param EXTI_CLKO_x 输出的时钟信号
 */
void EXTI_SetClko(EXTI_TypeDef *EXTIx, uint32_t EXTI_CLKO_x)
{
    EXTIx->CLKO = EXTI_CLKO_x;
}
