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

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

[复制链接]
STMCU小助手 发布时间:2022-2-24 21:33
前言& F6 y* W. m; v  N8 ~  ]9 W& Q
基于学习的目的,详细讲解关于标准外设库中的定时器的 17 个示例项目函数文件。本次介绍 OnePulse。
5 ?' v3 Q1 a- R5 {. d) K% ]9 d" u  ^5 g8 u# K, I- U5 u- @
一、示例详解1 `9 c& G1 ^' k7 j- j* J5 `
基于硬件平台:STM32F100B-EVAL,MCU 的型号是 STM32F100VBT6。
) `6 R' b% H2 O% D! T# C4 }软件则是其标准外设库。
% |* p- V  h2 v1 x1 Q7 \1 y单脉冲模式(OPM)允许计数器在受到一个激励时启动,在一个可编程的延时后产生一个宽度可编程的脉冲。
0 |! {$ [3 R( }& U' v1、One Pulse 的寄存器配置! Z8 X0 o+ K4 I! D5 R
软件配置,运行程序可以发现,系统时钟设置为 24MHz,定时器使用到的是 TIM4;
3 b& x# }* B6 p. \' d: M, f' U9 U5 s
1 \  w3 W" J% \1 N( b1 v9 v/ x @LJH)D5BAVY3DE2T0PX[RNM.png & x% W4 n. ?! X/ v- K- E& T) o

5 B; ?, p3 P7 l根据时钟树的图谱及其程序, 该示例选择的是内部时钟源作为定时器的时钟源;TIM4 的时钟源来自 APB1 的分频。0 A5 e3 i; e! I' B! v. @
5 _4 L! F9 G! {+ o* n  b' ~
V07`ZQIQ6GH)QER}PR4$TH4.png
& ~; o2 L2 R# [
3 d0 \% ~' Q* s3 t+ \1 p RI$)HO%A{CJ5IQX~P5[X{21.png . X# ?2 A6 Q1 b% |) U

1 w0 ^5 o5 h3 Z* |8 S$ s; i* g7 E; xAHB 时钟 (HCLK)在 RCC_CFGR 寄存器中的分频系数 HPRE 的值为 0,即 SYSCLK not divided,即/1,所以 HCLK 就是24MHz;# H' K% \" }  c  [2 D4 J. f
APB1 的 prescaler 的系数是 PPRE1:0x0,HCLK not divided,即/1,APB1CLK 为 24MHz;由于 APB1 的 prescaler 系数部分频,即/1,所以倍频器不起作用,即为上图中的 TIMxCLK = 24Mhz。7 F$ R/ _7 w7 Y' z8 _1 Z0 ^9 h+ p; b+ ?
& n7 V$ b5 {! _. f
二、示例演练
- ?" n# `9 E; Q/ B% i: |
+ ~/ E; K$ f: w* b2 w( _5 j% f A`E8R@8D[GEU$%VQ{T(%OX7.png
8 l' E  F/ k. U. u0 u/ m2 a, _综合上述,本案例中,Timer 的时钟源选择的是 Internal clock,CK_PSC 的时钟频率其实就是时钟树图中的输出 TIMxCLK,然后 TIMxCLK 或 CK_PSC 经过预分频器,才是最终用于计数的时钟基本单位(clock input,输入时钟)。2 D' E- x9 w7 K/ Y
另外,3 H# ?  H* g$ x% h) g

# ~0 J, n+ W4 y( H- |* K0 | Y4NV%O$$XF}I9)]]Z1(J0E1.png ! \4 ]# v* W" |7 o/ Y0 g+ O

3 N, x+ I7 O) P设置 PrescalerValue = 0 和 ClockDivision = 0,不分频,即 TIMxCLK = 24Mhz,即 TIM1 counter clock at 24 MHz。
4 h' L# T: z  F% _( D1 o2 y7 w  l5 O5 [  R2 h, j0 F
X@7E)~H%SF7]97R8I{FYL@9.png 0 X& h$ L5 q8 d- W/ n5 E& [$ h
* `; q. |. G9 {; t  }- t7 @" i1 Y
OPM = 1,设置为单脉冲模式,在下一次更新事件发生时计数器将停止计数(清零 CEN 位)。
5 e+ Q$ m% t5 f2 r( j对于 OPM 这一位,默认值是 0,即更新事件发生时计数器不被停止。所以如果成 OPM=0,则相应的波形如下图所示:
# h9 U. |: R& q* M) V/ P) ^9 `* X3 [3 h' I
7 z1 q" b$ A" C+ D" t; }

% ?# y4 d/ P( `. [即受到外部触发信号的上升沿后,产生的不是一个脉冲,而是多个脉冲,即 PWM 的波形。从另一方面来说,如果 OPM=0,外部的触发信号也就在第一次上升沿的时候用于触发其他通道输出。之后,由于 OPM=0,即计数器不停止,则会一直输出PWM 波形。, {( V0 }" x" q

# K+ u" h4 Z0 c% D" ]  y我们接下来看其他的寄存器配置:, B4 I5 }# I1 \: M2 }$ n

3 S  a1 k1 `" r  j: \" B% y. X6 q AIR)8LQZ_B`_62@721F4[2N.png ! V4 p- L5 P/ n2 B

& V+ n' F2 b+ [' z7 dSMS = 0x06,从模式选择位,设置为触发模式,在触发 TRGI 出现上升沿时(但未被复位)计数器启动,只有计数器的启动是受控的。- F; o  F6 |% c" A+ P
TS = 0x06,触发选择,设置的是被过滤的定时器输入 2(TI2FP2)。  c/ A' l3 w6 N. V9 T" D! O2 ?
* @5 j/ `& t3 p3 M7 M( Q
5M3{Y2Z@ALF$)PCZJPVMCIG.png
4 R! J& F# W; Y/ A. L; S4 c
2 f: x* W" e# S. N$ TIC2S(CC2S) = 0x01,设置的是 CC2 通道被配置为输入,IC2 映射到 TI2 上;
- J+ Q* g7 w8 n- f( M  R
* h4 E/ h5 b8 B" L SSTDIJ]Y42IT@%NCB4{5HW6.png - E4 r: S+ O/ B: G
6 {8 ^+ L, O* e+ t
CC2P = 0x00,设置的是 0,表示无反转,IC2 上出现上升沿时发生捕获。
& X1 s7 P, O/ a5 _; s所以结合下图,最终的结果是,选择的 TIM4_CH2 作为触发输入,其上升沿发生捕获,用于启动 TIM4。TIM4_CH2 的引脚对应的是 PB7。
. P, H. J2 I9 C% r. Q5 G7 c在程序中,配置的单脉冲模式,TIM4_CH1 用于输出,对于其的初始化如下图的代码,这儿并没有类似的
  U+ t2 b  D4 z6 B" ~; d$ ~* hTIM_OCInitStructure.TIM_Channel = TIM_Channel_1;的语句,相应的 TIM_OC1Init,这个函数名就是相应的初始化channel_1,如果 TIM_OC2Init 则是初始化 channel_2。7 H7 o8 ^/ p  Y  p2 P
) {/ S' U* n5 a& _
ZSOY56G_CWP_[0F}3%SEJ7H.png
8 i& q/ E! {' Y% U) w  ]. m7 j0 Y! u- K( h# ?( Q7 W$ m" X8 _* n
下图的波形时运行源程序,OPM=1 的情况下的波形,因为 OPM = 1, 在下一次更新事件发生时计数器将停止计数(清零 CEN位)。所以只会看到一个脉冲。7 g- o* {& ?" j( y: y! H! o; t& b" Q

0 B8 ?* a2 X; @! o) D 0(2QNET2WTJQO7DTBYF0~V0.png ; b& R+ |" V8 L3 E( R% ]% H

/ L$ z6 t) t0 G5 [上面黄色的线表示 PB6,TIM4_CH1; 红色的是 PB7,TIM4_CH2;
' \/ c2 o* t2 r* z9 `; O) [# q4 @, k测量后发现,黄色的脉宽宽度是 2.1ms,符合描述。
2 H9 i( T; e" \7 E& K! [# I- B# V! i! M" T2 a, b0 R( c% b
U}O$A(ON1)E{@(`64L`AU.png - E' \+ l' k9 ]9 h, j

$ p$ \% ?' W, M8 U; b, t E`C7531NP8B1]VN]$C7WE.png 8 L. j6 C) ?' w1 I* o

5 @) U# s/ L4 Q$ M9 y对于单脉冲,也可以同时触发几路的输出:
) y6 K7 {* M" c" t9 Z原因如下图:1 s- c7 K, ]5 o% `
; Y: d* c0 A/ z- R8 d' I
_}H~QL9R0HHVOX1M]TT$_70.png 3 U$ k0 Z3 a, n% ~

$ t$ a( v& U% h  h6 @6 ?1 }" ^在一般的单脉冲模式中,设置的是,TIMx_SMCR 寄存器中的 SMS 从模式选择位,其中的触发模式,是在触发 TRGI 出现上升沿时(但未被复位)计数器启动,只有计数器的启动是受控制的。注意这里控制的是计数器的启动,所以从一点上说明了可以同时输出几路波形的可能性。
1 R2 L9 D% l* g( V! l, l# y另一面,从上图的框架中可以看出, 作为定时器通道本身的触发输入,可能的只有两个:TI1FP1 和 TI2FP2,即 TIMx_CH1和 TIMx_CH2 作为触发输入源的选择。就是输入。
0 u  g6 g+ y0 e# T; `对于输出,按照上面的框图,由于选择了 TI1FP1 或 TI2FP2,接下来走的路径是:Reset,Enable,up\down,Count----> CK_PSC,开始捕捉 CNT,从 CNT 框框中往下的箭头,对于 TIMx_CH1, TIMx_CH2, TIMx_CH3, TIMx_CH4,是并行的,也
- k3 W/ k- o6 H: a1 y) e就是可以同时输出几路的波形。# m' v7 X7 N3 P1 j# F; F* A2 `! k# k
理论上是可以的,那么实际呢,只要在初始化一路通道,波形测试如下,也是可以的。- j. l7 h0 a: Z7 O7 T
! v7 e1 W5 H1 G7 h7 q

& f% m9 }$ v9 n; O: p UZ~]PXSO77RJ7I_LNMA%~RR.png 0 H" N" f- f' H" T: h3 m
收藏 评论0 发布时间:2022-2-24 21:33

举报

0个回答

所属标签

相似分享

官网相关资源

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