多语言展示
当前在线:1326今日阅读:167今日分享:27

怎么解决STM32高级定时器1的定时不准?

STM32拥有多个时钟源,我们对最终的系统时钟通过多个预分频器配置AHB、高速APB(APB2)和低速APB(APB1)域的频率。AHB和APB2域的最大频率是72MHz,APB1域的最大允许频率是36MHz。TIM2挂载在APB1上,TIM1挂载在APB2上。我们按照一般的(通用的定时器的)配置规则配置定时器1,会出现定时不准的情况?那我们应该如何解决呢?   在这里小编大概介绍一下系统时钟,以及定时器的时钟。
工具/原料
1

STM32中文数据手册

2

KEil,电脑

时钟配置:
1

打开创建的工程文件,在左边找到启动文件,双击启动文件,找到方框内的内容。程序一般从系统初始化开始,在运行到main里面。

2

单击sysinit函数,按F12调转到函数定义界面,在函数里面有如下图方框的内容。这个函数就是配置时钟的函数。

3

单击上图的SetSysClock函数,按F12调转到函数定义界面,在函数里面有如下图方框的内容。这个函数里面采用了很多宏定义,用于配置不同的系统时钟。我们配置为72Mhz。

4

打开配置72Mhz系统时钟的函数,在函数里面会出现这么一段英文,这段英文的意思就是“配置好了系统时钟,以及HCLK,PCLK1\PCLK2 的时钟”。这个函数里面的代码不详解,自己参照寄存器看。

5

在这里整个系统的时钟已经配置完毕了,我们就可以用时钟驱动各种外设了。GPIO、定时器1的时钟。

定时器1定时不准分析及解决:
1

一般的定时器(2-7),按照如下图的配置就可以正常工作了,但是定时器1是高级定时器,所以他要比其他定时功能更加复杂一点点。

2

我选用的向下计数模式,时序图如下图所示。每次计数值为0时,便产生事件更新中断,进入中断执行翻转LED0的操作。但是高级定时器当中对这个更新事件也进行了计数,当更新事件次数等于设定值时才会产生中断信号进入中断。

3

按照上面的这个原理我把,这个计数值设为0,(参照下图所示)就可以跟普通定时器一样,能够准确的定时了。从而控制led0翻转。

注意事项
1

注意配置参数的正确性,计算要准确,本文未讲解。

2

如果觉得小编有帮助到你,请点击右边双箭头分享给更多的朋友或者为小编点个赞吧!

推荐信息