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

【经验分享】STM32 通用定时器示例详解—OnePulse

[复制链接]
STMCU小助手 发布时间:2022-2-24 21:33
前言
/ I: e/ h' v6 H: j4 _. o4 J- H# c基于学习的目的,详细讲解关于标准外设库中的定时器的 17 个示例项目函数文件。本次介绍 OnePulse。% F, [/ I0 U# j) I
/ r# O* H# s( ]* B* [
一、示例详解
7 T; c6 m1 h, i# b' Q基于硬件平台:STM32F100B-EVAL,MCU 的型号是 STM32F100VBT6。  G. }) p7 y1 N: ]4 Y4 |
软件则是其标准外设库。
, e2 h! S$ u$ r5 v- U单脉冲模式(OPM)允许计数器在受到一个激励时启动,在一个可编程的延时后产生一个宽度可编程的脉冲。
& A& G- J" x. @$ d; K* D1、One Pulse 的寄存器配置
4 F1 p; k" y$ \' g软件配置,运行程序可以发现,系统时钟设置为 24MHz,定时器使用到的是 TIM4;3 T) p6 s# [% g: y3 A) G

5 w+ o. Y7 s! B @LJH)D5BAVY3DE2T0PX[RNM.png $ Z2 ~! v/ T/ f7 j' b  c, p
. n* G) o8 r* V2 {: J, z
根据时钟树的图谱及其程序, 该示例选择的是内部时钟源作为定时器的时钟源;TIM4 的时钟源来自 APB1 的分频。" ?3 S) _" D& N; l/ a

. f& w4 O0 @- T( {1 _ V07`ZQIQ6GH)QER}PR4$TH4.png
! O* D0 z2 d0 F$ R3 s. L% k# X/ z& l' N# n. W2 V* E; n  E
RI$)HO%A{CJ5IQX~P5[X{21.png
' i) x1 z; r" c5 T) B% j* h5 M+ K8 A# _8 V1 K! g
AHB 时钟 (HCLK)在 RCC_CFGR 寄存器中的分频系数 HPRE 的值为 0,即 SYSCLK not divided,即/1,所以 HCLK 就是24MHz;3 l* m: }* M  F
APB1 的 prescaler 的系数是 PPRE1:0x0,HCLK not divided,即/1,APB1CLK 为 24MHz;由于 APB1 的 prescaler 系数部分频,即/1,所以倍频器不起作用,即为上图中的 TIMxCLK = 24Mhz。
9 M- ^2 @. \; i: d% Q
; z3 T6 h" {8 M1 f7 k. m5 V* _1 {' [0 l二、示例演练) W+ t1 n$ y0 d9 r3 w3 H& R* f

' K2 q/ |5 ]! S6 b A`E8R@8D[GEU$%VQ{T(%OX7.png
  l% u" ]: i4 p3 R$ Q综合上述,本案例中,Timer 的时钟源选择的是 Internal clock,CK_PSC 的时钟频率其实就是时钟树图中的输出 TIMxCLK,然后 TIMxCLK 或 CK_PSC 经过预分频器,才是最终用于计数的时钟基本单位(clock input,输入时钟)。# o4 b' L6 [1 r1 H. N* k
另外,7 q- B& ^2 \0 d7 [

  v3 M2 R+ ^" C2 r6 v% g Y4NV%O$$XF}I9)]]Z1(J0E1.png
" W! A" [+ ?, Y  o" P
8 v  H! Q. S7 s* M" Q5 `设置 PrescalerValue = 0 和 ClockDivision = 0,不分频,即 TIMxCLK = 24Mhz,即 TIM1 counter clock at 24 MHz。1 Z* k# r7 s* O5 j

/ a" Z% r# a  ~$ J+ ]: P X@7E)~H%SF7]97R8I{FYL@9.png
; w* `$ S: C* ?# a9 B1 b' C3 s! G6 E
" y. v1 |& J& V8 P0 u% x! }OPM = 1,设置为单脉冲模式,在下一次更新事件发生时计数器将停止计数(清零 CEN 位)。
' o+ L, M/ r( a对于 OPM 这一位,默认值是 0,即更新事件发生时计数器不被停止。所以如果成 OPM=0,则相应的波形如下图所示:: Q' J+ ~7 G# F6 ^

. H0 R6 G/ W1 L" v/ A4 l 8 y  q" v" R% q" E: Y! ~' v
* x/ k4 m$ M2 t9 U  X6 b9 f
即受到外部触发信号的上升沿后,产生的不是一个脉冲,而是多个脉冲,即 PWM 的波形。从另一方面来说,如果 OPM=0,外部的触发信号也就在第一次上升沿的时候用于触发其他通道输出。之后,由于 OPM=0,即计数器不停止,则会一直输出PWM 波形。
" C# ]- t$ f# |& t9 @, ?- K
/ g# P0 N  S  I; U8 [3 K我们接下来看其他的寄存器配置:8 ?" [' p! |& E
$ I+ l3 G: [/ f6 }, f" F# Q- Y
AIR)8LQZ_B`_62@721F4[2N.png
& E( \/ z& w, O' ~
8 q% X8 k  m2 M9 J( r9 MSMS = 0x06,从模式选择位,设置为触发模式,在触发 TRGI 出现上升沿时(但未被复位)计数器启动,只有计数器的启动是受控的。
, ]( p. Z- e+ f# X4 ATS = 0x06,触发选择,设置的是被过滤的定时器输入 2(TI2FP2)。, Y7 Z: o# Y2 G) \( U
: f2 T5 K& [5 }
5M3{Y2Z@ALF$)PCZJPVMCIG.png
, V+ ^$ t' E7 F" W; P- s% C* i; ]% j7 l- }/ N
IC2S(CC2S) = 0x01,设置的是 CC2 通道被配置为输入,IC2 映射到 TI2 上;
' A( {0 q* g  ^
" u/ z: W: j" w SSTDIJ]Y42IT@%NCB4{5HW6.png 5 U+ @+ ~2 T' H1 `9 Z! F- P# Z2 ?; K
& m' V3 S, b1 E  s: ?( N  P- w: R
CC2P = 0x00,设置的是 0,表示无反转,IC2 上出现上升沿时发生捕获。/ @1 ^1 [1 K+ L1 z; }
所以结合下图,最终的结果是,选择的 TIM4_CH2 作为触发输入,其上升沿发生捕获,用于启动 TIM4。TIM4_CH2 的引脚对应的是 PB7。
6 M, ~5 l' u$ m在程序中,配置的单脉冲模式,TIM4_CH1 用于输出,对于其的初始化如下图的代码,这儿并没有类似的7 Y1 P1 {1 F: _
TIM_OCInitStructure.TIM_Channel = TIM_Channel_1;的语句,相应的 TIM_OC1Init,这个函数名就是相应的初始化channel_1,如果 TIM_OC2Init 则是初始化 channel_2。
/ G  r$ w  \' d/ S0 e# y
5 X" ^4 r0 l+ O  |  o  H: U* x9 `2 } ZSOY56G_CWP_[0F}3%SEJ7H.png
! C, Z  t, b, C0 c9 E+ I% Q! E2 b# \5 [5 h
下图的波形时运行源程序,OPM=1 的情况下的波形,因为 OPM = 1, 在下一次更新事件发生时计数器将停止计数(清零 CEN位)。所以只会看到一个脉冲。( D  N% V+ A, n" e$ J
3 b) c5 s8 U5 u8 O. x  L4 U
0(2QNET2WTJQO7DTBYF0~V0.png , ^, P- `1 b, N- }5 x

% L* D5 F$ A% `+ F  c+ _上面黄色的线表示 PB6,TIM4_CH1; 红色的是 PB7,TIM4_CH2;
/ m' ?; F* f2 v9 R( |  s测量后发现,黄色的脉宽宽度是 2.1ms,符合描述。5 _3 Y' f7 N" A# f$ E

2 n" D& ^2 `+ B0 O( ^ U}O$A(ON1)E{@(`64L`AU.png , Y% z2 A% M* W  u2 Z

! H# l' v# s$ z E`C7531NP8B1]VN]$C7WE.png
1 U+ |3 ~6 l3 Z- k9 V! C1 p* f$ g, v
# f7 J7 ]& x: W* F: E& n对于单脉冲,也可以同时触发几路的输出:1 S4 b$ S5 W) G1 {. F
原因如下图:* K" @* q# Z, ?% Z' C/ E7 e
. x6 n: S9 ^# T  l3 o) \1 q  p% c5 B
_}H~QL9R0HHVOX1M]TT$_70.png
& s; l0 n" i; S. d; k3 o; V
8 m+ C4 M  \; O/ ~1 ^" ]/ J在一般的单脉冲模式中,设置的是,TIMx_SMCR 寄存器中的 SMS 从模式选择位,其中的触发模式,是在触发 TRGI 出现上升沿时(但未被复位)计数器启动,只有计数器的启动是受控制的。注意这里控制的是计数器的启动,所以从一点上说明了可以同时输出几路波形的可能性。
: \6 r' d% M0 P0 w另一面,从上图的框架中可以看出, 作为定时器通道本身的触发输入,可能的只有两个:TI1FP1 和 TI2FP2,即 TIMx_CH1和 TIMx_CH2 作为触发输入源的选择。就是输入。
* ]* S  |( m( I% a9 j# v1 s对于输出,按照上面的框图,由于选择了 TI1FP1 或 TI2FP2,接下来走的路径是:Reset,Enable,up\down,Count----> CK_PSC,开始捕捉 CNT,从 CNT 框框中往下的箭头,对于 TIMx_CH1, TIMx_CH2, TIMx_CH3, TIMx_CH4,是并行的,也
  v) W4 @2 x2 }: E$ i* i& L就是可以同时输出几路的波形。; Z2 o. {; G: p
理论上是可以的,那么实际呢,只要在初始化一路通道,波形测试如下,也是可以的。* l/ t( q$ n: ~7 d* c$ a. K
1 q3 a+ \9 v& S6 ?  Y% Y# ?
/ c) J& E' b4 @  t+ C3 w, U  F
UZ~]PXSO77RJ7I_LNMA%~RR.png
. V( W- \3 b$ x% I
赞 收藏 评论0 发布时间:2022-2-24 21:33

举报

0个回答

所属标签

相似技术帖

官网相关资源

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