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

高精度定时器中single-shot计数模式不工作

[复制链接]
STMCU小助手 发布时间:2023-2-14 18:14
1. 问题提出 客户使用 STM32G474 的高精度定时器,基于 CubeMX 进行外设配置与代码生成,将某个子定时器的计数方式设置为 retriggerable single shot 方式,发现该子定时器无 PWM 输出,在调试模式下发现该子定时器的计数器一直为 0,即计数器一直没有启动,但如果将计数方式修改为continuous 模式,其他保持不变,定时器工作正常。
- I, S4 g5 r: @4 q- o5 w, v( b+ s! g3 G

4 {8 }/ `' l( B2. 问题分析 , y1 J8 u% S1 \
检查客户提供的 CubeMx 配置文件,客户使能了 Master Timer 与 Timer B,Master Timer 的比较器事件 2 触发 Timer B 复位与运行,并配置了 Timer B 的 PWM 输出,使用该工程文件直接生成代码,并添加高精度定时器计数使能与输出使能函数,如下:
4 q  |( P1 K6 I+ T5 [5 p2 n* }8 }. R/ i3 n9 \
8 e; T' Y+ H' a! T7 c
~9GT_LPBM4{6HLNG}%)4J9S.png ! O' w2 G9 Y& M" k5 u& ?: ~' t

3 I7 i: r1 K  B9 v0 y8 c2 h+ Z

# L$ R# `3 g( z+ J0 d进入调试模式观察,发现 Master Timer 正常计数,但是 Timer B 的计数器一直保持 0,按照客户的描述,将 Timer B 的计数方式修改为“continous”后,Timer B 恢复正常计数。对比 TimerB 在“retriggerable single shot”与“continous”两种工作模式下的相关寄存器的值进行对比,发现除了计数模式不同之外,其他所有的状态都相同。
0 U- e1 V# U) g+ Z) T莫非真是“retriggerable single shot”存在问题?这明显不可能,此前多次使用过该模式并没有发现问题,于是将以前设计的能成功工作的例程拿来与该“问题”工程进行对比。经过比对分析发现,工程配置中使用的寄存器更新方式存在不同,如下图所示:
1 F' s2 X, P  R) H9 }2 d7 D' j' z# G- N0 q

) I) z0 Q3 ^& O! {! J; A X20{QX0M_SMAM$)3VO8}@10.png . P' \, O3 V. l' A2 ]' @: M7 C- s
( W8 C8 }, g/ M) q8 |

$ V5 e% N% p# D2 t; Q0 U“问题”工作工程中的寄存器更新配置  “问题”工程配置中使用 Master timer 的更新事件作为触发寄存器更新触发源,并且更新要等到本定时器的下一次的 Reset/Roll-over 事件出现时才生效。通过将“Update taken into account on the following Reset/Roll-over event”修改为“Update taken into account immediately”,定时器也可以正常运行了,问题的原因就是由于该配置引起的。 * @7 k) D3 K7 D0 X' b* E
查看该配置对应的寄存器说明:
! T- v8 K; W) R
1 y2 l3 E) }# D) F1 S+ c$ X

' S8 L& b% r. ?- M ]PI~YJ6XWTHXYZ30D]R3@YE.png
% y7 K$ p& f: g* M$ B' y; J. O$ y2 e0 h
. {  g- \: A) F$ ]
当配置“Update taken into account on the following Reset/Roll-over event”对应于该位置“1”,即更新事件,无论是来自相邻定时器的还是软件产生的,都需要等到下一个 Reset/Rollover event 才生效。 * `6 }  `4 c' d) h" s" N
在直接使用 CubeMx 产生的 HAL 底层配置代码且配置中使能了预加载的情况下,该寄存器更新配置方式会导致 Timer B 的初始化配置无法生效。 ) [' T7 y) Z# ]
如图 3/4/5 所显示的,因为在 CubeMx 直接生成的代码中,Timer B 参数的配置通过调用函数HAL_HRTIM_WaveformTimerConfig()写入寄存器,然后在该函数中调用软件更新函数HRTIM_ForceRegistersUpdate()的方式让配置生效,那么在目前的配置下,软件触发更新也必须等待 Reset/Roll-over event 的出现。而在 retriggerable single shot 计数模式下,定时器不能自动启动计数,必须等待来自 Master Timer 的 Reset 事件(即前文提到的比较器事件 2)。& D' U5 T0 R1 q+ V# `
) e, v8 h, a; _3 Z2 v. Q$ X+ p
, g6 k/ p# Q9 v7 F5 E5 t; ]- }0 f8 h
2%B{SS7~U3Z~]`T0(X~O8PB.png
# a% ?0 d6 X  O# B. [& T, @
1 b3 T) U7 {* F0 i2 j9 W A)%L0VGNL2L[AR4S[~O98$H.png 8 X$ b# g. Y' R  C. K# Q+ h

; p4 P* i2 ^; Q

% Y3 @) F3 Y# _4 p- w, v综上,虽然正确的配置了 Reset 事件,Master Timer 也正常计数且产生了比较事件 2,但问题在于在运行了初始化代码后,该配置仅仅是写到了 preload 寄存器中,而没有写入 active 寄存器中,即 Timer B 的复位源没有生效,带来的后果就是 Timer B 的计数器不运行,一直保持 0,且所有带有预加载特性的寄存器的值也没有生效。% Y9 R# R  u! h$ `7 j5 G
作为对比,当配置为“Update taken into account immediately”时,调用软件触发更新函数HRTIM_ForceRegistersUpdate()函数,将使所有配置立即生效,定时器可正常工作。; Y$ b" N/ \+ m6 a6 T- P1 I* Q( n
' o  v4 I. ]( N7 o+ _, S- f, `

7 g# m+ o: o' U2 }完整版请查看:附件 高精度定时器中single-shot计数模式不工作_V1.0.pdf (311.73 KB, 下载次数: 2)
赞 收藏 评论0 发布时间:2023-2-14 18:14

举报

0个回答

所属标签

相似技术帖

官网相关资源

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