电子说
GD32 Timr定时器看起来比较复杂啊。一看GD32E10x 的SPEC:一个高级定时器,三个通用定时器,还有一个基本定时器。
项目上想用来做分时处理程序都不知道用哪个?
就用通用的定时器 timer1
一起看下时钟树,如下图所示:
GD32时钟树部分硬件展示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
审核编辑:符乾江
全部0条评论
快来发表一下你的评论吧 !