#ifndef __HAL_LKSMCU_IRQ_H__
#define __HAL_LKSMCU_IRQ_H__
#include "stdint.h"

typedef enum
{
    HAL_IRQ_0,
} HAL_IRQ_x;

/**
 * @brief 各个模块的中断编号
 * @ref 如果调用不存在中断的模块，则不做任何操作
 */
typedef enum
{
    // 来自arm内核的模块
    HAL_IRQ_MODULE_NonMaskableInt,
    HAL_IRQ_MODULE_HardFault,
    HAL_IRQ_MODULE_SVCall,
    HAL_IRQ_MODULE_PendSV,
    HAL_IRQ_MODULE_SysTick,
    // 芯片外设
    HAL_IRQ_MODULE_ADC,
    HAL_IRQ_MODULE_CAN,
    HAL_IRQ_MODULE_CLK,
    HAL_IRQ_MODULE_CMP,
    HAL_IRQ_MODULE_CRC,
    HAL_IRQ_MODULE_DAC,
    HAL_IRQ_MODULE_DMA,
    HAL_IRQ_MODULE_DSP,
    HAL_IRQ_MODULE_FLASH,
    HAL_IRQ_MODULE_GPIO,
    HAL_IRQ_MODULE_HALL,
    HAL_IRQ_MODULE_I2C,
    HAL_IRQ_MODULE_INIT,
    HAL_IRQ_MODULE_IWDG,
    HAL_IRQ_MODULE_MCPWM,
    HAL_IRQ_MODULE_OPA,
    HAL_IRQ_MODULE_QEP,
    HAL_IRQ_MODULE_REG,
    HAL_IRQ_MODULE_RESET,
    HAL_IRQ_MODULE_SPI,
    HAL_IRQ_MODULE_TIMER,
    HAL_IRQ_MODULE_TMP,
    HAL_IRQ_MODULE_TRIM,
    HAL_IRQ_MODULE_UART,
    HAL_IRQ_MODULE_WEAK,
} HAL_IRQ_MODULE_x;

void HAL_IRQ_Reset(HAL_IRQ_x);   // 重置中断(等效于关闭中断)
void HAL_IRQ_Enable(HAL_IRQ_x);  // 使能全局中断
void HAL_IRQ_Disable(HAL_IRQ_x); // 关闭全局中断

void HAL_IRQ_EnableModule(HAL_IRQ_x, HAL_IRQ_MODULE_x, uint8_t number, uint8_t priority); // 使能某个模块的中断
void HAL_IRQ_DisableModule(HAL_IRQ_x, HAL_IRQ_MODULE_x, uint8_t number);                  // 关闭某个模块的中断
void HAL_IRQ_SetPriority(HAL_IRQ_x, HAL_IRQ_MODULE_x, uint8_t number, uint8_t priority);  // 设置某个模块的中断优先级

/**
 * @brief 统一的中断函数，写法如下
 * @ref
 * void HAL_IRQ_Interrupt(HAL_IRQ_MODULE_ADC,0)
 * 会被宏转换为 HAL_ADC_Interrupt0()
 * 在lks32mc03上等效于 ADC_IRQHandler()函数
 */
#define HAL_IRQ_Interrupt(HAL_IRQ_MODULE_x, x) HAL_##HAL_IRQ_MODULE_x##_Interrupt##x(void)
#endif
