打印

GD32VW553的滴答定时器定时问题

[复制链接]
358|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
456123158|  楼主 | 2024-1-18 17:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 456123158 于 2024-1-18 17:08 编辑

使用的主控是GD32VW553HMQ6,主频是160MHz,而在其例程中,关于滴答定时器的比较值是设置为系统时钟 / 4000。
我自己对滴答定时器的理解是

滴答定时器定时时间= 滴答定时器比较值 * 计数一次的时间
(1)滴答定时器比较值:在例程中比较值设置为了 SystemCoreClock / 4000,而根据VW55x用户手册,可以知道滴答定时器的时钟是AHB或者AHB/8,AHB又是160MHz,所以这个比较值为 160,000,000 / 4000 = 40,000。

(2)计数一次的时间:计数一次的时间就等于主频的倒数,为1 / 160,000,000 = 0.00000000625 (秒)

那么滴答定时器定时时间=40,000 * 0.00000000625 = 0.00025 (s) = 0.25 (ms)

现在的定时时间计算出来了,但是实际运行时间是1ms。

怎么都不对,填入比较值为 SystemCoreClock / 1000 是可以计算出为 1ms了,但是实际测试时又误差了4倍的时间。

所以现在很不理解,关于这个GD32VW553,RISC-V内核的芯片,它的滴答定时器是怎么算的?

在数据手册有说,该芯片为兆易创新和芯来科技一起完成,然后去芯来科技看内核手册《Bumblebee处理器
内核指令架构手册》,关于内核的滴答定时器的寄存器地址都对上了,滴答定时器的时钟也是来源于SOC CLK,而SOCCLK不就是160MHz吗?它的滴答定时器是怎么算的?


以下为例程中的滴答定时器初始化源码,使用以下源码才能实现1ms中断:

void systick_config(void)
{
    //暂停计时 控制计时器运行或者暂停。如果该域的值为1,则计时器暂停计数,否则正常自增计数。
    SysTimer_SetControlValue(SysTimer_MTIMECTL_CMPCLREN_Msk);
    //设置计时器比较值,当计时器的计数值大于或者等于比较值,则产生计时器中断
    SysTimer_SetCompareValue(SystemCoreClock / 4000);

    __ECLIC_SetTrigIRQ(CLIC_INT_TMR, ECLIC_POSTIVE_EDGE_TRIGGER);
    //开启中断
    eclic_irq_enable(CLIC_INT_TMR, 0, 0);
}

使用特权

评论回复
沙发
456123158|  楼主 | 2024-1-18 17:06 | 只看该作者
滴答定时器在RSIC-V中叫做TIMER,关于它的寄存器说明参考: Bumblebee处理器内核指令架构手册:https://www.rvmcu.com/uploadfile/pdf/0/0/8.pdf

使用特权

评论回复
板凳
456123158|  楼主 | 2024-1-19 11:00 | 只看该作者
该问题已经解决。

GD32VW553的滴答定时器(TIMER)的时钟源是SOC CLK,但是SOC CLK并不等于主频(CPU CLK),而是由主频除以一个预分频系数得到的。这个预分频系数可以通过寄存器SysTimer_MTIMECFGR的CLKDIV位来设置,其默认值是4。因此,SOC CLK的实际频率是160MHz / 4 = 40MHz,而不是160MHz。


现在的滴答定时器的频率是 40MHz,而比较值是根据系统主频设置的,而系统主频为160MHz。带入运算:
SystemCoreClock / 1000 * (1 / 滴答定时器频率 )
160 000 000 / 1000 * (1 / 40 000 000)
160 000 000 / 1000 / 40 000 000
160 000 / 40 000 000
0.004(s)
这样就知道了为什么输入 /1000,实际结果却误差4倍的原因了


而输入 /4000,带入运算:
SystemCoreClock / 4000 * (1 / 滴答定时器频率 )
160 000 000 / 4000 * (1 / 40 000 000)
160 000 000 / 4000 / 40 000 000
40,000 / 40 000 000
0.001(s)

使用特权

评论回复
地板
黑心单片机| | 2024-1-29 21:38 | 只看该作者
GD32VW553的滴答定时器(TIMER)的时钟源是SOC CLK,但是SOC CLK并不等于主频(CPU CLK),而是由主频除以一个预分频系数得到的。

使用特权

评论回复
5
cr315| | 2024-1-31 14:48 | 只看该作者
滴答定时器定时时间= 滴答定时器比较值 * 计数一次的时间
计数一次的时间就是主频的倒数,即1 / 160,000,000 = 0.00000000625 (秒)。
所以,滴答定时器定时时间= 40,000 * 0.00000000625 = 0.00025 (秒) = 0.25 (毫秒)

使用特权

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

本版积分规则

2

主题

7

帖子

0

粉丝