前几天调了1块F103ZET6的开发板,用了个系统定时器,感觉不准,最终找到原因是因为选错了时钟源。
7 ]- ~: m( l0 R) ^. p今天来分享一下也算是给大家以后出现问题做个参考吧。) D; v; ]9 X$ _
说到时钟源,得说到STM32系统时钟的初始化。1 _ ~; j+ n( g% r2 b# s- ?

9 H" E# u" i. U9 |0 O) p9 |8 l
! A4 s- o- q$ I' N 前面就不说了,直接从复位中断说起。 复位所有的中断之后,导入Main函数* H' c" l- Z4 E; b# n9 Q/ ?7 x
然后,进入SystemInit函数,进行时钟配置。在SystemInit函数中有一个 SetSysClock()函数* Q# P- k; T k% [
0 C9 b9 z* G$ F0 A* Z
配置系统时钟为72M,这是在外部晶振为8M的情况下。
$ C$ `; V( Y; w( I, Q- \2 c配置完系统时钟之后,然后运行Main函数,这就是STM32程序的启动过程。
系统定时器是是Core_cm3和Core_cm4内核均存在的定时器1 n$ o' U3 Z, J9 {
F103c8t6,共有7个定时器,一个高级定时器TIM1,3个通用定时器TIm2、TIM3和TIM4、1个系统定 时器和2个看门狗定时器(独立的和窗口型)。
1 Y/ c: C( W3 s- a' B: ^系统定时器(滴答定时器)是一个24位自减型计数器,也就是说他的最大计数次数为( t2 Y( l) F+ m
111111111111111111111111,换算成十六进制为0XFFFFFF,十进制为16777215。, i- b3 e+ t4 `/ Y/ g) ?) A" M2 |
系统定时器的时钟来源可以通过 SysTick_CLKSourceConfig()来选择。 如果选择 SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK)则为0,选择内部时钟72M。 若选择SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8),则系统时钟72M的8分频, 网上很多说把SysTick_CLKSource_HCLK_Div8叫做外部分始时钟,不知道是啥原因? 系统定时器时钟频率为9M
4 P& H8 G" U1 h1 u2 f6 v1 = 外部时钟源(STCLK) (AHB总线时钟的1/8(HCLK/8)3 t. {4 [, |# j% M* M; A
0 = 内核时钟(FCLK) (AHB总线时钟的频率(HCLK)) 也就是这里我用错了时钟源导致系统定时器不准!! 这是原因1,还有一个原因在下面解释。3 D# h4 c# u8 I
要是用滴答定时器中断,要配置滴答定时器的中断优先级,否则为默认的最低优先级。
, i7 M& a& o: ?滴答定时器发生中断后,不需要人为去清除中断标志位和重新加载预装值,系统会自动清除和装载,比较简单
+ {9 c: s; ] l5 h% ^
滴答定时器配置 , X+ w/ h& x+ I7 J1 w0 L# r

* I. J5 U k& z: u; T: `我们采用系统时钟的八分频,也就是系统时钟为9M,每秒钟计数为9M0 S4 M0 E# q3 m: m. b% D' I2 t
设置计数值为9M,也就是说1秒钟进一次系统定时器中断函数,用变量i自加来表示。/ {+ c, b4 v0 f
/ I% x1 m& y1 ~但是这样的配置我们发现i的自加并没有按照1s加一次的理论进行,而且加的很快。
$ s z8 ^0 _5 G( l% }, `" o8 Z9 t但后来把计数值放在系统分频的前面,也就是如下图所示,计数正常。
/ R0 r5 c) i8 K7 E/ W* e( y9 o& \$ B1 @! e- N! v$ O7 f. T& }. ^ o+ p

: j q/ j5 X2 L% d; v这个原因没找到,但是结果正确,哪位大佬帮忙解释一下,代码已上传。
k, l3 i- Y5 ~! i/ ]/ Y, w i: H2 c& J' I @+ M
还有个提示,就是用了滴答定时器做定时器中断之后,就不要再用于延时函数了2 e/ C2 r: @% b2 L
否则就冲突程序跑飞了,比如这样& ^7 E0 N* Z& [. m4 K _$ }' W$ A( Y

7 `( d5 Y- t8 S; D& ]- T5 e" {) c还需要知道一点的是: 时钟配置为72MHz,第一行代码已经选择为滴答定时器系统时钟的8分频,也就是滴答定时器时钟为9MHz, 下面的“fac_us”需要得到的是时钟周期,即1us(1个fac_us)需要9个时钟周期,1个fac_ms需要9000个时钟周期。 以上就是对系统定时器计数不准的解释。) g' x7 m, e4 u- y# r8 z
---------------------
+ q" k1 C# }1 c; ~; {作者:woai32lala
+ V" ~& Z9 {0 D6 a% M9 C. L, S: w1 |5 t7 Z! A
( L7 g- n a( o( x+ h) g( h |