TI C2000 eCAP模块深度解析:从高精度捕获到无毛刺PWM生成

TI C2000 eCAP模块深度解析:从高精度捕获到无毛刺PWM生成
1. 项目概述与eCAP模块核心价值在嵌入式实时控制的世界里时间就是一切。无论是精确测量电机编码器的脉冲间隔还是生成驱动开关电源的PWM信号其核心都依赖于一个能够精准“感知”和“创造”时间的硬件单元。很多工程师初接触这类需求时可能会尝试用通用定时器配合中断和软件计算来实现但很快就会发现在高频信号或对实时性要求严苛的场景下软件开销和中断延迟会成为性能瓶颈甚至导致测量失真或控制失稳。这时像德州仪器TIC2000系列微控制器中集成的增强型捕获eCAP模块这样的专用外设其价值就凸显出来了。它不是一个简单的计数器而是一个高度集成、高度自动化的“时间处理器”。你可以把它想象成一个拥有独立大脑和精密秒表的哨兵。在捕获模式下它能自动记录外部信号四个特定边沿上升沿或下降沿发生的精确时刻时间戳完全无需CPU干预解放了CPU去处理更复杂的控制算法。而在APWM模式下它又能摇身一变成为一个高分辨率、带影子寄存器的PWM发生器确保你在运行时更新占空比或周期时波形不会出现毛刺。我最初接触eCAP是为了做一个无刷直流电机的转速测量。用普通GPIO中断测频在高速时误差很大。改用eCAP后不仅测量精度达到了纳秒级CPU占用率也几乎降为零。这让我深刻体会到用好这类硬件加速模块是从“能实现功能”到“能稳定、高效、精确实现功能”的关键一步。本文将结合手册原理和实际项目经验为你彻底拆解eCAP的捕获模式与APWM模式让你不仅知道怎么配置更明白为什么要这样配置以及在实际项目中如何避开那些手册上没写的“坑”。2. eCAP模块整体架构与工作模式解析要驾驭eCAP模块绝不能把它当成一堆零散寄存器的集合。我们必须先建立起一个清晰的顶层视图理解其内部数据流和控制逻辑。整个模块可以看作围绕一个核心——32位时间戳计数器TSCTR——构建的两套独立但又共享资源的系统一套用于“捕捉”外部世界的时间捕获模式另一套用于“塑造”输出波形的时间APWM模式。2.1 核心引擎32位时间戳计数器TSCTR与相位控制TSCTR是整个模块的心跳。它由一个32位的向上计数器构成时钟源通常来自系统时钟SYSCLK或其分频。32位的宽度意味着在150MHz的系统时钟下其计数周期超过28秒足以满足绝大多数高精度定时需求。它的工作非常简单不停地从0向上累加到达最大值0xFFFFFFFF后溢出归零并置位溢出标志。但光有自由运行还不够在多个eCAP或ePWM模块需要协同工作时例如多相电机控制同步至关重要。这就是CTRPHS计数器相位偏移寄存器和同步逻辑的作用。你可以将CTRPHS看作TSCTR的一个“预备值”。当发生同步事件SYNCI可以是外部引脚信号或软件强制同步时CTRPHS中的值会立刻加载到TSCTR中。这就允许你让一个eCAP模块的计数器从0开始而另一个从1000开始从而实现精确的相位差控制。这个特性在APWM模式下构建交错式电源拓扑时极其有用。2.2 两副面孔捕获模式与APWM模式的本质区别模块通过ECCTL2[CAP/APWM]这个关键位来决定当前扮演哪个角色。这不仅仅是功能切换更是内部资源的一次重大重新分配。在捕获模式CAP/APWM 0下引脚功能配置的GPIO引脚作为输入用于检测外部信号边沿。核心资源四个32位的捕获寄存器CAP1, CAP2, CAP3, CAP4全部用作“快照存储器”。当指定的边沿事件发生时当前TSCTR的值被自动锁存到对应的CAPx寄存器中。计数器行为TSCTR可以配置为在特定捕获事件后复位用于测量脉冲宽度或一直自由运行用于记录绝对时间戳。目标精确测量时间间隔、频率、占空比。在APWM模式CAP/APWM 1下引脚功能配置的GPIO引脚作为输出用于产生PWM波形。核心资源寄存器角色发生转变。CAP1和CAP2变成了活动周期寄存器APRD和活动比较寄存器ACMP直接参与和TSCTR的比较以生成PWM。CAP3和CAP4则成为它们的影子寄存器用于安全地更新参数。计数器行为TSCTR在计数值等于周期值APRD时自动复位形成一个标准的递增计数PWM时基。目标生成高精度、可实时无毛刺更新的PWM信号。理解这种“角色扮演”是正确配置寄存器的前提。例如在APWM模式下你向CAP3写入值是想更新周期但这个值不会立即生效而是先放在影子寄存器里等待一个安全的时机如计数器归零时才加载到活动的CAP1中从而避免PWM波形中间出现断裂。2.3 关键控制逻辑从事件输入到寄存器加载无论是哪种模式都离不开一套精巧的事件处理流水线。以捕获模式为例一个外部信号要成功转化为寄存器中的一个时间戳需要经历以下关卡事件预分频器对于频率非常高的输入信号可以先进行分频N2,4,6,...,62。这就像给高速摄像机加了一个减光镜防止它“过曝”。通过ECCTL1[EVTPS]配置。边沿极性选择每个捕获事件CEVT1-CEVT4都可以独立选择在上升沿还是下降沿触发。这是通过ECCTL1[CAPxPOL]位配置的。例如你可以设置CEVT1为上升沿CEVT2为下降沿来测量一个脉冲的高电平时间。模4计数器与序列器这是一个2位计数器决定下一个到来的合格边沿事件应该加载到哪个CAP寄存器1,2,3,4依次循环。它确保了事件的顺序性。你可以通过ECCTL2[STOP_WRAP]设置它在连续模式下循环如1-2-3-4-1...或在单次模式下在捕获指定次数后停止如仅捕获前2次事件后冻结。加载使能与计数器复位ECCTL1[CAPLDEN]位是总开关打开后时间戳才能加载。而每个事件都可以独立配置是否在捕获后复位TSCTRECCTL1[CTRRSTx]。如果开启则CAPx中存储的是从上次复位到本次事件的时间差差分模式如果关闭存储的则是事件发生的绝对计数值。这套流水线保证了硬件处理的自动化和高可靠性软件只需要在适当的时候如捕获完成产生中断后去读取CAP寄存器中的值即可。3. 捕获模式深度剖析与实战配置捕获模式是eCAP的看家本领其设计初衷就是为了实现高精度、低CPU开销的时间测量。我们通过一个完整的实战场景来理解它测量一个方波信号的频率和占空比。3.1 应用场景与配置策略假设我们需要测量一个频率约1kHz占空比可变的方波。我们计划用CEVT1捕获上升沿CEVT2捕获下降沿CEVT3捕获下一个上升沿。这样CAP2-CAP1就是高电平时间CAP3-CAP2就是低电平时间CAP3-CAP1就是整个周期。我们采用差分模式让计数器在每次捕获后复位这样CAP寄存器里直接存储的就是时间间隔省去了软件做减法的步骤。配置步骤如下引脚与时钟初始化将对应的GPIO引脚配置为eCAP功能输入。确保eCAP模块的时钟已使能。停止并复位计数器在配置前先将ECCTL2[TSCTRSTOP]设为0停计数器并可选择将TSCTR和CTRPHS寄存器写0。配置捕获参数ECCTL1CAP1POL 0(CEVT1上升沿触发)CAP2POL 1(CEVT2下降沿触发)CAP3POL 0(CEVT3上升沿触发)CTRRST1 1(CEVT1捕获后复位计数器)CTRRST2 0(CEVT2捕获后不复位)CTRRST3 1(CEVT3捕获后复位计数器为下一个周期做准备)CAPLDEN 1(使能捕获加载)PRESCALE 0(输入信号1kHz频率不高无需预分频)配置操作模式ECCTL2CAP/APWM 0(设置为捕获模式)CONT/ONESHT 0(连续模式持续捕获)STOP_WRAP 3(模4计数器在4个事件后归零因为我们用了3个事件设置到4确保循环)SYNCI_EN 0(本例不需要外部同步)配置中断使能ECEINT寄存器中的CEVT1、CEVT2、CEVT3中断。通常我们更关心一个完整周期的结束所以可以主要处理CEVT3中断。启动计数器将ECCTL2[TSCTRSTOP]设为1计数器开始运行。中断服务程序ISR在CEVT3中断中读取CAP1, CAP2, CAP3的值。由于工作在差分模式且CTRRST1/3使能我们有高电平时间T_high CAP2低电平时间T_low CAP3 - CAP2(注意CAP3是第二个上升沿的捕获值此时计数器从0开始计到了这个值)周期T_period CAP3频率Freq SYSCLK / T_period占空比Duty T_high / T_period读取后必须清除对应的中断标志位ECFLG中的CEVT3和全局中断标志ECFLG[INT]通常通过向ECCLR寄存器的对应位写1来完成。3.2 单次模式与连续模式的抉择连续模式CONT/ONESHT0就像一台自动运行的录像机模4计数器循环往复0,1,2,3,0,1...捕获事件不断覆盖CAP寄存器除非用DMA搬走。这适用于需要持续监控信号的场合比如实时转速反馈。单次模式CONT/ONESHT1则像拍一张照片。通过STOP_WRAP设置拍几张1-4次。例如设为EC_EVENT2则模块在捕获完CEVT1和CEVT2后模4计数器会停止CAP1和CAP2的值被冻结不再被后续事件覆盖。这对于捕获一个特定的事件序列非常有用比如测量一个已知的、非周期性的脉冲串宽度。要开始下一次捕获必须通过软件向ECCTL2[REARM]位写1来重新“上膛”。实操心得中断处理与数据读取的时机在连续模式下中断产生和寄存器被新值覆盖是异步的。一个常见的坑是中断产生后如果你在ISR中读取CAP寄存器的速度太慢而输入信号频率很高可能在你读完之前下一个周期的事件已经发生并覆盖了寄存器值。对于高速信号有两种策略1) 使用DMA在每次捕获事件时自动将CAP寄存器的值搬运到安全的RAM缓冲区2) 在ISR中第一时间将CAP寄存器的值拷贝到局部变量中再进行计算。绝对避免在ISR中进行浮点运算等耗时操作。3.3 差分模式与绝对模式的原理与计算这是捕获模式中理解时间值含义的关键。绝对模式CTRRSTx0TSCTR一直自由运行。CAPx中捕获的是事件发生时TSCTR的绝对计数值。要计算时间间隔需要软件做减法。例如间隔 CAP2 - CAP1。前提是TSCTR在这期间没有溢出。如果间隔可能很长就需要处理计数器溢出的情况计算会变得复杂间隔 (CAP2 - CAP1) 0xFFFFFFFF如果CAP2 CAP1且无溢出如果CAP2 CAP1则说明发生了溢出需要加上2^32。差分模式CTRRSTx1在特定捕获事件后TSCTR自动复位为0。那么下一个捕获事件发生时CAPx中存储的就是从上一次复位到当前事件的时间间隔。这样每个CAP寄存器里的值本身就是一个时间差无需软件再做减法。这大大简化了计算并天然避免了溢出问题。如上文的占空比测量例子。选择哪种模式取决于应用。差分模式简单直观适合测量连续的、周期性的时间间隔。绝对模式则提供了更大的灵活性可以记录事件发生的绝对时间线适合复杂的事件序列分析但需要更复杂的软件逻辑来处理溢出和计算。4. APWM模式原理与高可靠性PWM生成当eCAP切换到APWM模式它就从一个“记录员”变成了一个“指挥家”。其核心是利用一个递增计数器与两个比较器周期比较和占空比比较来生成PWM波形。TI的eCAP在APWM模式下的设计精髓在于其影子寄存器机制这确保了PWM参数在运行中更新的平滑性与安全性。4.1 APWM模式的工作原理与寄存器映射在APWM模式下内部逻辑发生了根本性变化TSCTR行为变为递增计数在TSCTR CAP1(APRD)时复位归零。CTRPRD事件成为周期匹配信号。CAP1角色变为活动周期寄存器Active Period, APRD。它的值决定了PWM的周期。CAP2角色变为活动比较寄存器Active Compare, ACMP。它的值与TSCTR比较产生CTRCMP事件用于翻转PWM输出决定占空比。CAP3成为APRD的影子寄存器Shadow Register。CAP4成为ACMP的影子寄存器Shadow Register。输出逻辑根据ECCTL2[APWMPOL]位决定输出极性。APWMPOL0为高有效即TSCTR小于ACMP时输出高电平APWMPOL1为低有效。PWM的周期和占空比计算公式如下假设系统时钟为SYSCLKPWM周期T_pwm (APRD 1) / SYSCLKPWM高电平时间APWMPOL0时T_high (ACMP) / SYSCLKPWM占空比Duty ACMP / (APRD 1)特别注意公式中是APRD 1。因为当TSCTR从0计数到APRD时总共经历了APRD1个时钟周期。这是一个常见的理解误区手册中的波形图也明确显示了这一点。4.2 影子寄存器实现无毛刺参数更新的关键这是APWM模式最核心的机制。在电机控制或数字电源中我们经常需要在PWM运行时动态调整占空比或频率。如果直接写入活动的CAP1或CAP2寄存器而写入的时刻恰好发生在计数器正在与旧值比较的过程中就可能导致产生一个极窄的“毛刺”脉冲这在功率电路中可能是灾难性的。影子寄存器解决了这个问题。它提供了一个缓冲区域。初始化时你必须直接写入活动寄存器CAP1和CAP2来设置初始周期和比较值同时这个值会自动拷贝到影子寄存器CAP3和CAP4。运行时需要更新参数你则写入影子寄存器CAP3更新周期或CAP4更新占空比。那么影子寄存器的值何时加载到活动寄存器呢这由加载模式决定通过写入的目标寄存器隐含控制立即加载模式当你直接写入活动寄存器CAP1或CAP2时硬件会同时更新活动寄存器及其对应的影子寄存器。这本质上绕过了影子缓冲机制适用于初始化或对实时性要求极高且能接受潜在风险的场景。周期加载模式影子模式当你写入影子寄存器CAP3或CAP4时新值不会立即生效。它会在下一个CTRPRD事件即当前PWM周期结束计数器归零时自动从影子寄存器加载到活动寄存器。这保证了PWM波形的完整性更新发生在周期的边界实现了“无缝切换”。配置要点与避坑指南初始化顺序务必先配置模式和控制位最后再使能计数器。一个推荐的顺序是停止计数器(TSCTRSTOP0) - 设置CAP/APWM1进入APWM模式 - 配置极性等 -写入CAP1和CAP2设置初始值此时CAP3/CAP4会自动同步- 使能计数器(TSCTRSTOP1)。运行时更新若要改变占空比应只写入CAP4寄存器。例如ECap4Regs.CAP4 new_compare_value;。若要改变周期应只写入CAP3寄存器。绝对避免在运行时直接写CAP1或CAP2除非你非常清楚后果。同步与相位控制多个eCAP模块生成多路PWM时可以利用CTRPHS和同步链SYNCI/SYNCO来精确控制它们之间的相位差。例如主模块设置SYNCO_SEL为CTRPRD输出同步信号从模块使能SYNCI_EN并设置不同的CTRPHS值就能实现交错并联。4.3 实战配置一个中心对称的PWM假设我们需要在150MHz系统时钟下生成一个100kHz周期10us占空比50%的PWM并采用影子模式更新。计算寄存器值周期值APRD (T_pwm * SYSCLK) - 1 (10e-6 * 150e6) - 1 1499比较值ACMP Duty * (APRD 1) 0.5 * 1500 750基础配置// 假设使用eCAP1 ECap1Regs.ECCTL2.bit.CAP_APWM 1; // 1: APWM mode ECap1Regs.ECCTL2.bit.APWMPOL 0; // 0: Active high ECap1Regs.ECCTL2.bit.SYNCO_SEL 2; // 2: Disable sync-out (本例独立运行) ECap1Regs.ECCTL2.bit.SYNCI_EN 0; // Disable sync-in设置初始值直接写活动寄存器ECap1Regs.CAP1 1499; // 写入活动周期寄存器APRDCAP3会自动同步 ECap1Regs.CAP2 750; // 写入活动比较寄存器ACMPCAP4会自动同步启动计数器ECap1Regs.ECCTL2.bit.TSCTRSTOP 1; // 启动TSCTR计数器运行时更新占空比例如改为30%Uint16 new_cmp (Uint16)(0.3 * 1500); // 计算新比较值 ECap1Regs.CAP4 new_cmp; // 写入影子寄存器ACMP shadow下个周期生效通过这样的配置我们就得到了一个稳定、可安全动态调整的PWM输出。eCAP的APWM模式虽然不如专有的ePWM模块功能丰富如死区生成、错误联防等但其简单、精准且带影子寄存器的特性使其成为需要高分辨率PWM或作为补充PWM通道时的绝佳选择。5. 中断系统详解与稳健编程实践eCAP模块提供了丰富的中断事件源让CPU可以及时知道关键事件的发生而不必轮询。但中断配置和使用不当也是导致系统不稳定、丢中断甚至死锁的常见原因。5.1 中断源与标志位管理eCAP的中断事件主要分为捕获模式相关和APWM模式相关两大类由ECFLG标志寄存器和ECEINT使能寄存器管理捕获模式CEVT1, CEVT2, CEVT3, CEVT4。当对应序号的捕获事件发生时置位。APWM模式CTRPRD周期匹配, CTRCMP比较匹配。通用事件CTROVF计数器溢出两种模式下均有效。一个至关重要的细节ECFLG寄存器中的CEVTx标志位仅在捕获模式下有效而CTR_PRD和CTR_CMP标志位仅在APWM模式下有效。CTROVF则在两种模式下都有效。如果你在错误模式下使能了不该使能的中断将永远无法等到中断发生。中断产生的逻辑是当一个事件发生其对应的ECFLG标志位会被硬件置1。如果ECEINT中对应的中断使能位也为1并且全局中断标志ECFLG[INT]为0则模块会向CPU的PIE控制器产生一个中断脉冲。一旦中断脉冲发出ECFLG[INT]位会被自动置1这将阻塞后续所有中断直到该位被软件清零。5.2 中断服务程序ISR的标准流程与陷阱规避编写健壮的eCAP中断服务程序必须遵循严格的清理流程。以下是一个处理CEVT1中断的示例框架__interrupt void ecap1_isr(void) { // 1. 读取捕获值如果需要 Uint32 cap1_value ECap1Regs.CAP1; Uint32 cap2_value ECap1Regs.CAP2; // ... 进行必要的计算 // 2. 清除具体的事件标志位必须做 ECap1Regs.ECCLR.bit.CEVT1 1; // 清除CEVT1标志 // 3. 清除全局中断标志INT必须做否则后续中断被阻塞 ECap1Regs.ECCLR.bit.INT 1; // 4. 确认PIE组中断已被响应针对C2000其他MCU类似 PieCtrlRegs.PIEACK.all PIEACK_GROUP4; // 假设eCAP1在PIE组4 // 5. 使能全局中断如果之前关闭了 EINT; }必须避开的坑清除标志的顺序务必先清除具体事件标志如CEVT1再清除全局INT标志。顺序反了可能导致中断立即被重新触发。读取寄存器与清除标志对于捕获模式通常需要在清除标志前读取CAP寄存器以确保数据是本次中断对应的。但这不是绝对的取决于你的应用逻辑。中断使能时机推荐的外设初始化顺序是关闭全局中断 - 停止eCAP计数器 - 禁用所有eCAP中断ECEINT0 - 配置所有寄存器 - 清除所有可能悬置的中断标志ECFLG - 使能需要的eCAP中断 - 启动计数器 - 开启全局中断。这可以避免在配置过程中产生不可预期的中断。使用强制中断寄存器ECFRC进行测试在调试阶段你可以通过向ECFRC寄存器的对应位写1来模拟硬件中断事件这对于验证你的ISR逻辑是否正确非常有用。5.3 利用中断实现高级功能理解了基础中断我们可以设计更复杂的应用。例如在单次捕获模式下我们可以设置STOP_WRAPEC_EVENT4并使能CEVT4中断。当第四个边沿事件捕获完成后模块自动停止并产生中断。在ISR中我们可以安全地读取全部四个CAP寄存器值已被冻结计算出三个时间间隔然后重新REARM模块开始下一次捕获序列。这非常适合测量一个固定格式的脉冲串。在APWM模式下使能CTRCMP和CTRPRD中断可以分别在每个PWM周期的比较点改变输出时和周期点计数器复位时执行特定的代码例如在周期点进行电流采样在比较点后更新下一个周期的控制算法输出写入CAP4影子寄存器实现精准的数字控制环路时序。6. 关键寄存器精讲与配置代码片段手册提供了寄存器列表但实际编程时我们需要关注的是每个位域的具体含义和组合效果。这里对一些最关键的寄存器位进行“翻译”和实战化解读。6.1 ECCTL2模式与全局控制寄存器这是eCAP的“大脑”决定了模块的根本行为。CAP/APWM (位9)模式选择开关。0为捕获1为APWM。切换此位会显著改变内部逻辑和引脚方向通常需要在计数器停止时进行。APWMPOL (位10)仅APWM模式有效。0高有效CMP定义高电平时间1低有效。选择取决于你的驱动电路是高端驱动还是低端驱动。CONT/ONESHT (位0)捕获模式下的运行模式。连续模式像录像单次模式像拍照。单次模式捕获完成后必须软件REARM才能开始下一次。STOP_WRAP (位[2:1])在单次模式下它定义“拍几张照片后停止”1-4。在连续模式下它定义“录像带循环覆盖的起点”在哪个事件后CAP1重新开始装载。例如设为EC_EVENT2在连续模式下意味着CAP1和CAP2被循环使用。REARM (位3)单次模式的“快门按钮”。写1会使模4计数器归零并重新允许捕获加载。在单次模式下每次捕获序列结束后都必须执行此操作。TSCTRSTOP (位4)计数器的启停开关。1运行0停止。在修改关键配置如CAP/APWM模式、同步设置前应先停止计数器。6.2 ECCTL1捕获事件精细控制寄存器这是捕获模式的“感官系统”负责定义如何感知外部信号。CAPxPOL (位0,2,4,6)分别定义四个捕获事件的边沿极性。0上升沿1下降沿。巧妙配置这四个位可以实现脉宽、周期、占空比的一次性测量。CTRRSTx (位1,3,5,7)定义对应捕获事件发生后是否复位TSCTR。这是实现差分模式的关键。例如测量高电平时间设置CEVT1上升沿触发且CTRRST11CEVT2下降沿触发且CTRRST20。则CAP1为0复位后立即捕获CAP2即为高电平时间。CAPLDEN (位8)总使能位。必须设为1捕获事件才能加载到CAP寄存器。在单次模式下当停止条件满足时硬件会自动清零此位以冻结数据。PRESCALE (位[13:9])事件预分频。输入信号频率超过系统时钟几分之一时就需要考虑分频。例如PRESCALE2表示4分频每4个输入边沿才产生1个捕获事件。6.3 完整初始化代码示例捕获模式下面是一个针对TI C2000 Piccolo系列MCU使用CCS开发环境的eCAP1捕获模式初始化函数示例配置为连续模式、测量上升沿时间戳、使用中断。#include F28x_Project.h void InitECap1_CaptureMode(void) { // 步骤1: 关闭全局中断 DINT; // 步骤2: 停止eCAP计数器并禁用中断 ECap1Regs.ECCTL2.bit.TSCTRSTOP 0; // 停止计数器 ECap1Regs.ECEINT.all 0; // 禁用所有eCAP中断 // 步骤3: 配置GPIO引脚为eCAP功能 (以GPIO5为例需查具体数据手册) GPIO_SetupPinMux(5, GPIO_MUX_CPU1, 1); // 复用功能1通常是eCAP // 步骤4: 配置捕获控制寄存器1 (ECCTL1) ECap1Regs.ECCTL1.bit.CAP1POL 0; // CEVT1 上升沿 ECap1Regs.ECCTL1.bit.CAP2POL 0; // CEVT2 上升沿 (可根据需要调整) ECap1Regs.ECCTL1.bit.CAP3POL 0; // CEVT3 上升沿 ECap1Regs.ECCTL1.bit.CAP4POL 0; // CEVT4 上升沿 ECap1Regs.ECCTL1.bit.CTRRST1 0; // 绝对模式不复位 ECap1Regs.ECCTL1.bit.CTRRST2 0; ECap1Regs.ECCTL1.bit.CTRRST3 0; ECap1Regs.ECCTL1.bit.CTRRST4 0; ECap1Regs.ECCTL1.bit.PRESCALE 0; // 不分频 ECap1Regs.ECCTL1.bit.CAPLDEN 1; // 使能捕获加载 // 步骤5: 配置捕获控制寄存器2 (ECCTL2) ECap1Regs.ECCTL2.bit.CAP_APWM 0; // 捕获模式 ECap1Regs.ECCTL2.bit.CONT_ONESHT 0; // 连续模式 ECap1Regs.ECCTL2.bit.STOP_WRAP 3; // 4个事件后循环 ECap1Regs.ECCTL2.bit.SYNCI_EN 0; // 禁用同步输入 ECap1Regs.ECCTL2.bit.SYNCO_SEL 2; // 禁用同步输出 // REARM位和SWSYNC位保持默认0 // 步骤6: 清除所有可能悬置的中断标志 ECap1Regs.ECCLR.all 0xFFFF; // 清除所有标志位 // 步骤7: 使能所需的中断 (例如使能CEVT1和计数器溢出中断) ECap1Regs.ECEINT.bit.CEVT1 1; ECap1Regs.ECEINT.bit.CTROVF 1; // 可选用于检测长时间无信号 // 步骤8: 初始化计数器值 (可选) ECap1Regs.TSCTR 0; ECap1Regs.CTRPHS 0; // 步骤9: 启动计数器 ECap1Regs.ECCTL2.bit.TSCTRSTOP 1; // 步骤10: 配置PIE中断向量表并开启PIE中断 (C2000特有步骤) // 假设eCAP1中断在INT4.1 EALLOW; PieVectTable.ECAP1_INT ecap1_isr; // 指向你的ISR函数 EDIS; PieCtrlRegs.PIEIER4.bit.INTx1 1; // 使能PIE组4的第1个中断 IER | M_INT4; // 使能CPU级INT4中断 // 步骤11: 开启全局中断 EINT; }这段代码提供了一个稳健的初始化模板。在实际项目中你需要根据具体的测量需求差分/绝对、单次/连续、边沿选择来调整ECCTL1和ECCTL2的配置。记住好的初始化是稳定工作的基石遵循“先停止再配置后启动”的原则能避免绝大多数奇怪的硬件问题。