搜索

GD32E230使用高级定时器的比较输出

[复制链接]
773|8
 楼主 | 2021-4-8 10:18 | 显示全部楼层 |阅读模式
初始化的时候就死机了,不知道怎么使用高级定时器的比较输出模式
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);
    }
}

使用特权

评论回复
 楼主 | 2021-4-8 17:01 | 显示全部楼层
本帖最后由 风来吴山 于 2021-4-8 17:02 编辑
  1. 看了芯片手册,把通道换到CH3也不行。
复制代码
  1. void b_timer_config(uint16_t __pres, uint16_t __period, uint16_t __pulse)
  2. {
  3.     timer_parameter_struct timer_initpara;
  4.     // timer_oc_parameter_struct timer_ocinitpara;
  5.     // timer_break_parameter_struct timer_breakpara;

  6.     rcu_periph_clock_enable(RCU_TIMER0);
  7.     timer_deinit(TIMER0);

  8.     timer_struct_para_init(&timer_initpara);
  9.     timer_initpara.prescaler         = __pres;
  10.     timer_initpara.alignedmode       = TIMER_COUNTER_EDGE;
  11.     timer_initpara.counterdirection  = TIMER_COUNTER_UP;
  12.     timer_initpara.period            = __period;                // 10KHz
  13.     timer_initpara.clockdivision     = TIMER_CKDIV_DIV1;
  14.     timer_initpara.repetitioncounter = 0;
  15.     timer_init(TIMER0, &timer_initpara);

  16.     // timer_channel_output_struct_para_init(&timer_ocinitpara);
  17.     // timer_ocinitpara.outputstate  = TIMER_CCX_DISABLE;
  18.     // timer_ocinitpara.outputnstate = TIMER_CCXN_DISABLE;
  19.     // timer_ocinitpara.ocpolarity   = TIMER_OC_POLARITY_HIGH;
  20.     // timer_ocinitpara.ocnpolarity  = TIMER_OCN_POLARITY_HIGH;
  21.     // timer_ocinitpara.ocidlestate  = TIMER_OC_IDLE_STATE_LOW;
  22.     // timer_ocinitpara.ocnidlestate = TIMER_OCN_IDLE_STATE_LOW;
  23.     // timer_channel_output_config(TIMER14, TIMER_CH_0, &timer_ocinitpara);

  24.     // timer_break_struct_para_init(&timer_breakpara);
  25.     // timer_breakpara.runoffstate      = TIMER_ROS_STATE_ENABLE;
  26.     // timer_breakpara.ideloffstate     = TIMER_IOS_STATE_ENABLE;
  27.     // timer_breakpara.deadtime         = 164;
  28.     // timer_breakpara.breakpolarity    = TIMER_BREAK_POLARITY_LOW;
  29.     // timer_breakpara.outputautostate  = TIMER_OUTAUTO_ENABLE;
  30.     // timer_breakpara.protectmode      = TIMER_CCHP_PROT_OFF;
  31.     // timer_breakpara.breakstate       = TIMER_BREAK_ENABLE;
  32.     // timer_break_config(TIMER0, &timer_breakpara);

  33.     // timer_channel_output_shadow_config(TIMER0, TIMER_CH_3, TIMER_OC_SHADOW_ENABLE);
  34.     timer_channel_output_mode_config(TIMER0, TIMER_CH_3, TIMER_OC_MODE_TIMING);
  35.     timer_channel_output_pulse_value_config(TIMER0, TIMER_CH_3, __pulse);
  36.     nvic_irq_enable(TIMER0_Channel_IRQn, 1);
  37.     timer_interrupt_enable(TIMER0, TIMER_INT_CH3);
  38.     timer_auto_reload_shadow_enable(TIMER0);
  39.     timer_enable(TIMER0);
  40. }

  41. void TIMER0_IRQHandler(void)
  42. {
  43.     static uint8_t status = 0;
  44.     if (SET == timer_interrupt_flag_get(TIMER0, TIMER_INT_FLAG_CH3))
  45.     {
  46.         status++;
  47.         switch (status % 3){
  48.         case 0:
  49.             printf("a\n");
  50.             timer_channel_output_pulse_value_config(TIMER0, TIMER_CH_3, tim[B].idle);
  51.             timer_channel_output_pulse_value_config(TIMER15, TIMER_CH_0, 0);
  52.             break;
  53.         case 1:
  54.             printf("b\n");
  55.             timer_channel_output_pulse_value_config(TIMER0, TIMER_CH_3, tim[B].t_off);
  56.             timer_channel_output_pulse_value_config(TIMER15, TIMER_CH_0, 0);
  57.             break;
  58.         case 2:
  59.             printf("c\n");
  60.             timer_channel_output_pulse_value_config(TIMER0, TIMER_CH_3, tim[B].t_on);
  61.             timer_channel_output_pulse_value_config(TIMER15, TIMER_CH_0, pwm_ch[B].pulse);
  62.             break;
  63.         default:
  64.             break;
  65.         }
  66.         timer_interrupt_flag_clear(TIMER0, TIMER_INT_FLAG_CH3);
  67.     }
  68. }
复制代码

使用特权

评论回复
| 2021-4-8 18:44 | 显示全部楼层
一来就是上程序,呵呵。

使用特权

评论回复
 楼主 | 2021-4-9 08:49 | 显示全部楼层
caigang13 发表于 2021-4-8 18:44
一来就是上程序,呵呵。

说的很清楚了,这段代码运行就死机,不想思考就别答。

使用特权

评论回复
| 2021-4-9 08:59 | 显示全部楼层
本帖最后由 xdqfc 于 2021-4-9 09:03 编辑

仿真看一下,程序究竟停在什么地方,然后再分析。官方的定时器库文件介绍的不是很能理解,包括STM32也一个屌样,所以,咱在使用定时器相关功能的时候,都是使用寄存器编程,其他外设用库文件。

使用特权

评论回复
| 2021-4-9 17:03 | 显示全部楼层
中断向量搞错了吧。230没有TIMER0_IRQHandler,只有TIMER0_BRK_UP_TRG_COM_IRQHandler,TIMER0_Channel_IRQHandler。除非你自己重新映射了

使用特权

评论回复
| 2021-4-9 17:35 | 显示全部楼层
风来吴山 发表于 2021-4-9 08:49
说的很清楚了,这段代码运行就死机,不想思考就别答。

那你自己思考了吗,至少单步调试一下,看看是哪一行代码,读写哪个寄存器时出的问题?死机,是怎么个死法,死机这个词太笼统了,是出现异常fault了吗,你自己都描述不清楚自己的问题,让别人怎么帮你

使用特权

评论回复
 楼主 | 2021-4-11 16:57 | 显示全部楼层
zfazhan 发表于 2021-4-9 17:03
中断向量搞错了吧。230没有TIMER0_IRQHandler,只有TIMER0_BRK_UP_TRG_COM_IRQHandler,TIMER0_Channel_IRQ ...

嗯,是的。

使用特权

评论回复
 楼主 | 2021-4-11 16:58 | 显示全部楼层
sonicll 发表于 2021-4-9 17:35
那你自己思考了吗,至少单步调试一下,看看是哪一行代码,读写哪个寄存器时出的问题?死机,是怎么个死法 ...

已经解决了。

使用特权

评论回复
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 我要提问 投诉建议 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

在线客服 快速回复 返回顶部 返回列表