/**
 * @brief TIMER-1mS定时器
 * @details
 * 1. 初始化timer0，设置timer时钟为2分频（主频96M，分频后48M），周期为1ms
 * 2. 在timer中断里翻转P0.0
 * 3. 不配置timer分频的情况下，最大计数时间为0.682mS，大于该时间后需要设置时钟分频
 */
#include "lks32mc09x_gpio.h"
#include "lks32mc09x_sys.h"
#include "lks32mc09x_timer.h"
#include "lks32mc09x_user_manual.h"

void Timer0_IRQHandler(void);

int main(void)
{
    GPIO_Config(GPIO0, GPIO_PinSource_0, GPIO_Mode_OUT, GPIO_AF_GPIO);

    // 初始化TIMER0
    TIMER_TimerInitTypeDef TIMER_InitStruct;
    TIMER_StructInit(&TIMER_InitStruct);

    // 配置TIMER0为比较模式，输出PWM
    TIMER_InitStruct.EN = ENABLE;                      ///< 定时器使能，ENABLE使能，DISABLE失能，影响timer的cnt是否计数
    TIMER_InitStruct.CAP1_CLR_EN = 0;                  ///< 当发生CAP1捕获事件时，清零 Timer 计数器，高有效
    TIMER_InitStruct.CAP0_CLR_EN = 0;                  ///< 当发生CAP0捕获事件时，清零 Timer 计数器，高有效
    TIMER_InitStruct.ONE_TRIG = 0;                     ///< 单次发送模式，此位需要在Timer比较模式下使用，且对应定时器使能需设置为0
    TIMER_InitStruct.CENTER = 0;                       ///< 中心计数模式使能,0:Timer向上从0计数至TH，然后回0，或Timer向下从TH计数至0，然后回到TH，1:Timer向上从0计数至TH，然后向下计数至0
    TIMER_InitStruct.DIR = 0;                          ///< 0:0->TH 递增计数，1：TH->递减计数
    TIMER_InitStruct.ClockDiv = 1;                     ///< Timer计数器频率配置,0:1分频,1:2分频,2:4分频,3:8分频,4:16分频,5:32分频,6:64分频,7:128分频
    TIMER_InitStruct.ETON = 0;                         ///< Timer计数器计数外部启动使能,0: 自动运行,1:外部事件触发计数
    TIMER_InitStruct.GATE_EN = 0;                      ///< Timer暂停使能，0：不暂停 1:当外部信号为低时，Timer暂停计数，外部信号根据TIMER1_EVT.EVT_SRC 进行选择
    TIMER_InitStruct.RL_EN = 0;                        ///< Timer重装使能,0：禁用外部事件重装，1：使能外部事件重装
    TIMER_InitStruct.XCLK_EN = 0;                      ///< Timer时钟源,0: 芯片内部时钟,1:外部时钟
    TIMER_InitStruct.SRC1 = 0;                         ///< Timer 捕获模式通道1信号来源,0:Timer通道0输入信号,1:Timer通道1输入信号,2:CLU0输出信号,3:CLU1输出信号,4:CLU2输出信号,5:CLU3输出信号,6:比较器0输出信号,7:比较器1输出信号,8:比较器2输出信号,9:Timer通道0和1的异或信号
    TIMER_InitStruct.CH1Output = 0;                    ///< Timer 通道1在比较模式下的输出极性控制，当计数器 CNT<CMP1时的输出值，0：低电平，1：高电平
    TIMER_InitStruct.CH1_WorkMode = 0;                 ///< Timer 通道1的工作模式选择,0: 比较模式 ,1: 捕获模式
    TIMER_InitStruct.CH1_FE_CAP_EN = 0;                ///< Timer通道1下降沿捕获事件使能,1:使能,0:关闭
    TIMER_InitStruct.CH1_RE_CAP_EN = 0;                ///< Timer通道1上升沿捕获事件使能,1:使能,0:关闭
    TIMER_InitStruct.SRC0 = 0;                         ///< Timer 捕获模式通道0信号来源
    TIMER_InitStruct.CH0Output = 0;                    ///< Timer 通道0在比较模式下的输出极性控制，当计数器 CNT<CMP1时的输出值，0：低电平，1：高电平
    TIMER_InitStruct.CH0_WorkMode = 0;                 ///< Timer 通道0的工作模式选择,0: 比较模式 ,1: 捕获模式
    TIMER_InitStruct.CH0_FE_CAP_EN = 0;                ///< Timer通道0下升沿捕获事件使能,1:使能,0:关闭
    TIMER_InitStruct.CH0_RE_CAP_EN = 0;                ///< Timer通道0上升沿捕获事件使能,1:使能,0:关闭
    TIMER_InitStruct.TH = SYS_ReadMcuClk() / 2 / 1000; ///< Timer计数器计数门限
    TIMER_InitStruct.CNT = 0;                          ///< Timer计数器当前计数值
    TIMER_InitStruct.CHN0 = 0;                         ///< 通道0比较捕获寄存器
    TIMER_InitStruct.CHN1 = 0;                         ///< 通道1比较捕获寄存器
    TIMER_InitStruct.EVT = 0;                          ///< Timer外部事件选择
    TIMER_InitStruct.FLT = 0;                          ///< 通道0/1信号滤波宽度选择。取值范围0~255,滤波公式=Timer_FLT*8*定时器时钟
    TIMER_InitStruct.IE = TIMER0_IE_ZC_IE_BIT;         ///< 中断使能
    TIMER_InitStruct.CMP0_TRIGGER_MODE = 0;            ///< 0：通道0比较事件在CNT递增或递减均产生adc触发信号，1递增时触发，2递减时触发
    TIMER_InitStruct.CMP1_TRIGGER_MODE = 0;            ///< 0：通道1比较事件在CNT递增或递减均产生adc触发信号，1递增时触发，2递减时触发
    TIMER_InitStruct.SHADOW = 0;                       ///< 0：软件写入TH/CMP0/CMP1 时直接更新对应的影子寄存器，1：启用影子寄存器，软件写入 TH/CMP0/CMP1 时进仅仅更新预装载值，当Timer发生过零事件时才将预装载值写入影子寄存器
    TIMER_InitStruct.CH1_DEFAULT = 0;                  ///< 定时器0发生Fail事件MOE清零后，CH1通道输出值
    TIMER_InitStruct.CH0_DEFAULT = 0;                  ///< 定时器0发生Fail事件MOE清零后，CH0通道输出值
    TIMER_InitStruct.HALT_PRT = 0;                     ///< MCU 进入HALT状态，Timer输出值选择。1:正常输出；0:输出 CH1_DEFAULT 和 CH0_DEFAULT。
    TIMER_InitStruct.FAIL_SEL = 0;                     ///< FAIL信号选择，0：TIMER0_FAIL，来自GPIO，1：CLU0输出
    TIMER_InitStruct.FAIL_POL = 0;                     ///< FAIL信号极性,0：高电平FAIL,1：低电平FAIL
    TIMER_InitStruct.FAIL_EN = 0;                      ///< FAIL 信号使能,0：禁用 FAIL,1：使能 FAIL
    TIMER_InitStruct.MOE = 0;                          ///< TIMER 通道 0/1 输出使能 1:输出正常信号 0:输出 CH0_DEFAULT 和 CH1_DEFAULT 默认值

    TIMER_Init(TIMER0, &TIMER_InitStruct);
    NVIC_EnableIRQ(TIMER0_IRQn);
    NVIC_SetPriority(TIMER0_IRQn, 1);
    __enable_irq();
    while (1)
    {
    }
}
void TIMER0_IRQHandler()
{
    TIMER_ClearIRQFlag(TIMER0, TIMER0_IE_ZC_IE_BIT);
    GPIO_ToggleBits(GPIO0, GPIO_Pin_0);
}
