问答

汇集网友智慧,解决技术难题

21ic问答首页 - GD32E230使用高级定时器的比较输出

定时器 GD32E230 TI timer ni TE

GD32E230使用高级定时器的比较输出 赏100家园币

风来吴山2021-04-08
初始化的时候就死机了,不知道怎么使用高级定时器的比较输出模式
void b_timer_config(uint16_t __pres, uint16_t __period, uint16_t __pulse)
{
    // timer_oc_parameter_struct timer_ocinitpara;
    timer_parameter_struct timer_initpara;
    timer_break_parameter_struct timer_breakpara;

    rcu_periph_clock_enable(RCU_TIMER0);
    timer_deinit(TIMER0);

    timer_struct_para_init(&timer_initpara);
    timer_initpara.prescaler         = __pres;
    timer_initpara.alignedmode       = TIMER_COUNTER_EDGE;
    timer_initpara.counterdirection  = TIMER_COUNTER_UP;
    timer_initpara.period            = __period;                // 10KHz
    timer_initpara.clockdivision     = TIMER_CKDIV_DIV1;
    timer_initpara.repetitioncounter = 0;
    timer_init(TIMER0, &timer_initpara);

    // timer_channel_output_struct_para_init(&timer_ocinitpara);
    // timer_ocinitpara.outputstate  = TIMER_CCX_ENABLE;
    // timer_ocinitpara.outputnstate = TIMER_CCXN_DISABLE;
    // timer_ocinitpara.ocpolarity   = TIMER_OC_POLARITY_HIGH;
    // timer_ocinitpara.ocnpolarity  = TIMER_OCN_POLARITY_HIGH;
    // timer_ocinitpara.ocidlestate  = TIMER_OC_IDLE_STATE_LOW;
    // timer_ocinitpara.ocnidlestate = TIMER_OCN_IDLE_STATE_LOW;
    // timer_channel_output_config(TIMER0, TIMER_CH_0, &timer_ocinitpara);

    timer_break_struct_para_init(&timer_breakpara);
    timer_breakpara.runoffstate      = TIMER_ROS_STATE_ENABLE;
    timer_breakpara.ideloffstate     = TIMER_IOS_STATE_ENABLE;
    timer_breakpara.deadtime         = 164;
    timer_breakpara.breakpolarity    = TIMER_BREAK_POLARITY_LOW;
    timer_breakpara.outputautostate  = TIMER_OUTAUTO_ENABLE;
    timer_breakpara.protectmode      = TIMER_CCHP_PROT_OFF;
    timer_breakpara.breakstate       = TIMER_BREAK_ENABLE;
    timer_break_config(TIMER0, &timer_breakpara);

    timer_channel_output_pulse_value_config(TIMER0, TIMER_CH_0, __pulse);
    timer_channel_output_mode_config(TIMER0, TIMER_CH_0, TIMER_OC_MODE_PWM0);
    // timer_channel_output_shadow_config(TIMER0, TIMER_CH_0, TIMER_OC_SHADOW_DISABLE);
    // timer_primary_output_config(TIMER0, ENABLE);
    nvic_irq_enable(TIMER0_Channel_IRQn, 1);
    timer_interrupt_enable(TIMER0, TIMER_INT_CH0);
    timer_interrupt_disable(TIMER0, TIMER_INT_BRK);
    timer_auto_reload_shadow_enable(TIMER0);
    timer_enable(TIMER0);
}

void TIMER0_IRQHandler(void)
{
    static uint8_t status = 0;
    if (SET == timer_interrupt_flag_get(TIMER0, TIMER_INT_CH0))
    {
        status++;
        switch (status % 3){
        case 0:
            printf("a\n");
            timer_channel_output_pulse_value_config(TIMER0, TIMER_CH_0, tim[B.idle);
            timer_channel_output_pulse_value_config(TIMER15, TIMER_CH_0, 0);
            break;
        case 1:
            printf("b\n");
            timer_channel_output_pulse_value_config(TIMER0, TIMER_CH_0, tim[B.t_off);
            timer_channel_output_pulse_value_config(TIMER15, TIMER_CH_0, 0);
            break;
        case 2:
            printf("c\n");
            timer_channel_output_pulse_value_config(TIMER0, TIMER_CH_0, tim[B.t_on);
            timer_channel_output_pulse_value_config(TIMER15, TIMER_CH_0, pwm_ch[B.pulse);
            break;
        default:
            break;
        }
        timer_interrupt_flag_clear(TIMER0, TIMER_INT_CH0);
    }
}

回答 +关注 9
16235人浏览 10人回答问题 分享 举报
10 个回答
12下一页

您需要登录后才可以回复 登录 | 注册