问答

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

21ic问答首页 - GD32F30X timer8 timer 11初始化问题

兆易创新 GD32 gd32f30x 11 timer PE

GD32F30X timer8 timer 11初始化问题

lmksz2025-07-30
有哪位大佬知道,GD32F30X的 系统库函数timer_init()里没有对TIMER8/TIMER11的处理, 是什么原因?void timer_init(uint32_t timer_periph, timer_parameter_struct* initpara){
    /* configure the counter prescaler value */
    TIMER_PSC(timer_periph) = (uint16_t)initpara->prescaler;

    /* configure the counter direction and aligned mode */
    if((TIMER0 == timer_periph) || (TIMER1 == timer_periph) || (TIMER2 == timer_periph)
        || (TIMER3 == timer_periph) || (TIMER4 == timer_periph) || (TIMER7 == timer_periph)){
        TIMER_CTL0(timer_periph) &= ~(uint32_t)(TIMER_CTL0_DIR|TIMER_CTL0_CAM);
        TIMER_CTL0(timer_periph) |= (uint32_t)initpara->alignedmode;
        TIMER_CTL0(timer_periph) |= (uint32_t)initpara->counterdirection;
    }

    /* configure the autoreload value */
    TIMER_CAR(timer_periph) = (uint32_t)initpara->period;

    if((TIMER5 != timer_periph) && (TIMER6 != timer_periph)){
        /* reset the CKDIV bit */
        TIMER_CTL0(timer_periph) &= ~(uint32_t)TIMER_CTL0_CKDIV;
        TIMER_CTL0(timer_periph) |= (uint32_t)initpara->clockdivision;
    }

    if((TIMER0 == timer_periph) || (TIMER7 == timer_periph)){
        /* configure the repetition counter value */
        TIMER_CREP(timer_periph) = (uint32_t)initpara->repetitioncounter;
    }

    /* generate an update event */
    TIMER_SWEVG(timer_periph) |= (uint32_t)TIMER_SWEVG_UPG;
}

回答 +关注 1
409人浏览 8人回答问题 分享 举报
8 个回答
  • 后来发现是Timer8_CH0(@PE6)的重定位忘了写了, 加上后Timer8初始化正常, 说明不是库函数的问题。
  • 如下为TIMER8或者TIMER11需要执行的代码,主要包括设置预分频值,自动重装载值等:

    一般来说,固件库代码应该是通用设计,你要多看下芯片数据手册关于寄存器信息,了解一下为什么有些不配置,是因为没有这些位;
    高级定时器和通用定时器是有区别的;
    不过如果还有疑问,你也可以咨询一下技术支持。
  • 在timer_init()中添加对TIMER8/TIMER11的支持。
    lmksz 2025-8-1 08:36 回复TA
    是的, 建议厂家的工程师把库函数写完整些。 
  • 本帖最后由 dffzh 于 2025-7-31 17:19 编辑

    你是根据timer_init如何判断出没有对TIMER8/TIMER11进行处理的呢?我的看法是函数里面的各种if应该是针对有些定时器做特殊处理吧。
    比如TIMER1~TIMER4的控制寄存器0,有CAM位和DIR位,但TIMER8和TIMER11的控制寄存器0没有这些位,所以就根据定时器的实际情况来判断是否操作下面的代码:



    现在理解了吧。
    dffzh 2025-8-1 08:50 回复TA
    @lmksz :兄弟,要认真看代码和多看数据手册。 
    lmksz 2025-8-1 08:35 回复TA
    也注意到初始化化函数内对定时器号的判断, 但timer 8/11初始化就只执行下面两条指令? /* configure the autoreload value */ TIMER_CAR(timer_periph) = (uint32_t)initpara->period; /* generate an update event */ TIMER_SWEVG(timer_periph) |= (uint32_t)TIMER_SWEVG_UPG; 
  • 如果TIMER8/TIMER11功能受限,建议换用TIMER0~TIMER7中的通用定时器。
    lmksz 2025-8-1 08:37 回复TA
    其它定时器被用了, 只能用这两个......, 才遇到了这个问题 
  • 如果需要对TIMER8/TIMER11初始化,可以直接操作寄存器。
    lmksz 2025-8-1 08:40 回复TA
    还是希望厂家能把芯片内部硬件有的功能都在库函数里做好。 
  • 建议查看GD32F30x参考手册
  • 硬件设计上的差异导致的。
    lmksz 2025-8-1 08:39 回复TA
    用的是有Timer8/11的型号GD32F303ZGT6 

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