/**
 * @brief MCPWM-不同的IO状态配置
 * @details
 * 1.配置MCPWM模块以输出三路中心对称的PWM信号，TH设置为2000，实际周期为2*TH+1 => 4000。
 * 2.配置GPIO引脚复用为MCPWM功能。
 * 3.在主循环中，通过MCPWM_SetIOConfig()函数，设置MCPWM输出的IO状态，默认MCPWM_IO_HL_PWM。
 */
#include "lks32mc09x_gpio.h"
#include "lks32mc09x_mcpwm.h"
#include "lks32mc09x_user_manual.h"
volatile uint32_t setio = MCPWM_IO_HL_PWM;

/**
 * @brief 配置MCPWM输出三路中心对称的PWM，频率20kHz。
 */
void MCPWM_Config(void)
{
    MCPWM_InitTypeDef MCPWM_InitStruct;

    // 初始化MCPWM结构体
    MCPWM_StructInit(&MCPWM_InitStruct);

    // 配置MCPWM基本项
    MCPWM_InitStruct.EN = 1;                    // 使能MCPWM模块
    MCPWM_InitStruct.CLK_DIV = MCPWM_CLK_DIV_1; // 时钟1分频
    MCPWM_InitStruct.TH = 2000;                 // 计数器门限值
    MCPWM_InitStruct.TR = MCPWM_TR_T0;          // 计数器溢出时刻触发自动更新

    // 配置死区时间
    MCPWM_InitStruct.DTHP = 200; // 上管死区时间
    MCPWM_InitStruct.DTHN = 200; // 下管死区时间

    // 配置IO输出
    MCPWM_InitStruct.IO0 = MCPWM_IO_HL_PWM;  // CH0: 上管高有效，下管低有效，正常输出PWM
    MCPWM_InitStruct.IO1 = MCPWM_IO_HL_PWM;  // CH1: 上管高有效，下管低有效，正常输出PWM
    MCPWM_InitStruct.IO2 = MCPWM_IO_HL_PWM;  // CH2: 上管高有效，下管低有效，正常输出PWM
    MCPWM_InitStruct.IO3 = MCPWM_IO_DISABLE; // CH3: 不使用
    MCPWM_InitStruct.FAIL_IO = MCPWM_FAIL_IO_OFF;

    // 配置自动更新使能
    MCPWM_InitStruct.AUEN = MCPWM_AUEN_DEFAULT; // 使能TH0自动加载

    // 配置中断和DMA（本例程中不使用中断和DMA）
    MCPWM_InitStruct.IE = 0;
    MCPWM_InitStruct.EIE = 0;
    MCPWM_InitStruct.RE = 0;

    // 初始化MCPWM模块
    MCPWM_Init(MCPWM0, &MCPWM_InitStruct);

    // 设置输出状态
    MCPWM_SetOutputState(MCPWM0, 1);

    MCPWM_SetOutputVal(MCPWM0, 0, -500, 500); // CH0: 中心对齐，占空比50%
    MCPWM_SetOutputVal(MCPWM0, 1, -500, 500); // CH1: 中心对齐，占空比50%
    MCPWM_SetOutputVal(MCPWM0, 2, -500, 500); // CH2: 中心对齐，占空比50%

    // 开始计数
    MCPWM_StartCount(MCPWM0);
}
/**
 * @brief 主函数
 */
int main(void)
{
    // 配置GPIO引脚复用为MCPWM功能
    GPIO_InitTypeDef GPIO_InitStruct;
    GPIO_StructInit(&GPIO_InitStruct);

    // 配置P1.4到P1.9为MCPWM功能
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
    GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_Init(GPIO1, &GPIO_InitStruct);

    // 配置引脚复用功能为MCPWM
    GPIO_PinAFConfig(GPIO1, GPIO_PinSource_4, GPIO_AF_MCPWM);
    GPIO_PinAFConfig(GPIO1, GPIO_PinSource_5, GPIO_AF_MCPWM);
    GPIO_PinAFConfig(GPIO1, GPIO_PinSource_6, GPIO_AF_MCPWM);
    GPIO_PinAFConfig(GPIO1, GPIO_PinSource_7, GPIO_AF_MCPWM);
    GPIO_PinAFConfig(GPIO1, GPIO_PinSource_8, GPIO_AF_MCPWM);
    GPIO_PinAFConfig(GPIO1, GPIO_PinSource_9, GPIO_AF_MCPWM);

    // 配置MCPWM输出三路中心对称的PWM，频率20kHz
    MCPWM_Config();

    // 主循环
    while (1)
    {
        MCPWM_SetIOConfig(MCPWM0, setio, setio, setio, MCPWM_IO_DISABLE);
    }
}

