你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验之谈】基于STM32F103滴答定时器定时不准的经验分享

[复制链接]
STMCU小助手 发布时间:2022-12-8 16:00

前几天调了1块F103ZET6的开发板,用了个系统定时器,感觉不准,最终找到原因是因为选错了时钟源。7 w/ b) ~/ k$ b/ d4 U6 y
今天来分享一下也算是给大家以后出现问题做个参考吧。
- d, ?8 w) n# a; i! ^( l. q# h    说到时钟源,得说到STM32系统时钟的初始化。' _; C4 C5 G) g$ {2 b$ K( `! q2 v
   

, {9 _& T! c2 {1 G: W/ D) m4 S+ z

2 h3 Z7 ~# l( R" h     前面就不说了,直接从复位中断说起。 复位所有的中断之后,导入Main函数# L' I8 o6 n* `4 E0 P
然后,进入SystemInit函数,进行时钟配置。在SystemInit函数中有一个  SetSysClock()函数
! Y- D3 p0 z" c- J& m
& W# u  b1 G$ e+ g# ]配置系统时钟为72M,这是在外部晶振为8M的情况下。% B7 M) F, ^; v8 ?
配置完系统时钟之后,然后运行Main函数,这就是STM32程序的启动过程。

系统定时器是是Core_cm3和Core_cm4内核均存在的定时器
) X9 n0 F* M5 U4 C8 t3 uF103c8t6,共有7个定时器,一个高级定时器TIM1,3个通用定时器TIm2、TIM3和TIM4、1个系统定

时器和2个看门狗定时器(独立的和窗口型)。- W+ k8 v1 l# l- J- S1 ^
系统定时器(滴答定时器)是一个24位自减型计数器,也就是说他的最大计数次数为
, k8 N4 a5 H! Z* O: f111111111111111111111111,换算成十六进制为0XFFFFFF,十进制为16777215。
: R9 f2 K9 H! y; t' U+ f; A% s/ V7 r7 I系统定时器的时钟来源可以通过 SysTick_CLKSourceConfig()来选择。

如果选择 SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK)则为0,选择内部时钟72M。

若选择SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8),则系统时钟72M的8分频,

网上很多说把SysTick_CLKSource_HCLK_Div8叫做外部分始时钟,不知道是啥原因?

系统定时器时钟频率为9M
  G6 I/ o$ k' Y4 U( w+ `9 o1 = 外部时钟源(STCLK) (AHB总线时钟的1/8(HCLK/8)3 e6 P6 T) }+ Q8 _6 ^
0 = 内核时钟(FCLK) (AHB总线时钟的频率(HCLK))

也就是这里我用错了时钟源导致系统定时器不准!!

这是原因1,还有一个原因在下面解释。3 Q7 b3 e) r, }) H
要是用滴答定时器中断,要配置滴答定时器的中断优先级,否则为默认的最低优先级。/ G, i  ?% ?- V9 [4 b
滴答定时器发生中断后,不需要人为去清除中断标志位和重新加载预装值,系统会自动清除和装载,比较简单

1 K2 @# g+ c& \; b

滴答定时器配置


% w9 r5 r1 E+ z6 s3 H
- y8 S* M" I" Q; t我们采用系统时钟的八分频,也就是系统时钟为9M,每秒钟计数为9M( ^1 r* Z2 x' C% k4 |
设置计数值为9M,也就是说1秒钟进一次系统定时器中断函数,用变量i自加来表示。7 B3 _3 ?: x5 X1 Y
# T( E+ d! F2 l
但是这样的配置我们发现i的自加并没有按照1s加一次的理论进行,而且加的很快。
& l0 O3 v) g4 x; j# b但后来把计数值放在系统分频的前面,也就是如下图所示,计数正常。6 |! l7 \& [% |5 E# F9 z" t6 g

' Y; G! q7 P0 m7 `; E7 Y& Q8 s+ C
# \8 H- s$ b1 F这个原因没找到,但是结果正确,哪位大佬帮忙解释一下,代码已上传。
" w9 U7 y  h/ {- [3 k/ `/ K8 @8 ], l: c% ]
还有个提示,就是用了滴答定时器做定时器中断之后,就不要再用于延时函数了
. _8 `) S. w: @+ j$ j8 w/ S* f  B否则就冲突程序跑飞了,比如这样
2 }' L+ u' X1 h6 F" k% B6 |
8 [5 R7 L+ G4 ?" O0 E, L5 w3 Q) ]还需要知道一点的是:

时钟配置为72MHz,第一行代码已经选择为滴答定时器系统时钟的8分频,也就是滴答定时器时钟为9MHz,

下面的“fac_us”需要得到的是时钟周期,即1us(1个fac_us)需要9个时钟周期,1个fac_ms需要9000个时钟周期。

以上就是对系统定时器计数不准的解释。
( a! t6 D  W) [0 ~5 F---------------------: C' A( {" |7 |. s& w
作者:woai32lala) |/ f7 [3 Z3 f( [  A
- m9 i0 H- G' ^6 R4 r) [6 ^; A


8 P' y1 `, A0 ?1 N0 E7 J
收藏 评论0 发布时间:2022-12-8 16:00

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版