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

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

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

前几天调了1块F103ZET6的开发板,用了个系统定时器,感觉不准,最终找到原因是因为选错了时钟源。; g9 H; L& u; ^
今天来分享一下也算是给大家以后出现问题做个参考吧。
. H2 a6 V( U1 @" N  r6 u    说到时钟源,得说到STM32系统时钟的初始化。* p$ I& _: B- Y  S
   

' ^9 h( P9 P6 X4 F8 z

, Y- Z# R1 c2 l. D     前面就不说了,直接从复位中断说起。 复位所有的中断之后,导入Main函数
* y! N. K3 z1 \: M3 [然后,进入SystemInit函数,进行时钟配置。在SystemInit函数中有一个  SetSysClock()函数  S5 D2 w/ I: S! h9 }5 S
- A7 I* E4 v+ U& t
配置系统时钟为72M,这是在外部晶振为8M的情况下。
) H' \8 Y! ]- ]7 |" X配置完系统时钟之后,然后运行Main函数,这就是STM32程序的启动过程。

系统定时器是是Core_cm3和Core_cm4内核均存在的定时器# A* Q" X2 m; x" Y5 w
F103c8t6,共有7个定时器,一个高级定时器TIM1,3个通用定时器TIm2、TIM3和TIM4、1个系统定

时器和2个看门狗定时器(独立的和窗口型)。; {1 v2 B% U; V# R6 S
系统定时器(滴答定时器)是一个24位自减型计数器,也就是说他的最大计数次数为. P; o8 |- r- u4 `( s" c
111111111111111111111111,换算成十六进制为0XFFFFFF,十进制为16777215。
2 }6 f( y& g) h. M( z, o系统定时器的时钟来源可以通过 SysTick_CLKSourceConfig()来选择。

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

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

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

系统定时器时钟频率为9M: H/ X3 ?5 f1 U
1 = 外部时钟源(STCLK) (AHB总线时钟的1/8(HCLK/8)
) s5 Y( E) W' K1 E' n' ]0 = 内核时钟(FCLK) (AHB总线时钟的频率(HCLK))

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

这是原因1,还有一个原因在下面解释。# Q8 K/ r7 b% q; w: r1 g
要是用滴答定时器中断,要配置滴答定时器的中断优先级,否则为默认的最低优先级。
, I0 m& s; V! K: n# J5 a6 `# Y- {- B滴答定时器发生中断后,不需要人为去清除中断标志位和重新加载预装值,系统会自动清除和装载,比较简单

3 `6 B3 y5 s+ a. q- J2 J

滴答定时器配置

4 w& C5 |- v$ W! j
- ^2 F& `& d. _" p# X- D
我们采用系统时钟的八分频,也就是系统时钟为9M,每秒钟计数为9M' E3 s1 K* t9 ]1 r% J
设置计数值为9M,也就是说1秒钟进一次系统定时器中断函数,用变量i自加来表示。, x3 V1 T# ?! H5 ~

' j7 t: W( u5 I) N' t5 ^但是这样的配置我们发现i的自加并没有按照1s加一次的理论进行,而且加的很快。- b3 S$ |& _6 t1 i  m3 L* y$ H3 u( ^
但后来把计数值放在系统分频的前面,也就是如下图所示,计数正常。$ ?, T" ^+ M/ y1 R3 Q
4 ?; u" X7 d3 g  B% L. s# z( e

' U  U" J  _* N% Q" r! l5 e这个原因没找到,但是结果正确,哪位大佬帮忙解释一下,代码已上传。5 ?) ?5 P9 w. Q3 p
. p4 A  x2 O- s7 c- A  ?& C6 T7 E
还有个提示,就是用了滴答定时器做定时器中断之后,就不要再用于延时函数了
8 T) E( E+ A, `! A否则就冲突程序跑飞了,比如这样# n& k0 S) j8 n! M( A

! m3 r7 A7 t/ A: h还需要知道一点的是:

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

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

以上就是对系统定时器计数不准的解释。
' z' P& \; F% Y---------------------
0 l; P$ t; _5 Y* `" l  d6 V作者:woai32lala
; u' f! X) X0 o+ j1 g5 l6 J7 D5 U/ O  u. S1 f) {

: i. I% w) G7 f+ Y: `
赞 收藏 评论0 发布时间:2022-12-8 16:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版