GD32F30X timer8 timer 11初始化问题

[复制链接]
531|15
手机看帖
扫描二维码
随时随地手机跟帖
lmksz|  楼主 | 2025-7-30 17:07 | 显示全部楼层 |阅读模式
有哪位大佬知道,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 | 显示全部楼层
硬件设计上的差异导致的。

使用特权

评论回复
评论
lmksz 2025-8-1 08:39 回复TA
用的是有Timer8/11的型号GD32F303ZGT6 
powerantone| | 2025-7-31 16:16 | 显示全部楼层
建议查看GD32F30x参考手册

使用特权

评论回复
stormwind123| | 2025-7-31 16:17 | 显示全部楼层
如果需要对TIMER8/TIMER11初始化,可以直接操作寄存器。

使用特权

评论回复
评论
lmksz 2025-8-1 08:40 回复TA
还是希望厂家能把芯片内部硬件有的功能都在库函数里做好。 
onlycook| | 2025-7-31 16:18 | 显示全部楼层
如果TIMER8/TIMER11功能受限,建议换用TIMER0~TIMER7中的通用定时器。

使用特权

评论回复
评论
lmksz 2025-8-1 08:37 回复TA
其它定时器被用了, 只能用这两个......, 才遇到了这个问题 
dffzh| | 2025-7-31 17:07 | 显示全部楼层
本帖最后由 dffzh 于 2025-7-31 17:19 编辑

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

使用特权

评论回复
评论
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; 
classroom| | 2025-7-31 18:17 | 显示全部楼层
在timer_init()中添加对TIMER8/TIMER11的支持。

使用特权

评论回复
评论
lmksz 2025-8-1 08:36 回复TA
是的, 建议厂家的工程师把库函数写完整些。 
dffzh| | 2025-8-1 08:48 | 显示全部楼层
如下为TIMER8或者TIMER11需要执行的代码,主要包括设置预分频值,自动重装载值等:
42131688c0e4fa6d01.png
一般来说,固件库代码应该是通用设计,你要多看下芯片数据手册关于寄存器信息,了解一下为什么有些不配置,是因为没有这些位;
高级定时器和通用定时器是有区别的;
不过如果还有疑问,你也可以咨询一下技术支持。

使用特权

评论回复
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操作才可以的,解决了就好:
69246688c517e1c075.png

使用特权

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

本版积分规则

1

主题

11

帖子

0

粉丝