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;
}
硬件设计上的差异导致的。 建议查看GD32F30x参考手册 如果需要对TIMER8/TIMER11初始化,可以直接操作寄存器。 如果TIMER8/TIMER11功能受限,建议换用TIMER0~TIMER7中的通用定时器。 本帖最后由 dffzh 于 2025-7-31 17:19 编辑
你是根据timer_init如何判断出没有对TIMER8/TIMER11进行处理的呢?我的看法是函数里面的各种if应该是针对有些定时器做特殊处理吧。
比如TIMER1~TIMER4的控制寄存器0,有CAM位和DIR位,但TIMER8和TIMER11的控制寄存器0没有这些位,所以就根据定时器的实际情况来判断是否操作下面的代码:
现在理解了吧。
在timer_init()中添加对TIMER8/TIMER11的支持。 如下为TIMER8或者TIMER11需要执行的代码,主要包括设置预分频值,自动重装载值等:
一般来说,固件库代码应该是通用设计,你要多看下芯片数据手册关于寄存器信息,了解一下为什么有些不配置,是因为没有这些位;
高级定时器和通用定时器是有区别的;
不过如果还有疑问,你也可以咨询一下技术支持。
GD32F30X timer8 timer 11初始化问题
后来发现是Timer8_CH0(@PE6)的重定位忘了写了, 加上后Timer8初始化正常, 说明不是库函数的问题。 lmksz 发表于 2025-8-1 09:02后来发现是Timer8_CH0(@PE6)的重定位忘了写了, 加上后Timer8初始化正常, 说明不是库函数的问题。 ...
是的,代码里面是需要Remap操作才可以的,解决了就好:
页:
[1]