尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

STM32G4 HRTIM中CMP2与复位时序的关系解析

STM32G4 HRTIM中CMP2与复位时序的关系解析 搞STM32G4系列的人早晚会在RM0440的Figure 232这里停下来发一会儿呆。图上又是计数器锯齿波又是HRTIM_CHx2输出波形中间竖着一条标注CMP2的虚线和一段Reset Timing的标记乍一看挺像那么回事但真要照着配置写代码问题就来了这个CMP2标签到底表示什么它和HRTIM_CHx2的复位时序到底是不是同一个时刻先说答案的一半——CMP2标签通常只代表比较事件发生的时刻而“复位”是一个可以被配置由它触发的动作。两者能不能对齐完全取决于你的寄存器配置。这篇文章会把这张图的读法、背后的HRTIM事件机制、以及我实测过程中的验证方法一次性说清楚希望能帮你少走弯路。1. CMP2标签和复位时刻为什么这张图这么容易让人误解1.1 你卡住的那个点大概率是什么先还原一下典型的卡壳现场。你在配置HRTIM产生某路PWM时参照RM0440的Figure 232发现图上某一列虚线上标注了“CMP2”而相邻或者相隔一段距离的位置上又有一个“Reset Timing”的标记。图下方的HRTIM_CHx2输出波形中下降沿落在Reset Timing附近而不是CMP2标签附近。这时候你心里开始犯嘀咕CMP2比较值到了之后输出不是应该立刻复位吗为什么复位沿没有和CMP2标签对齐这个疑问非常普遍尤其是刚从PWM外设比如高级定时器TIM1/TIM8转过来的人更容易绕进去。在普通定时器里比较匹配和输出翻转的因果关系很直观CNT到了CMPx输出就变了。但HRTIM不一样它的事件系统是“广播制”——比较事件产生之后要去触发什么动作完全由另一套寄存器决定。图上画出来的CMP2标签只是告诉你“此刻发生了一次比较事件”它不等于“此刻输出被复位了”。这就是误解的根源。1.2 HRTIM里其实有两套“复位”概念在聊Figure 232之前必须先把术语对齐。HRTIM相关手册里出现“Reset”这个词可能指两种完全不同的东西概念作用对象触发结果典型配置寄存器计数器复位Counter ResetCNT计数器计数器清0重新从0开始计数影响时基周期RSTRReset Trigger寄存器输出复位Output Reset输出引脚电平输出回到无效电平相当于PWM的关断沿SET1R/SET2R、RST1R/RST2R输出Set/Reset源选择标题里的“HRTIM_CHx2 Reset Timing”指的几乎可以确定是“输出复位”这一层——也就是CHx2这一路输出被拉回到无效电平的时点。它跟计数器复位是两码事虽然触发它们的源可以一样。这两套机制平时各自独立工作计数器复位了输出不一定复位输出复位了计数器也不一定清零。只有当你把同一个事件比如CMP2匹配同时配给两条路径时它们才会在同一个时刻一起动作。所以读图的时候先问自己你盯着的是哪个“复位”1.3 时序图上的标签和动作其实隔着一层配置关系HRTIM时序图有个特点它是静态的不可能把所有寄存器配置路径都画出来。图上每个事件标签CMP1、CMP2、PER等本质上是“源”而Reset Timing、Set Timing这类标记才代表“动作”。从源到动作之间隔着的是你在RSTR、SET1R、RST1R这些寄存器里写进去的0和1。手册画图的时候为了把原理讲清楚常常会把“源”和“动作”画在同一张图里但不会每一个都用文字标注清楚的“这个CMP2标签意味着CMP2事件被使能复位”之类的说明。所以你会看到CMP2标签和复位标记错开这不是手册画错了而是因为那张图典型配置下CMP2根本就不是复位源。2. 一次CMP2匹配在HRTIM内部到底发生了什么2.1 比较器匹配的硬件瞬间要彻底搞清楚CMP2标签的含义得看硬件层面比较事件是怎么产生的。HRTIM的每个定时器单元Timer A到Timer F都有一个独立的16位向上计数器CNT每个HRTIM时钟周期硬件比较器都会把CNT和CMP1、CMP2、CMP3、CMP4以及PER寄存器做一次相等比较。这个过程是实时的、每个周期都在进行的。当CNT的值恰好等于CMP2寄存器的写入值时比较器会“命中”产生一个宽度为单个计数时钟周期的内部事件脉冲。这个脉冲就是图232里CMP2标签所指的时刻——它不是电平不是状态而是发生在某一瞬间的事件。2.2 事件脉冲的“下游”有三个方向这个事件脉冲产生之后会同时广播到HRTIM内部的三个逻辑模块由各个模块决定是否响应第一个是输出控制单元。它通过SET1R/SET2R和RST1R/RST2R寄存器判断“CMP2匹配要不要让某个输出置为有效电平”或“要不要让某个输出回到无效电平”。如果RST1R里CMP2位为1那么CHx2输出就在这个事件脉冲到来时被复位。如果只有SET1R里CMP2位为1那这个脉冲会变成CHx2的置位沿。第二个是计数器复位逻辑。它通过RSTR寄存器判断“CMP2匹配要不要把CNT清零”。这里的使能独立于输出控制。很多初次接触的人以为CMP2匹配天然会清零CNT其实不是HRTIM的计数器复位默认只由周期事件PER匹配触发其他事件想充当复位源必须显式配置。第三个是事件路由模块负责把CMP2事件扩展成中断、DMA请求、ADC触发、甚至跨定时器的同步信号。这个模块和波形时序关系不大但经常被忽略偶尔会干扰调试。这三个下游模块各有各的使能开关互相独立所以同一个CMP2事件同时触发输出复位、计数器复位、ADC采样三种动作是完全可行的也可以只触发其中一种甚至一个都不触发。2.3 CMP2事件的三种典型角色为了更直观我把常见的CMP2角色整理成一个表格方便对照场景CMP2的角色输出Set/Reset配置计数器复位配置波形表现移相PWM输出置位源SET1R使能CMP2不使能PER复位CHx2上升沿在CMP2处下降沿在PER处输出复位源输出复位源RST1R使能CMP2不使能PER复位CHx2下降沿在CMP2处CNT周期仍为PER计数器复位源时基周期截断不使能RSTR使能CMP2CNT在CMP2处回0波形周期缩短为CMP2值这三个角色可以任意组合。比如你既想让CMP2触发输出复位又想让CNT在CMP2处归零那就在RST1R和RSTR都使能CMP2。图上就会看到输出下降沿和计数器回零点都在CMP2标签这一列。3. 回到Figure 232怎么读CMP2标签和Reset Timing的关系3.1 一张标准HRTIM时序图该怎么读我个人的读图习惯是先忽略所有颜色和装饰性的箭头只找四样东西第一找到锯齿波那是CNT。一段完整的锯齿波从0上升到PER再回0就是一个计数周期。第二找到周期边界通常是一条贯穿整个周期的虚线或者阴影区旁边标着PER或者Cycle。第三找到所有竖线标签CMP1、CMP2、CMP4这些它们代表事件发生的横向时刻。第四看输出波形也就是图里HRTIM_CHx2信号注意它的上升沿和下降沿分别落在哪条竖线附近。输出波形上沿对齐的是置位事件下沿对齐的是复位事件。你把输出沿对齐的标签看明白了这张图讲的什么基本就清楚了。而Figure 232这个大场景下读者最常问的CMP2标签问题本质就是“输出下降沿没有落在CMP2标签上”这个表象。3.2 三种情况下CMP2标签和复位标记的对应关系情况ACMP2没有被配置为任何复位源。这时候图上CMP2标签只代表“CNT到达CMP2值”这个时刻输出波形在该处没有变化真正的复位发生在周期边界PER那边。如果图里Reset Timing标在周期边界附近而CMP2标在中间那就是这种配置。注意这是Figure 232最可能出现的情况——因为手册要展示的往往是通用结构而不是某个特定配置。情况BCMP2被配置为输出复位源。此时CMP2标签和CHx2的下降沿输出复位时刻严格对齐。如果你看到图中CMP2标签处恰好有一条输出下降沿那基本可以断定CMP2承担的就是输出复位角色。但此刻计数器可能没有复位锯齿波依然走到PER才回0。情况CCMP2被配置为计数器复位源。这时候有个非常显眼的特征——锯齿波在CMP2处就提前落下来了而不是走到PER。计数器波形会在CMP2标签位置形成一个提前回0的“小缺口”整个计数周期也随之变成CMP2值。这种图在展示移相或者变频应用里很常见。三种情况叠加到一张表格里配置CMP2标签处锯齿波CMP2标签处CHx2输出周期边界处CHx2输出复位标记位置未使能CMP2复位正常上升无动作下降沿周期边界CMP2输出复位源正常上升下降沿如果有置位源则上升沿CMP2标签处CMP2计数器复位源提前回0无动作或根据SET/RST配置无周期边界CMP2标签处3.3 从标题反推Figure 232要表达什么这次的标题是“Question regarding RM0440 Figure 232: HRTIM_CHx2 Reset Timing vs CMP2 Label”关键词集中在“Reset Timing vs CMP2 Label”这个对比上。这意味着你看到的图上CMP2标签的位置和Reset Timing的位置很可能并不重合。根据前面讲的机制基本可以推出图里展示的典型配置下CMP2事件并不是CHx2输出复位的驱动源。复位更可能由周期匹配触发所以Reset Timing标在周期边界附近而CMP2标签只是辅助观察比较事件位置的参照线。你如果想确认可以打开Figure 232前后几页的文字描述找找有没有类似“the counter is reset at the end of the period”或者“when CMP2 event occurs”这类句子。手册在每张时序图前后通常会有一段解释把那段话读明白了比盯着图猜要好得多。4. 拿寄存器配置验证复位时刻到底听谁的4.1 最小验证工程怎么搭讲了一堆理论还是得实际动手验证一下才踏实。我建议你拿一块STM32G474核心板做最小验证用不到CubeMX生成复杂的工程直接在裸机代码里操作寄存器就行。初始化步骤很简单第一步使能HRTIM1时钟和GPIO时钟把某个定时器单元的输出引脚复用为HRTIM功能。第二步配置HRTIM定时器基本时基设置PER寄存器为1000CMP2寄存器为600。第三步打开CMP2比较器使能位再根据要验证的配置设置RSTR、SET1R/RST1R。最后启动定时器输出。GPIO引脚和定时器单元的对应关系不同封装不一样建议查你自己板子的原理图和RM0440引脚定义表。我用的G474板子里Timer A的CH2输出在PA8这个比较常见。4.2 三种配置的代码级对比写三段配置代码分别对应前面说的三种情况。第一种CMP2不参与任何复位输出复位由周期事件驱动// 计数器复位源仅保留周期复位默认 HRTIM1-sTimxRegs[0].RSTR HRTIM_TIMRSTR_PER; // 输出Set/Reset源CMP2作为输出置位源周期作为输出复位源 HRTIM1-sTimxRegs[0].SET1R | HRTIM_TIMSET1R_CMP2; HRTIM1-sTimxRegs[0].RST1R | HRTIM_TIMRST1R_PER; // 使能比较器2 HRTIM1-sTimxRegs[0].CR | HRTIM_TIMCR_CMP2EN;第二种CMP2作为输出复位源计数器仍在周期点复位// 计数器复位源周期复位 HRTIM1-sTimxRegs[0].RSTR HRTIM_TIMRSTR_PER; // 输出Set/Reset源CMP2作为输出复位源 HRTIM1-sTimxRegs[0].SET1R | HRTIM_TIMSET1R_PER; HRTIM1-sTimxRegs[0].RST1R | HRTIM_TIMRST1R_CMP2; HRTIM1-sTimxRegs[0].CR | HRTIM_TIMCR_CMP2EN;第三种CMP2作为计数器复位源// 计数器复位源CMP2事件触发复位 HRTIM1-sTimxRegs[0].RSTR HRTIM_TIMRSTR_CMP2; // 输出Set/Reset源周期置位CMP2复位这时CMP2同时管计数器和输出 HRTIM1-sTimxRegs[0].SET1R | HRTIM_TIMSET1R_PER; HRTIM1-sTimxRegs[0].RST1R | HRTIM_TIMRST1R_CMP2; HRTIM1-sTimxRegs[0].CR | HRTIM_TIMCR_CMP2EN;注意寄存器位名在不同系列、不同手册版本里可能略微不同写代码之前对照你手头RM0440的寄存器描述把位定义确认一遍。上面的写法是G4系列常见的命名但以手册为准永远没错。4.3 用逻辑分析仪看波形对应手册图代码烧进去之后用逻辑分析仪同时抓CHx2输出和定时器周期事件引出的测试信号或者直接用调试器看CNT的值变化观察三种配置的差异。第一种配置实测出来锯齿波周期恒定为1000计数周期CHx2的上升沿在600附近下降沿在1000周期边界附近。CMP2标签在600的位置Reset Timing在1000的位置两个时刻明显错开这正是Figure 232里最常规的“CMP2标签与复位分离”的画面。第二种配置实测出来CHx2的下降沿从1000前移到600附近和CMP2标签对齐但CNT的计数
返回列表