5 GD32E230G8 使用TIMER0 比较模式,初始化死机。

发布于 2021-04-08 15:49:12

在使用高级定时器timer0的时候,初始化就死机,问题就在使能中断这里,同样的代码,给timer2和timer16使用,都没有问题,但是timer0就是不行,不知道有没有遇到过,下面是我初始化的代码。
功能:初始化定时器,让它计数,记到设定值的时候就进中断。

void b_timer_config(uint16_t __pres, uint16_t __period, uint16_t __pulse)
{
    timer_parameter_struct timer_initpara;

    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_mode_config(TIMER0, TIMER_CH_3, TIMER_OC_MODE_TIMING);
    timer_channel_output_pulse_value_config(TIMER0, TIMER_CH_3, __pulse);
    nvic_irq_enable(TIMER0_Channel_IRQn, 1);
    timer_interrupt_enable(TIMER0, TIMER_INT_CH3);
    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_FLAG_CH3))
    {
        status++;
        switch (status % 3){
        case 0:
            printf("a\n");
            timer_channel_output_pulse_value_config(TIMER0, TIMER_CH_3, 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_3, 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_3, 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_FLAG_CH3);
    }
}

查看更多

关注者
0
被浏览
51
3 个回答
flashman2002
flashman2002 4 days ago

需要查询芯片手册。

mii
mii 4 days ago

可能是因为是高级定时器的原因吧,会有比较多的选项要注意。你还是要仔细看看芯片手册,或者跑一下官方例程。看看怎么个用法。

风来吴山
风来吴山 3 days ago

MDK:clean targets解决了。

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友

手机
浏览

扫码手机浏览