#ifndef __LKS32MC09X_SYS_H__
#define __LKS32MC09X_SYS_H__

#include "lks32mc09x_reg.h"

// 定义各个模块标志
#define SYS_MODULE_EEPROM BIT26 // EEPROM模块
#define SYS_MODULE_ADC1   BIT23 // ADC1模块
#define SYS_MODULE_ADC0   BIT22 // ADC0模块
#define SYS_MODULE_CL0    BIT21 // CL0模块
#define SYS_MODULE_SIF0   BIT20 // SIF0模块
#define SYS_MODULE_DMA0   BIT18 // DMA0模块
#define SYS_MODULE_DSP0   BIT17 // DSP0模块
#define SYS_MODULE_CRC0   BIT16 // CRC0模块
#define SYS_MODULE_UART2  BIT14 // UART2模块
#define SYS_MODULE_UART1  BIT13 // UART1模块
#define SYS_MODULE_UART0  BIT12 // UART0模块
#define SYS_MODULE_GPIO   BIT11 // GPIO模块
#define SYS_MODULE_MCPWM0 BIT10 // MCPWM0模块
#define SYS_MODULE_QEP0   BIT8  // QEP0模块
#define SYS_MODULE_TIMER2 BIT6  // TIMER2模块
#define SYS_MODULE_TIMER1 BIT5  // TIMER1模块
#define SYS_MODULE_TIMER0 BIT4  // TIMER0模块
#define SYS_MODULE_HALL0  BIT3  // HALL0模块
#define SYS_MODULE_CMP    BIT2  // CMP模块
#define SYS_MODULE_I2C0   BIT1  // I2C0模块
#define SYS_MODULE_SPI0   BIT0  // SPI0模块

#define SYS_MCLK_RC_96M   0x1ff // 96MHz RC时钟 默认值，芯片上电后默认状态
#define SYS_MCLK_RC_48M   0x155 // 48MHz RC时钟
#define SYS_MCLK_RC_24M   0x111 // 24MHz RC时钟
#define SYS_MCLK_RC_12M   0x101 // 12MHz RC时钟
#define SYS_MCLK_RC_8M    0x000 // 8MHz RC时钟
// 这里的0x8000用来区分RC和XTAL
#define SYS_MCLK_XTAL_96M 0x81ff // 96MHz 外部晶体时钟
#define SYS_MCLK_XTAL_48M 0x8155 // 48MHz 外部晶体时钟
#define SYS_MCLK_XTAL_24M 0x8111 // 24MHz 外部晶体时钟
#define SYS_MCLK_XTAL_12M 0x8101 // 12MHz 外部晶体时钟

#define SYS_PVDSEL_4_0V   0             // 4_0V
#define SYS_PVDSEL_3_74V  BIT13         // 3_75V
#define SYS_PVDSEL_3_49V  BIT14         // 3_5V
#define SYS_PVDSEL_2_8V   BIT13 | BIT14 // 2_8V
#define SYS_PVDSEL_DAC    BIT12         // DAC
#define SYS_PVDSEL_OFF    BIT11         // OFF
// 兼容旧版本
#define SYS_PVDSEL_3_75V SYS_PVDSEL_3_74V
#define SYS_PVDSEL_3_5V  SYS_PVDSEL_3_49V
/**
 * @brief 数字模块时钟使能
 * @param nModule 模块编号
 * @param state 使能或禁用状态
 */
void SYS_ModuleClockCmd(uint32_t SYS_MODULE_x, uint8_t state);

/**
 * @brief 软复位模块
 * @param nModule 模块编号
 */
void SYS_SoftResetModule(uint32_t nModule);

/**
 * @brief 软复位所有模块
 */
void SYS_SoftReset_all(void);

/**
 * @brief 选择系统时钟
 * @param SYS_MCLK_x 时钟源选择
 */
void SYS_MclkChoice(uint32_t SYS_MCLK_x);

/**
 * @brief UART时钟分频
 * @param div 分频系数
 */
void SYS_UartClkDiv(uint16_t div);

/**
 * @brief I2C时钟分频
 * @param div 分频系数
 */
void SYS_I2CClkDiv(uint16_t div);

/**
 * @brief SPI时钟分频
 * @param div 分频系数
 */
void SYS_SPIClkDiv(uint16_t div);

/**
 * @brief 获取当前MCU时钟
 * @return 当前MCU时钟频率
 */
uint32_t SYS_ReadMcuClk(void);

/**
 * @brief 掉电检测配置
 * @param SYS_PVDSEL_x 掉电检测配置值，可选：
 * - SYS_PVDSEL_4_0V    4.0V检测阈值
 * - SYS_PVDSEL_3_74V   3.74V检测阈值
 * - SYS_PVDSEL_3_49V   3.49V检测阈值
 * - SYS_PVDSEL_2_8V    2.8V检测阈值
 * - SYS_PVDSEL_DAC     DAC (这里使用的是DAC0)
 * - SYS_PVDSEL_OFF     OFF
 */
void SYS_SetPowerFailureDetection(uint32_t SYS_PVDSEL_x);
/**
 * @brief 等待电源就绪
 * @param SYS_PVDSEL_x 电源电压检测阈值配置，可选：
 * - SYS_PVDSEL_4_0V    4.0V检测阈值
 * - SYS_PVDSEL_3_74V   3.74V检测阈值
 * - SYS_PVDSEL_3_49V   3.49V检测阈值
 * - SYS_PVDSEL_2_8V    2.8V检测阈值
 * 注意：SYS_PVDSEL_DAC暂不支持
 * @note 使用前确保已配置PWRDN中断（如需要）
 * @code
void SystemInit()
{
    SYS_WaitPowerReady(SYS_PVDSEL_4_0V); // 等待电源就绪
    NVIC_SetPriority(PWRDN_IRQn, 0);     // 掉电检测中断优先级配置
    NVIC_EnableIRQ(PWRDN_IRQn);          // 使能掉电检测中断
    // 其他初始化代码
}
void PWRDN_IRQHandler(void) {
    __disable_irq();
    SYS_ResetPeripheral();
    NVIC_SystemReset();
}
 * @endcode
 */
void SYS_WaitPowerReady(uint32_t SYS_PVDSEL_x);
/**
 * @brief 复位所有外设到默认状态（芯片上电后的状态）
 * @warning 不复位的寄存器有：
 *              复位事件记录寄存器
 *              后备存储器
 *              ram
 *              校准寄存器（仅限于上电会自动加载的校准寄存器）
 *              所有内核的寄存器
 */
void SYS_ResetPeripheral(void);
/**
 * @brief 复位所有内部外设为默认值(除io的所有模块)
 * @warning 不复位的寄存器有：
 *              复位事件记录寄存器
 *              后备存储器
 *              ram
 *              校准寄存器（仅限于上电会自动加载的校准寄存器）
 *              所有内核的寄存器
 */
void SYS_ResetPeripheralInternal(void);
/**
 * @brief 复位所有IO为默认值（gpio以及部分和io有关的sys寄存器）
 */
void SYS_ResetIO(void);
#endif // __LKS32MC09X_SYS_H__
