打印
[研电赛技术支持]

GD32E23x的timer 13能正常输出PWM,timer16却不行

[复制链接]
614|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
GD32E23x的timer 13能正常输出PWM,timer16按照同样的设置却不行,请问为什么?

使用特权

评论回复
沙发
sonicll| | 2020-12-23 19:09 | 只看该作者
timer_primary_output_config()这个函数用了吗,TIMER16需要使能这个函数

使用特权

评论回复
板凳
luoengineer|  楼主 | 2020-12-24 09:36 | 只看该作者
sonicll 发表于 2020-12-23 19:09
timer_primary_output_config()这个函数用了吗,TIMER16需要使能这个函数

/*!
    \brief      configure TIMER primary output function
    \param[in]  timer_periph: TIMERx(x=0,14..16)
    \param[in]  newvalue: ENABLE or DISABLE
    \param[out] none
    \retval     none
*/
void timer_primary_output_config(uint32_t timer_periph, ControlStatus newvalue)
{
    if(ENABLE == newvalue){
        TIMER_CCHP(timer_periph) |= (uint32_t)TIMER_CCHP_POEN;
    }else{
        TIMER_CCHP(timer_periph) &= (~(uint32_t)TIMER_CCHP_POEN);
    }
}

是这个函数吧,加上了
昨天还是测试timer15,也是一样,没有输出PWM

timer_oc_parameter_struct timer_ocintpara;
    timer_parameter_struct timer_initpara;

    rcu_periph_clock_enable(RCU_TIMER15);

    timer_deinit(TIMER15);

    /* TIMER configuration */
    timer_initpara.prescaler         = 0; //9
    timer_initpara.alignedmode       = TIMER_COUNTER_EDGE;
    timer_initpara.counterdirection  = TIMER_COUNTER_UP;
    timer_initpara.period            = 4095; // 255
    timer_initpara.clockdivision     = TIMER_CKDIV_DIV1;
    timer_initpara.repetitioncounter = 0;
    timer_init(TIMER15,&timer_initpara);

    /* configurate CH0 in PWM mode0 */
    timer_ocintpara.ocpolarity  = TIMER_OC_POLARITY_HIGH;
    timer_ocintpara.outputstate = TIMER_CCX_ENABLE;

    timer_channel_output_config(TIMER15,TIMER_CH_0,&timer_ocintpara);

    timer_channel_output_pulse_value_config(TIMER15,TIMER_CH_0,2048); // 50% duty
    timer_channel_output_mode_config(TIMER15,TIMER_CH_0,TIMER_OC_MODE_PWM0);
    timer_channel_output_shadow_config(TIMER15,TIMER_CH_0,TIMER_OC_SHADOW_DISABLE);

    /* auto-reload preload enable */
    timer_auto_reload_shadow_enable(TIMER15);
//    timer_automatic_output_enable(TIMER15);
    timer_primary_output_config(TIMER15,ENABLE);
    /* auto-reload preload enable */
    timer_enable(TIMER15);

是不是APB2没有工作起来,但我一时半会还没有检查出APB2的问题




使用特权

评论回复
地板
sonicll| | 2020-12-24 10:02 | 只看该作者
你把timer_ocintpara这个结构体的参数补全试试,TIMER0,14,15,16有互补通道,互补通道即使不使用,也要把初始化的结构体补全,否则库函数写入寄存器的时候会出错

    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;

使用特权

评论回复
5
luoengineer|  楼主 | 2020-12-24 15:01 | 只看该作者
sonicll 发表于 2020-12-24 10:02
你把timer_ocintpara这个结构体的参数补全试试,TIMER0,14,15,16有互补通道,互补通道即使不使用,也要 ...

Thanks!

问题已经解决!    timer_ocinitpara.ocidlestate  = TIMER_OC_IDLE_STATE_LOW;
    timer_ocinitpara.ocnidlestate = TIMER_OCN_IDLE_STATE_LOW;


这2行代码很重要。

使用特权

评论回复
6
sonicll| | 2020-12-24 15:17 | 只看该作者
luoengineer 发表于 2020-12-24 15:01
Thanks!

问题已经解决!    timer_ocinitpara.ocidlestate  = TIMER_OC_IDLE_STATE_LOW;

这其实是C语言使用的问题,结构体临时变量,没有给初始值,结构体的成员都是随机值,把随机值写进硬件寄存器,就会有各种问题

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

19

主题

80

帖子

1

粉丝