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

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

[复制链接]
STMCU小助手 发布时间:2022-2-24 20:31
前言# n1 ?' L" R" j' o) Q
基于学习的目的,详细讲解关于标准外设库中的定时器的 17 个示例项目函数文件。本次介绍 TimeBase 的示例。
5 {8 g6 q* s. j) J/ T) E
4 y0 t+ m6 L9 O7 g+ f一、示例详解
! `) \" w' q  d% P, x; L基于硬件平台:STM32F100B-EVAL,MCU 的型号是 STM32F103VET6。
" ^8 E. }2 G8 P8 r) M$ R9 T  G6 p" f软件则是其标准外设库。
3 M' v' G, q# Q$ @1、Time Base 的寄存器配置
# R* R2 ^) ]% w2 \' r软件配置,运行程序可以发现,系统时钟设置为 24MHz,定时器使用到的是 TIM2 ;) H! x% A: \6 d& D

6 e# @# {( p/ X! B3 P. y1 Z& ?8 p. W0 P OVG_((%~TPA1PEDTSQB3PX0.png % ]4 T; t% O3 K. |, f

9 X3 x0 i3 n  N6 s' p根据时钟树的图谱及其程序, 该示例选择的是内部时钟源作为定时器的时钟源;
0 s5 {$ v# T) L# c6 EAHB 时钟 (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,
& m0 N8 \. y6 q& L
& W$ U1 B5 |3 n8 H# T6 }* }' E 9727ZS5TQZXHP29MF9{X0.png & l; R2 [: f6 Y' J
2 s" N) [8 x* t6 H2 ?% D) H+ |) S
对于上述框图的倍频器,当 APB1 的预分频系数为 1 时,这个倍频器不起作用,定时器的时钟频率等于 APB1 的频率;当APB1 的预分频系数为其它数值(即预分频系数为 2、4、8 或 16)时,这个倍频器起作用,定时器的时钟频率等于 APB1 的频率两倍。APB1 不但要为 TIM2~7 提供时钟,而且还要为其它外设提供时钟;设置这个倍频器可以在保证其它外设使用较低时钟频率时,TIM2~7 可以工作在更高频率。
. c% D3 y5 U. ]2 \; ~0 B/ K$ ~" e8 f
OF2K``C`P2F(}))E09`$APR.png + w0 c- Y# v: X9 v& |
( F5 W+ X" x2 k/ w: e1 [# j
二、示例演练
4 v8 l8 K9 L+ f$ x- u, P% H+ y该示例在达到计数值时,中断内翻转任意通用 GPIO 口,通过示波器观测其翻转的周期频率。这儿有一个小插曲,软件是直接拷贝的库函数,理论上选择合适的单片机型号后,下载即可出波形结果;但是发现程序执行,示波器上出现不了波形,而且,在 IAR 中,寄存器调试观测窗口,发现 TIM2 寄存器的值初始化不了,TIM3(程序未涉及)反而出现了几个寄存器的初始化,但是 TIM3 的初始化值和自己程序中的还是不一样的,另外全局变量的值,尤其 SystemClock 还有 PrescalerValue 的值在检测窗口显示的时 Error,是否因为 TIM2 的地址定义是否错了?查看头文件的定义以及 Flash 的 Memory map,是对的。最终,发现可能出错的地方是在下图的配置,其中 CPU clock 原来的定义是 72Mhz,查看手册,该颗 MCU 最大只有 24Mh,修改过来,然后发现程序就运行正常了,但是当自己再次想复现该现象时,修改回 72Mhz,发现原来的现象再也不复现了。由于是超频使用了,不符合手册规范,所以这种情况是有可能的;在此,仅是提醒各位,配置时,这一块也要注意,否则可能会出现错误。! e% \; i2 ]* J7 h% z

: q  V/ e% G$ f RAN@D32F46)C){CSJEP)}WT.png % O: O4 _8 g$ x' d$ C7 K" R
; R" d. w2 m! Y+ C. a
综合上述,本案例中,Timer 的时钟源选择的是 Internal clock,CK_PSC 的时钟频率其实就是时钟树图中的输出 TIMxCLK,然后 TIMxCLK 或 CK_PSC 经过预分频器,才是最终用于计数的时钟基本单位(clock input,输入时钟)。' E  ]: A# C8 \( ~* n
另外,# }5 U7 R$ \# V9 e! {1 |
9 a! s+ \+ Z; z) ]' B/ [
SZK__Q~0H0M8X`LRSES7{LH.png
/ l* j0 ^0 S- n% X; D. q5 s3 N; _) f
3 P$ f. t7 L5 @2 c; k- l2 ~算得 PrescalerValue 的值为(24000000/12000000)-1 = 1,即 TIMx_PSC = 1,2 分频,即
' v& U. m/ ]# H( R2 F% g& hTIMxCLK = 6*2=12Mhz, 再除以 2,即 TIM2 counter clock at 6 MHz,在这里我个人觉得写成 PrescalerValue =(TIMx_CLK/6000000) -1 ,更合适。8 v3 b3 b# h8 d7 G7 {
  z7 }  L" L8 i4 p3 L3 |1 U8 j0 X# [
(`2WXE35A2AR@Y[DDR)})LS.png
# a' k) [3 T9 R3 K5 w
. f* e/ A' X" r8 u5 oTIM_PSCReloadMode_Immediate 这里的 PSC 是写入立刻生效;
: P, n( ?0 D! Q& z7 t6 e1 q
6 E, y7 \: M* x, S (PN3XTMHGS2JJ6[1QCY%Z}2.png . i* \) L, z7 ^

, S5 D9 j  u' u& f! n在上面的函数执行完成后,TIM_INT 的计数时钟等已经设置好了。
2 A& K* G; M: S: f1 s8 o接着配置各个通道的设置:8 f9 c5 x, x7 W6 h& B

5 v5 T9 ?) Y: x& C' [/ L1 h3 n- j 6LF[9`9Z%DLKE``L~D8A2.png , Q9 c! ~/ t# ^# r" o
! m1 Q: |% e0 K! H
配置的模式为 TIM_OCMode_Timing (值为 0x00),即是冻结 Forzen,适用于产生一个基准时钟;TIM_OutputState_Enable 输出使能;TIM_OCPolarity_High 的值为零,代表的是高电平有效;TIM_OCPreload_Disable 不允许预装载;最后TIM_Cmd(TIM2, ENABLE);,使能定时器;. j* D- F5 i% y1 w. d, a+ B7 M
/ I0 Y) y$ z: c3 z- O# k0 ^, q( N6 }3 d
W@S`(2K9OX)CS7%(]EYG96A.png ; x2 O2 j! J: X5 J$ h
9 y( k3 R4 C0 U5 y
允许定时器中断;
, H9 Z8 O% o$ b+ G在中断函数里面,如果运行下面的语句,则出现的方波的周期为 73Hz,50%PWM ;
% Y0 G2 q5 H6 a
& r$ R9 c) M, U" w' a  q
$ g7 u+ l3 W8 Q6 A8 | H1TUJINB33`0@[`9X}CX]I6.png / l9 ^+ D; Q) i8 m( S5 ]
! [$ @1 Q% h3 [) c
但是,如果4 ~5 P* m, o2 }7 Q1 N1 e

' R( f& P$ I2 W: i8 y. U& u/ b PB730Z~9`X)I0[_6T1%NPAM.png % G2 f/ F8 `9 D' J9 H, t+ O
# [- Q# s6 x8 A# j, U; Y
这是会发现,它的周期变为了上述的约一半。示波器测试是 :45.9 Hz,50%PWM ;这是怎么回事呢 ?怎么解释?上述是update rate,所以周期是其一半。缩小 CCR 的值试试看是什么在影响,
! `9 P% X+ Y& N4 |$ u其实如果了解其定时机理,就不难了解,
3 V: w& b. F. w; F! t, @$ I. s该示例中,CCR1_Val 中的值定义为 40961,周期值 TIM_Period 定义为 65535;定时器是向上计数模式,计到 ARR 会变为0 重新计数;- t! f: `3 `8 x+ v1 G+ B
所以,) `; P0 o$ N$ k+ }# x
对于中断的第一个截图,有函数 capture = TIM_GetCapture1(TIM2),通过变量观测 capture 的值总是 = CCR1_Val =CCR1 = 40961,然后再利用 TIM_SetComparel 的函数重新设置 CCR1 的值,在这里,CCR1_Val 的值可以理解为步长,每隔 CCR1_Val 个计数时间,GPIO 口翻转一次,所以 :; L4 |2 V3 A/ i
CC1 update rate = TIM2 counter clock/ CCR1_Val = 6000000 / 40961 = 146.48Hz,从而 PWM 的频率为 146.48/2 = 73Hz。2 p! I7 D( ?, q2 k
对于中断的第二个截图,它一开始是计数到 CCR1_Val 进入中断,GPIO 翻转一次(由于 GPIO 初始定义为 0,所以用示波器,触发模式,从波形上看不出来,如果设置初始值为高电平,则会看到一次宽度不一样的翻转),然后其实是每隔 65535 个计数时间,GPIO 口翻转一次,此时与 CCR1_Val 无关,所以 :6 [) U" [* z4 c$ z+ {5 @
CC1 update rate = TIM2 counter clock/ CCR1_Val = 6000000 / 65535= 91.5Hz,从而 PWM 的频率为 91.5/2 = 45.7Hz。符
+ v: X% S) l- T9 n9 x合描述。
3 D2 n. t9 W* V) v  `( H) R2 S- c  Q4 L+ d+ D" u8 f+ B1 M2 E
/ H# p6 u' B- T: v6 w
XVPA_E@)%8(BKVDOKPVP6)C.png , _, u) y* D7 k0 u; `
, f  U+ W0 x( ^6 q
收藏 评论0 发布时间:2022-2-24 20:31

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版