/**
    @copyright None
    @file      DRIVER.c
    @author    Comment Vivre
    @date      2025-11-03
    @brief     None
*/
#include <MyProject.h>


/**
    @function     Driver_Init
    @brief        驱动初始化
    @date         2025-11-01
*/
void Driver_Init(void)
{
    DRV_ARR = PWM_VALUE_LOAD ;      // 载波频率的周期值
    DRV_DTR = PWM_LOAD_DEADTIME;    // 死区时间
    DRV_DR  = 0;
    DRV_CMR = 0x0A800;              //UH/VH/WH UL/VL/WL 互补
    DRV_OUT = 0x00;                //空闲电平，默认高电平有效
    // 驱动电平配置
    #if (PWM_LEVEL_MODE == HIGH_LEVEL)
    ClrBit(PI_CR, HINV | LINV);
    #elif (PWM_LEVEL_MODE == LOW_LEVEL)
    SetBit(PI_CR, HINV | LINV);
    #elif (PWM_LEVEL_MODE == UP_H_DOWN_L)
    SetReg(PI_CR, HINV | LINV, LINV);
    #elif (PWM_LEVEL_MODE == UP_L_DOWN_H)
    SetReg(PI_CR, HINV | LINV, HINV);
    #endif
    ClrBit(DRV_SR, FGIE);   //FG中断使能
    // 清中断标志位，使能中断，配置比较值，设置中断优先级
    ClrBit(DRV_SR, DCIF);
    /**************************************************
        DRV比较匹配中断模式
        当计数值等于DRV_COMR时，根据DCIM的设置判断是否产生中断标记
        00：不产生中断        01：上升方向
        10：下降方向         11：上升/下降方向
    *************************************************/
    SetReg(DRV_SR, DCIM0 | DCIM1, DCIM1);
    // 设置DRV计数器的比较匹配值，当DRV计数值与COMR相等时，根据DRV_SR寄存器的DCIM是否产生比较匹配事件
    DRV_COMR = (PWM_VALUE_LOAD >> 3);
    // 优先级配置为最高
    SetBit(IP0, PDRV1 | PDRV0);
    ClrBit(DRV_SR, DCIP);
    ClrBit(DRV_CR, FOCEN);
    // MESEL为0，ME模块工作在BLDC模式
    // MESEL为1，ME模块工作在FOC/SVPWM/SPWM模式
    SetBit(DRV_CR, MESEL);
    SetBit(DRV_CR, DRVEN);  //计数器使能
    ClrBit(DRV_CR, DRPE);   //计数器比较值预装载使能
    SetBit(DRV_CR, DRVOE);  //Driver输出使能
}

