GD32 Timr定时器看起来比较复杂啊。一看GD32E10x 的SPEC:一个高级定时器,三个通用定时器,还有一个基本定时器。
项目上想用来做分时处理程序都不知道用哪个?
就用通用的定时器 timer1
一起看下时钟树,如下图所示:
![watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3lhbmdrdW5oZW5yeQ==,size_16,color_FFFFFF,t_70](https://file.elecfans.com//web2/M00/3E/B6/pYYBAGJibymAOYSEAAECqMLvlv8677.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3lhbmdrdW5oZW5yeQ==,size_16,color_FFFFFF,t_70)
TIMER1的时钟是CK_TIMER1,要提供CK_TIMER1需要TIMER1 enable并且需要提供具体的时钟
具体的时钟
if(APB1 prescale = 1 ) x 1 else x 2
我们的CK_SYS时钟(系统时钟)经过Prescaler之后最大频率是CK_AHB(120MHz)
然后经过预分频,APB1频率最大到60MHz,如果预分频系数是1的话,则提供到TIMER的频率是x2。
也就是60*2 = 120MHz
所以TIMER1的时钟就用基于120MHz去分频
我想每200ms 获取一次timer1的中断。改怎么办?
有两个参数可以一起去实现这个功能。
1个事TIMER的prescale 可以先把这个120MHz分频,比如我分频为1MHz,那么prescale就是120,不过这里timer_initpara.prescaler不能设置为120,要设置为119.
因为具体的计算方式是120MHz/(prescaler+1)
这样拿到了1MHz的clock.那获取每200ms的中断再要做什么呢?
这里有reload 参数timer_initpara.period ,官方成为“TIMER counter auto reload register”
这个reload参数意思是:当计数计到period参数的时候就做一次更新,从0开始重新计算,中断就产生一次。
前面1MHz 意思是1s 可以计数1000 000次。也就是1ms 可以计数1000次,我需要200ms更新一次,那就说我需要计数 200 * 1000,所以reload就是200 * 1000 = 200000
timer_initpara.period 就是写为200000
审核编辑:符乾江
-
定时器
+关注
关注
23文章
3175浏览量
112658 -
时钟树
+关注
关注
0文章
52浏览量
10674
发布评论请先 登录
相关推荐
GD32和STM32有何区别?GD32如何替换STM32呢?
定时器如何实现定时任务
Linux驱动定时器使用示例
GD32F103CBT6 Systick定时器不准的原因?如何解决?
GD32与STM32谁更好?
GD32与MM32哪个好?
GD32与STM32兼容吗?
GD32和AT32哪个好?
gd32和stm32哪个好?
gd32和stm32的编程区别
ch32和gd32的区别
51单片机定时器讲解
![51单片机<b class='flag-5'>定时器</b><b class='flag-5'>讲解</b>](https://file1.elecfans.com/web2/M00/8C/C3/wKgaomSxBROABhSUAABk5nkjda0270.jpg)
评论