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

【经验分享】STM32F1 通用定时器示例详解--TimeBase

[复制链接]
STMCU小助手 发布时间:2022-2-24 20:31
前言
+ X( `  e0 o8 c6 s基于学习的目的,详细讲解关于标准外设库中的定时器的 17 个示例项目函数文件。本次介绍 TimeBase 的示例。7 u% P3 i9 o; K+ G% x: H

& h9 k/ ]" N( \# ]" P+ I一、示例详解2 N/ a3 q) s. V, h9 T. R3 b) J; V+ J
基于硬件平台:STM32F100B-EVAL,MCU 的型号是 STM32F103VET6。* T) e/ R4 d: E4 q* s; ]/ B6 [
软件则是其标准外设库。
% Z+ K# z; W; I# n; ?1、Time Base 的寄存器配置
  j8 T' S/ N& o! _8 Y+ w软件配置,运行程序可以发现,系统时钟设置为 24MHz,定时器使用到的是 TIM2 ;6 W6 q/ Q) `0 X6 r2 m# V( T" S& J
- i5 n# Y1 }$ X  {5 R/ w
OVG_((%~TPA1PEDTSQB3PX0.png
5 w5 u; X4 Q0 x3 O. I. a  E; O
% b9 a2 a! O, O3 \: g* P) L根据时钟树的图谱及其程序, 该示例选择的是内部时钟源作为定时器的时钟源;8 S; Z- J1 y; y
AHB 时钟 (HCLK)在 RCC_CFGR 寄存器中的分频系数 HPRE 的值为 0,即 SYSCLK not divided,所以 HCLK 就是 24MHz;APB1 的 prescaler 的系数是 PPRE1:0x05,即分频 4,APB1CLK 为 24/4 = 6M ;由于 APB1 的 prescaler 系数不为 1,所以经过倍频器后就是 x2,即为 TIMxCLK = 6*2=12Mhz,
- |5 w( ]. l" Y, e9 c
1 d$ U. {0 o7 y, R* H& p 9727ZS5TQZXHP29MF9{X0.png ; H- {) o3 u! J! r( H- ?( m

  P8 u+ f- p/ O6 _; C对于上述框图的倍频器,当 APB1 的预分频系数为 1 时,这个倍频器不起作用,定时器的时钟频率等于 APB1 的频率;当APB1 的预分频系数为其它数值(即预分频系数为 2、4、8 或 16)时,这个倍频器起作用,定时器的时钟频率等于 APB1 的频率两倍。APB1 不但要为 TIM2~7 提供时钟,而且还要为其它外设提供时钟;设置这个倍频器可以在保证其它外设使用较低时钟频率时,TIM2~7 可以工作在更高频率。. \- c) @9 J% u; |. p% ]+ U

" \6 h- U6 }1 @/ @. r  G5 n OF2K``C`P2F(}))E09`$APR.png 9 p- a" e) m$ w# L* g6 v

4 R0 f5 o" o/ e5 ?2 B9 c二、示例演练! i& O4 q  }3 Z# u0 t
该示例在达到计数值时,中断内翻转任意通用 GPIO 口,通过示波器观测其翻转的周期频率。这儿有一个小插曲,软件是直接拷贝的库函数,理论上选择合适的单片机型号后,下载即可出波形结果;但是发现程序执行,示波器上出现不了波形,而且,在 IAR 中,寄存器调试观测窗口,发现 TIM2 寄存器的值初始化不了,TIM3(程序未涉及)反而出现了几个寄存器的初始化,但是 TIM3 的初始化值和自己程序中的还是不一样的,另外全局变量的值,尤其 SystemClock 还有 PrescalerValue 的值在检测窗口显示的时 Error,是否因为 TIM2 的地址定义是否错了?查看头文件的定义以及 Flash 的 Memory map,是对的。最终,发现可能出错的地方是在下图的配置,其中 CPU clock 原来的定义是 72Mhz,查看手册,该颗 MCU 最大只有 24Mh,修改过来,然后发现程序就运行正常了,但是当自己再次想复现该现象时,修改回 72Mhz,发现原来的现象再也不复现了。由于是超频使用了,不符合手册规范,所以这种情况是有可能的;在此,仅是提醒各位,配置时,这一块也要注意,否则可能会出现错误。
3 n& y1 H" ^  J/ h$ w6 F0 z1 T, n' B; x- C* g" P
RAN@D32F46)C){CSJEP)}WT.png
: Z: K3 x) {6 n0 i; ?$ q: G( R0 |4 |) g) h$ H" N0 l) }) f
综合上述,本案例中,Timer 的时钟源选择的是 Internal clock,CK_PSC 的时钟频率其实就是时钟树图中的输出 TIMxCLK,然后 TIMxCLK 或 CK_PSC 经过预分频器,才是最终用于计数的时钟基本单位(clock input,输入时钟)。
5 c/ o2 I7 @* l1 N另外,7 T; p8 E, W6 [: Q

, o2 c$ I. w8 _- e% Y4 F' F SZK__Q~0H0M8X`LRSES7{LH.png 7 m0 X2 u( {/ c8 x, G8 u% I% |

( w9 a0 {) @5 N, J; O) G算得 PrescalerValue 的值为(24000000/12000000)-1 = 1,即 TIMx_PSC = 1,2 分频,即
  n- o! Y" [" b0 VTIMxCLK = 6*2=12Mhz, 再除以 2,即 TIM2 counter clock at 6 MHz,在这里我个人觉得写成 PrescalerValue =(TIMx_CLK/6000000) -1 ,更合适。: d: v+ e5 S1 i

( L8 e* ], d( G* m8 ]0 ^2 e (`2WXE35A2AR@Y[DDR)})LS.png
- q/ c9 [, ]% L2 i/ T
5 G% `/ C# T* S/ a4 NTIM_PSCReloadMode_Immediate 这里的 PSC 是写入立刻生效;
8 Q; f6 v/ D8 R  f7 T0 Y
, S2 B2 k* C# b1 y5 Y/ o: x (PN3XTMHGS2JJ6[1QCY%Z}2.png $ b. H3 ^( l0 {

0 I3 y/ u3 m" y在上面的函数执行完成后,TIM_INT 的计数时钟等已经设置好了。( O& w/ t/ I1 I8 |
接着配置各个通道的设置:  \; d0 C( c' L" S( V' v

8 C6 k6 I* V& t% T5 L 6LF[9`9Z%DLKE``L~D8A2.png ; R5 a( h# x: k/ z

8 v$ v- E/ Q2 J( y8 d配置的模式为 TIM_OCMode_Timing (值为 0x00),即是冻结 Forzen,适用于产生一个基准时钟;TIM_OutputState_Enable 输出使能;TIM_OCPolarity_High 的值为零,代表的是高电平有效;TIM_OCPreload_Disable 不允许预装载;最后TIM_Cmd(TIM2, ENABLE);,使能定时器;  ^& C7 v! n* _2 x7 E$ ~' e

+ W* B! {6 `  f5 _8 q W@S`(2K9OX)CS7%(]EYG96A.png / a" b& w/ n' I& M! K& L: k
" b- i: i/ \' e# v6 x. K
允许定时器中断;
* b9 v% }9 m& [# ~在中断函数里面,如果运行下面的语句,则出现的方波的周期为 73Hz,50%PWM ;
3 z4 p. g. V( Q# n8 ~9 r: F! x
2 ]( q0 \+ b' Q/ V0 R; w& R! z! ]* d7 `
H1TUJINB33`0@[`9X}CX]I6.png
) t7 @; q4 O* J" ^
+ g% R9 u7 k- x+ V' D' x但是,如果, }! W) N/ `1 d, \; q
: o1 O4 Y6 h( K/ H, S3 W& R8 E
PB730Z~9`X)I0[_6T1%NPAM.png + |! I! ?) C8 Q+ p% n+ e. r
! [, ?/ s) Z  Z! q; B! {
这是会发现,它的周期变为了上述的约一半。示波器测试是 :45.9 Hz,50%PWM ;这是怎么回事呢 ?怎么解释?上述是update rate,所以周期是其一半。缩小 CCR 的值试试看是什么在影响,
& J+ }( J# A7 v, F0 r5 Z4 [其实如果了解其定时机理,就不难了解,$ M  {0 g3 T$ o+ O9 e' t
该示例中,CCR1_Val 中的值定义为 40961,周期值 TIM_Period 定义为 65535;定时器是向上计数模式,计到 ARR 会变为0 重新计数;( _6 h% U, b+ N0 e: N0 }
所以,
$ @: C4 W* p2 l对于中断的第一个截图,有函数 capture = TIM_GetCapture1(TIM2),通过变量观测 capture 的值总是 = CCR1_Val =CCR1 = 40961,然后再利用 TIM_SetComparel 的函数重新设置 CCR1 的值,在这里,CCR1_Val 的值可以理解为步长,每隔 CCR1_Val 个计数时间,GPIO 口翻转一次,所以 :
, }% L% b) x& q1 c5 `# n* uCC1 update rate = TIM2 counter clock/ CCR1_Val = 6000000 / 40961 = 146.48Hz,从而 PWM 的频率为 146.48/2 = 73Hz。  E6 V( a' H4 k" m  r3 X3 ?- g, ^
对于中断的第二个截图,它一开始是计数到 CCR1_Val 进入中断,GPIO 翻转一次(由于 GPIO 初始定义为 0,所以用示波器,触发模式,从波形上看不出来,如果设置初始值为高电平,则会看到一次宽度不一样的翻转),然后其实是每隔 65535 个计数时间,GPIO 口翻转一次,此时与 CCR1_Val 无关,所以 :: N" i7 }- \. M  f' W
CC1 update rate = TIM2 counter clock/ CCR1_Val = 6000000 / 65535= 91.5Hz,从而 PWM 的频率为 91.5/2 = 45.7Hz。符! B) ]  D" r/ B5 i( T, `
合描述。
' _- L! i/ P* j
2 d9 m# L9 ~& q2 d/ ]
2 @) _5 B' k. `; Y$ y1 p8 V XVPA_E@)%8(BKVDOKPVP6)C.png ; h- E1 Y- s1 U" u1 K: u

+ p; S2 C) G1 j+ `' D+ B
赞 收藏 评论0 发布时间:2022-2-24 20:31

举报

0个回答

所属标签

相似技术帖

官网相关资源

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