|
问题1:在使用STM32通用或高级定时器的比较输出时,如果采用中心对齐计数模式做PWM输出,并使用比较事件作为ADC的触发启动。那么,在一个完整的计数周期内,可能发生2次比较事件,想知道如何确定使用哪次比较事件进行触发呢?换句话说,是否可以对比较事件进行选择配置?答案是肯定的。 : I: R' b% s/ i# x P4 ]/ y ! p: Z5 u' `; R, a$ G# { 下图是采样中央对齐计数模式,PWM mode 1的PWM输出情形。ARR=8,CCR=4. : W' u6 L \; R$ F3 q5 | 5 f( M) p Q' g# w
4 p6 y& H' j2 U* |8 M' O' | 4 F+ g" |; b1 F6 _$ H; B 在上面的应用情况下,比较事件可能发生在CNT与CCR第一次匹配时,即发生在向上计数阶段,也可能发生在CNT与CCR第二次匹配时,即发生在向下计数阶段。到底发生在哪个阶段,取决于相关控制寄存器的配置,这里跟寄存器TIMx_CR1中CMS控制位有关。 1 i9 k( Z! q8 j& I. L
+ P" n: @0 s6 ~6 s
从该寄存器CMS控制位的描述不难看出,在计数器使用中心对齐计数模式做比较输出时,比较事件的发生是可以选择的。可以仅仅发生在向上计数阶段或向下计数阶段,也可以配置为上下两个计数阶段都产生比较事件。这点可以结合上面图形的箭头提示加以认知和理解。【CcxIF为相应通道的比较事件标志位】2 H6 {7 _. {, {4 C8 L7 T 6 \: C8 i v7 \3 y 问题2:有人反馈,在定时器的溢出中断里打断点时,发现更新中断标志无法被清零,可用户在中断服务程序中实实在在的有对更新事件标志实施清零操作。5 C4 ?* @+ g. r: ^: w. O: e 其实,并不是没法对更新事件标志清零,这只是种误解。原因是尽管此时客户在清零操作后的代码处打上了断点,但由于定时器并没有停止计数,如果再加上溢出周期较短。程序刚做完清除操作并停止在定时器中断服务程序断点后,由于定时器还在持续计数而产生新的溢出更新事件,令更新事件标志再次被置位,这样给人以更新事件标志没法被清零的错觉。/ f+ a- z! J1 Z- _) E * `7 k0 e9 s: h$ ~* I! U: n$ C 3 \7 h, L; t1 w 对于调试状态下定时器的计数动作是可以软件配置选择的,即当程序运行到断点后,定时器是继续计数还是暂停下来可用户软件配置决定,【这里的定时器不仅仅指常规定时器,还包括看门狗】。 % X9 O4 m7 |" j R0 `
2 X/ c# @6 P' l% S3 x0 I7 c' F8 X + i2 g0 a# @) Q/ d" A3 \
) f( b7 P/ H7 K2 b/ d/ } # _5 B. _# `% u7 q u; u 具体到上面案例,如果希望在断点处计数器暂时不要计数,我们可以软件上做相应配置。这里涉及到寄存器DBGMCU_CR,让相关定时器在调试状态遇到断点时暂停计数。1 j$ p. {! G$ `$ P Q7 T/ E " T& i( k8 C% t1 X
# O: ~1 T3 l3 E 5 d. G9 _3 k8 @4 B5 M/ p( a
/ @5 q2 C5 c+ s! v/ B |
| 支持好分享 |
| 还没有试过 |
| 支持好分享 |
微信公众号
手机版