lmksz 发表于 2025-7-30 17:07

GD32F30X timer8 timer 11初始化问题

有哪位大佬知道,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;
}

flycamelaaa 发表于 2025-7-31 16:15

硬件设计上的差异导致的。

powerantone 发表于 2025-7-31 16:16

建议查看GD32F30x参考手册

stormwind123 发表于 2025-7-31 16:17

如果需要对TIMER8/TIMER11初始化,可以直接操作寄存器。

onlycook 发表于 2025-7-31 16:18

如果TIMER8/TIMER11功能受限,建议换用TIMER0~TIMER7中的通用定时器。

dffzh 发表于 2025-7-31 17:07

本帖最后由 dffzh 于 2025-7-31 17:19 编辑

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



现在理解了吧。

classroom 发表于 2025-7-31 18:17

在timer_init()中添加对TIMER8/TIMER11的支持。

dffzh 发表于 2025-8-1 08:48

如下为TIMER8或者TIMER11需要执行的代码,主要包括设置预分频值,自动重装载值等:

一般来说,固件库代码应该是通用设计,你要多看下芯片数据手册关于寄存器信息,了解一下为什么有些不配置,是因为没有这些位;
高级定时器和通用定时器是有区别的;
不过如果还有疑问,你也可以咨询一下技术支持。

lmksz 发表于 2025-8-1 09:02

GD32F30X timer8 timer 11初始化问题

后来发现是Timer8_CH0(@PE6)的重定位忘了写了, 加上后Timer8初始化正常, 说明不是库函数的问题。

dffzh 发表于 2025-8-1 13:32

lmksz 发表于 2025-8-1 09:02
后来发现是Timer8_CH0(@PE6)的重定位忘了写了, 加上后Timer8初始化正常, 说明不是库函数的问题。 ...

是的,代码里面是需要Remap操作才可以的,解决了就好:

页: [1]
查看完整版本: GD32F30X timer8 timer 11初始化问题