AB1601LED之pwm

来源:互联网 发布:雅米网络兼职骗过的 编辑:程序博客网 时间:2024/06/05 09:17

直接上代码:

void DRV_Led_Set(led_ins led_idx, drv_led_setting *setting)
{
    uint8_t unit_ms, unit_xn;
    uint32_t unit_val;
    
volatile LED_SETTING_t   ledMiscSet;
volatile LED_T0T1T2T3_t  ledTimeStep;
    volatile LED_PWM_SETTING_t ledPwm;


    unit_ms = setting->unit_ms > 64 ? 64 : setting->unit_ms;


    unit_val = unit_ms * 32;


    if(unit_val >= 0x800)
        unit_val = 0x7ff;


    unit_xn = 0;
    while(unit_val > 255)
    {
        unit_val >>= 1;
        unit_xn ++;
    }


    ledMiscSet.reg = 0;
    ledTimeStep.reg = 0;
    ledPwm.reg = 0;
    
    ledMiscSet.field.LED_unit = unit_val;
    ledMiscSet.field.LED_XN = unit_xn; 
    ledMiscSet.field.LED_PWM_DU_SET = 0xF; //100%
    ledMiscSet.field.LED_T1T2rep = setting->t1t2_repeat_cnt;
    ledMiscSet.field.LED_REPEAT = setting->nostop;   
    ledMiscSet.field.LED_FWsel = setting->follow_idx;    
    ledMiscSet.field.LED_FW_T1T2 = 0; //when t1 finish 
    ledMiscSet.field.LED_FW_RETRIG = 0; //until done
    ledMiscSet.field.LED_INV = setting->inverse; //inv






    //ledMiscSet.field.LED_CLK_SW = 0; //32k
    ledMiscSet.field.LED_CLK_SW = 1; //others 选择时钟沿




    ledTimeStep.field.LED_T0 = setting->t0_cnt;
    ledTimeStep.field.LED_T1 = setting->t1_cnt;
    ledTimeStep.field.LED_T2 = setting->t2_cnt;
    ledTimeStep.field.LED_T3 = setting->t3_cnt;


    if(setting->pwm_en)
    {
        uint32_t onstep;
        uint32_t offstep;


        onstep = ((1 << unit_xn) * setting->t1_cnt * unit_val)/(16*64);
        offstep = ((1 << unit_xn) * setting->t2_cnt * unit_val)/(16*64);
        
        ledPwm.field.LED_PWM_ON = onstep > 256 ? 256 : onstep; 
        ledPwm.field.LED_PWM_OFF = offstep > 256 ? 256 : offstep;
    }




    if(led_idx == led0)
    {
        LED.MiscSet1.reg                  = ledMiscSet.reg;
        LED.TimeStep1.reg                 = ledTimeStep.reg;
        LED.PWMSetting1.reg               = ledPwm.reg;
    }
    else
    {


        LED.MiscSet2.reg                  = ledMiscSet.reg;
        LED.TimeStep2.reg                 = ledTimeStep.reg;
        LED.PWMSetting2.reg               = ledPwm.reg;
    }
}


DRV_OdPinMux_SigSet((1 << 2), PIN_OD_LED0);//设置功能脚

AB_LED_set_blink(ab_led0, 4, 0, 0);//设置频率


注意频率范围!