1. eCAP模块寄存器深度解析:从硬件接口到精准控制
在嵌入式系统,尤其是电机控制、数字电源和精密测量领域,对时间事件的精确捕捉和波形生成是核心需求。德州仪器(TI)的增强型捕获(eCAP)模块,作为其C2000系列微控制器中的关键外设,正是为此而生。它不仅仅是一个简单的输入捕获单元,更是一个集成了高精度时间戳记录、灵活PWM(APWM)输出以及复杂事件序列管理功能的强大工具。很多工程师在初次接触eCAP时,往往被其众多的寄存器位域和复杂的交互逻辑所困扰,配置起来感觉像是在“盲人摸象”。实际上,只要理解了其寄存器设计的底层逻辑,就能化繁为简,精准驾驭。
eCAP模块的精髓,完全体现在其寄存器组的设计上。CPU通过读写这些映射到特定地址的寄存器,与eCAP硬件进行对话。这就像给一个功能强大的精密仪器(eCAP硬件)配备了一个控制面板(寄存器),面板上的每一个开关、旋钮(寄存器位)都对应着仪器内部的一个特定功能。我们今天要重点剖析的,就是这个控制面板上最核心的几个部分:用于存储关键时间点的CAP4寄存器,负责设定模块基本工作模式和捕获规则的ECCTL1/ECCTL2控制寄存器,以及管理硬件事件通知机制的中断控制寄存器组(ECEINT, ECFLG, ECCLR, ECFRC)。理解它们,你就掌握了让eCAP模块按你心意工作的钥匙。
2. 核心寄存器功能与配置逻辑全解
2.1 CAP4寄存器:时间戳存储与PWM比较值的影子
CAP4是一个32位的寄存器,地址偏移为0x0010。它的角色非常特殊,具有“双重人格”,其功能完全由eCAP的工作模式决定。
在捕获(Capture, CMP)模式下,CAP4是一个纯粹的时间戳捕获寄存器。当模块配置为捕获外部输入引脚(ECAPx/APWMx)上的第4个事件(例如第4个上升沿或下降沿)时,时间基准计数器(TSCTR)的当前值会被瞬间“冻结”并锁存到CAP4中。这个值代表了从某个参考点(如计数器上次复位)到第4个事件发生时刻所经过的时钟周期数。通过读取CAP1-CAP4这四个寄存器,我们可以计算出连续事件之间的时间间隔,这对于测量脉冲宽度、频率或相位差至关重要。
在辅助PWM(APWM)模式下,CAP4的角色发生了根本性变化。此时,eCAP模块被用作一个简单的PWM发生器。CAP4寄存器变成了比较值影子寄存器(ACMP Shadow Register)。用户程序更新PWM的占空比时,实际上是写入CAP4。然后,在特定的同步事件(如计数器周期匹配)发生时,CAP4的影子值会被自动加载到CAP2寄存器中,CAP2作为活动比较寄存器直接与TSCTR进行比较,以产生PWM输出边沿。这种“影子寄存器”机制至关重要,它确保了PWM参数可以在一个安全的时刻(通常是在周期边界)批量更新,避免了在PWM周期中间更改比较值可能导致的脉冲畸形或毛刺,这对于电机控制和数字电源这种对波形连续性要求极高的应用是必不可少的保护措施。
注意:在APWM模式下,CAP1寄存器则作为周期值影子寄存器(APRD Shadow Register)使用,其影子值会被加载到CAP3中作为活动周期寄存器。因此,配置APWM时,通常操作的是CAP1(周期)和CAP4(比较值),而CAP2和CAP3由硬件自动管理。
2.2 ECCTL1寄存器:捕获引擎的精细调谐
ECCTL1(ECAP Control Register 1)是配置捕获行为细节的核心,其位域直接决定了eCAP如何响应输入信号。
FREE/SOFT(位15-14):仿真控制位。这在代码调试时极其重要。当你在CCS等集成开发环境中设置断点、单步执行时,CPU会被挂起(仿真挂起)。此时,TSCTR计数器该如何行为?
00:仿真挂起时,TSCTR立即停止。这便于在断点处观察精确的计数器值。01:TSCTR运行直至减到0后停止。适用于需要完成当前计数周期的场景。10或11:TSCTR不受仿真挂起影响,自由运行。这在调试与实时性紧密相关的系统(如正在控制电机旋转)时非常有用,可以确保即使CPU暂停,PWM或捕获时序也不受影响。
PRESCALE(位13-9):事件滤波器预分频选择。输入引脚上的信号可能带有毛刺。此预分频器并非对时间基准时钟分频,而是对捕获事件进行分频。例如,设置为Divide by 2,则引脚上每发生2次有效的边沿事件,才会产生1次内部的捕获事件。这是一种简单的硬件滤波,可以有效消除窄脉冲干扰。预分频值从1(直通)到62,为滤除不同频率的噪声提供了灵活性。
CAPLDEN(位8):捕获加载使能位。这是捕获功能的“总开关”。只有当此位置1时,发生在输入引脚上的事件才会触发TSCTR值加载到CAP1-CAP4寄存器中。如果禁用,即使事件发生,时间戳也不会被记录。通常在初始化配置的最后一步才将其使能。
CTRRSTn 与 CAPnPOL(位7-0):这4对位(n=1,2,3,4)分别控制着4个连续捕获事件的行为,是实现不同测量模式的关键:
- CAPnPOL:选择第n个捕获事件的触发边沿。
0为上升沿(RE),1为下降沿(FE)。通过灵活设置这4个位,可以轻松实现测量一个完整方波周期(如RE->FE->RE->FE)或者特定脉冲序列。 - CTRRSTn:计数器复位控制。这是“绝对时间戳”与“差分(相对)时间戳”模式的选择器。
0:绝对时间戳模式。捕获事件发生时,TSCTR值被记录到CAPn,但计数器继续自由运行。CAP1-CAP4中存储的都是相对于计数器某个起点的绝对时间。需要软件做减法才能得到间隔。1:差分(或称为“归零”)时间戳模式。捕获事件发生时,TSCTR值被记录到CAPn,随后TSCTR立即自动复位为0。这意味着CAPn中记录的就是距离上一个捕获事件的时间间隔。这种模式硬件自动完成了时间差计算,简化了软件操作,特别适合测量固定序列的周期或占空比。
一个典型的配置示例:要测量一个PWM信号的高电平时间(上升沿到下降沿)和周期(上升沿到下一个上升沿),可以设置:CAP1POL=0(事件1上升沿), CTRRST1=1(事件1后复位);CAP2POL=1(事件2下降沿), CTRRST2=0;CAP3POL=0(事件3上升沿), CTRRST3=1(事件3后复位)。这样,CAP2直接就是高电平时间,CAP3直接就是周期。
2.3 ECCTL2寄存器:工作模式与同步控制中枢
ECCTL2寄存器决定了eCAP模块的宏观工作模式、输出极性以及高级同步功能。
APWMPOL(位10):仅在APWM模式下有效,选择PWM输出极性。
0:高电平有效。当TSCTR小于活动比较值(CAP2)时,输出高电平。比较值定义了高电平时间。1:低电平有效。当TSCTR小于活动比较值时,输出低电平。比较值定义了低电平时间。这在驱动某些需要低电平使能的功率器件时非常有用。
CAP/APWM(位9):模式选择位,这是最重要的位之一。
0:捕获模式。引脚作为输入,时间戳捕获功能全部启用。CTR=PRD事件不会复位计数器,CAP1/2的影子加载被禁止,CAPLDEN由用户控制。1:APWM模式。引脚作为PWM输出。时间戳捕获功能被禁用(CAPLDEN强制无效),CTR=PRD事件会复位TSCTR,并触发CAP1/2的影子加载。模块变成一个单通道PWM发生器。
SWSYNC(位8):软件强制同步。向此位写1会产生一个同步脉冲,可以触发当前模块的TSCTR从相位寄存器(CTRPHS)加载,并且如果下游模块的同步源选择(SYNCO_SEL)配置为传递此信号,则同步链路上的其他eCAP/ePWM模块也会同时同步。这是一种通过软件统一多个定时器基准的强力手段。
SYNCO_SEL(位7-6)与 SYNCI_EN(位5):同步链控制。
- SYNCI_EN:使能同步输入。置1后,模块的TSCTR可以在外部同步输入信号(SYNCI)或软件强制同步(SWSYNC)事件发生时,从CTRPHS寄存器加载值,从而实现多个定时器的相位对齐。
- SYNCO_SEL:选择本模块产生的同步输出信号(SYNCO)源。
00:直接传递同步输入(SYNCI),形成直通。01:当TSCTR等于周期值(CTR=PRD)时产生同步输出。这在APWM模式下非常有用,可以让多个PWM模块的周期边界严格对齐。10或11:禁用同步输出。
TSCTRSTOP(位4):计数器启停控制。0停止,1运行。通常用于在配置期间冻结计数器。
RE-ARM(位3):单次模式重新使能。在单次(One-Shot)捕获模式下,当捕获序列完成(达到STOP_WRAP设定的次数)后,模块会停止。此时需要软件向此位写1来“重新武装”模块,使其准备好下一次捕获序列。
STOP_WRAP(位2-1):此位的功能因模式而异,体现了设计的巧妙。
- 在单次(One-Shot)模式:它定义了在停止前允许发生的捕获事件数量(1-4)。例如,设为
01(事件2),则模块在捕获到第2个事件后会自动冻结Mod4计数器和禁止捕获加载,等待重新使能。 - 在连续(Continuous)模式:它定义了循环缓冲区的“绕回点”。例如,设为
11(事件4),则模块会在捕获第4个事件后,下一个事件的时间戳覆盖CAP1,实现CAP1->CAP2->CAP3->CAP4->CAP1...的循环覆盖。这在需要持续监控最近4个事件时间戳的流式应用中非常高效。
CONT/ONESHT(位0):连续/单次模式选择。0为连续模式,捕获循环进行;1为单次模式,捕获指定次数后停止。
3. 中断系统配置与实战操作流程
eCAP的中断系统是其与CPU协同工作的关键,它让CPU无需持续轮询状态,而是在特定事件发生时被及时通知,从而高效处理数据或调整控制。
3.1 中断寄存器组详解与协作关系
eCAP的中断管理涉及四个紧密配合的寄存器:ECEINT(使能)、ECFLG(标志)、ECCLR(清除)、ECFRC(强制)。它们构成了一个完整的中断生命周期管理链。
ECEINT(中断使能寄存器):决定哪些硬件事件可以产生中断请求。每一位对应一个特定事件源:
- CEVT1-CEVT4:捕获事件1-4发生。
- CTROVF:32位TSCTR计数器从0xFFFFFFFF溢出到0x00000000。
- CTR=PRD:TSCTR等于周期值(APWM模式用)。
- CTR=CMP:TSCTR等于比较值(APWM模式用)。 只有相应使能位为1,且该事件发生时,才会向CPU申请中断。
ECFLG(中断标志寄存器):这是事件的“记录员”。无论ECEINT是否使能,只要硬件事件发生,对应的标志位就会被自动置1。CPU通过查询这些标志位(轮询方式)或结合中断服务程序(ISR)来了解发生了什么事件。INT位是全局中断标志,当任何已使能的事件标志置位时,INT位也会置1。
ECCLR(中断清除寄存器):这是ISR中的“清洁工”。在中断服务程序中,处理完某个事件后,必须通过向ECCLR寄存器的对应位写1,来清除ECFLG中的相应标志位。这是一个“写1清除”的寄存器,写0无效。清除操作是告诉硬件:“这个中断我已经处理完了,你可以准备下一个了。” 特别要注意,INT位也需要清除,否则后续中断可能被阻塞。
ECFRC(中断强制寄存器):这是“事件模拟器”。通过软件向此寄存器的位写1,可以手动设置对应的ECFLG标志位。如果该事件在ECEINT中已被使能,则会立即产生一个中断。这在测试中断服务程序逻辑、或者由软件触发特定处理流程时非常有用。
它们的关系可以这样理解:ECFRC和硬件事件是“因”,它们会置位ECFLG中的“果”。ECEINT像一个门卫,决定哪些“果”能去通知CPU(产生中断)。ECCLR是事后清理,为接收下一个“果”腾出位置。
3.2 eCAP模块初始化与中断配置标准流程
参考技术手册给出的流程,并结合实际工程经验,一个稳健的eCAP初始化(特别是涉及中断)应遵循以下步骤,这能有效避免因寄存器访问时序或毛刺信号导致的意外中断或错误配置:
- 关闭全局中断:操作CPU的INTM位(或使用
DINT;指令),防止在配置过程中被其他中断打断,保证配置过程的原子性。 - 停止eCAP计数器:将ECCTL2[TSCTRSTOP]位清零,冻结TSCTR,确保在配置静态参数时计数器状态不会变化。
- 禁用eCAP所有中断源:将ECEINT寄存器全部写0,暂时屏蔽所有eCAP事件产生中断。
- 配置eCAP功能寄存器:这是核心步骤,按需设置:
- ECCTL1:配置预分频、捕获边沿、计数器复位模式、使能捕获加载。
- ECCTL2:选择CAP/APWM模式、连续/单次模式、停止/绕回值、同步设置等。
- CTRPHS(如果需要相位同步):设置相位值。
- CAP1/CAP4(APWM模式):设置周期和比较影子值。
- 清除虚假中断标志:向ECCLR寄存器所有可写位写1,清除ECFLG中所有可能因上电、复位或配置过程中产生的残留标志位。这一步至关重要,是避免一开中断就立即进入ISR的关键。
- 使能特定的eCAP中断:根据应用需求,配置ECEINT寄存器,例如使能CEVT4(第4次捕获完成)中断。
- 启动eCAP计数器:将ECCTL2[TSCTRSTOP]位置1,TSCTR开始计数。
- 开启全局中断:清除CPU的INTM位(或使用
EINT;指令),系统开始响应中断。
实操心得:步骤5“清除虚假标志”极易被忽略。特别是在系统复位后或动态切换eCAP工作模式时,硬件状态可能不稳定,ECFLG中可能存在随机的置位。如果不清理就直接开中断,会导致程序立刻跳转到ISR,而ISR可能无法处理这种“无意义”的中断,从而引发程序逻辑错误或死锁。养成“配置前先清标志”的习惯,能省去很多不必要的调试时间。
3.3 中断服务程序(ISR)编写范式
一个规范的eCAP中断服务程序通常包含以下部分,以捕获模式下的CEVT4中断为例:
// 假设eCAP1的中断服务程序 __interrupt void eCAP1_ISR(void) { // 1. 读取中断标志寄存器,判断具体中断源 volatile uint16_t intFlags = ECap1Regs.ECFLG.all; // 2. 处理特定中断事件 if (intFlags & ECAP_INT_CEVT4) // 假设ECAP_INT_CEVT4是宏定义的掩码 { // 2.1 读取捕获的时间戳数据 g_capture_buffer[3] = ECap1Regs.CAP4; // 读取第4个时间戳 // 通常我们会读取CAP1-CAP4全部四个值进行计算 // uint32_t period = ECap1Regs.CAP3 - ECap1Regs.CAP1; // 示例:计算周期 // uint32_t duty = ECap1Regs.CAP2 - ECap1Regs.CAP1; // 示例:计算高电平时间 // 2.2 进行必要的计算或数据转移 // ... 你的应用逻辑 ... // 2.3 清除对应的中断标志位!!!(必须做) ECap1Regs.ECCLR.bit.CEVT4 = 1; } // 可以处理其他中断源,如CTROVF等 // if (intFlags & ECAP_INT_CTROVF) { ... ECap1Regs.ECCLR.bit.CTROVF = 1; } // 3. 清除全局中断标志位(INT),并应答PIE中断(如果是C2000系列) ECap1Regs.ECCLR.bit.INT = 1; // 清除eCAP模块全局标志 ECap1Regs.ECCLR.bit.CEVT4 = 1; // 再次确认清除事件标志(某些情况下需先清事件标志) PieCtrlRegs.PIEACK.all = PIEACK_GROUP4; // 假设eCAP1在PIE组4,应答组中断 // 4. 如果是单次模式,可能需要重新武装(RE-ARM)模块 // if (ECap1Regs.ECCTL2.bit.CONT_ONESHT == 1) { // 如果是单次模式 // ECap1Regs.ECCTL2.bit.RE_ARM = 1; // 重新武装,准备下一次捕获 // } }关键点:
- 标志判断与清除顺序:通常先读取ECFLG判断来源,处理完后立即清除对应的具体事件标志(如CEVT4),最后清除全局INT标志。有些架构要求先清具体标志才能清INT,需参考具体手册。
- 数据读取:在ISR中尽早读取CAPx寄存器,避免后续的捕获事件覆盖数据(在连续模式下尤其要注意)。
- 单次模式重载:如果在单次模式下使用,需要在ISR末尾或主循环中重新设置RE-ARM位,否则模块将不再响应捕获事件。
4. 典型应用场景配置实例与避坑指南
4.1 应用场景一:高精度脉冲宽度与周期测量(差分模式)
需求:测量一个未知频率的方波信号的高电平宽度和整个周期。
配置思路:
- 模式选择:捕获模式(ECCTL2[CAP/APWM]=0),连续模式(ECCTL2[CONT/ONESHT]=0)。
- 事件序列:设置4个事件为一个测量周期:上升沿(事件1) -> 下降沿(事件2) -> 上升沿(事件3) -> 下降沿(事件4)。我们主要关心事件1到事件2(高电平)、事件1到事件3(周期)。
- 差分模式简化计算:将CTRRST1和CTRRST3置1。这样,在事件1和事件3(上升沿)发生时,TSCTR会自动复位。结果就是:
- CAP2 直接存储了高电平时间(事件1到事件2的计数)。
- CAP3 直接存储了整个周期时间(事件1到事件3的计数)。
- CAP4 存储了下一个高电平时间,以此类推。
- 绕回设置:STOP_WRAP设为3(
11b),表示在4个事件(CAP1-CAP4)后绕回。这样CAP1-CAP4构成一个循环缓冲区,持续刷新最近的4个时间戳。 - 中断:使能CEVT4中断。每次捕获完4个事件(即完成一个完整的PWM周期测量)后产生中断,在ISR中读取CAP2和CAP3即可得到最新的脉宽和周期值。
关键配置代码片段(C语言风格):
// 假设使用eCAP1 ECap1Regs.ECCTL1.bit.CAPLDEN = 0; // 先禁止捕获加载 ECap1Regs.ECCTL1.bit.CTRRST1 = 1; // 事件1后复位计数器(差分模式) ECap1Regs.ECCTL1.bit.CAP1POL = 0; // 事件1:上升沿 ECap1Regs.ECCTL1.bit.CTRRST2 = 0; // 事件2后不复位 ECap1Regs.ECCTL1.bit.CAP2POL = 1; // 事件2:下降沿 ECap1Regs.ECCTL1.bit.CTRRST3 = 1; // 事件3后复位计数器 ECap1Regs.ECCTL1.bit.CAP3POL = 0; // 事件3:上升沿 ECap1Regs.ECCTL1.bit.CTRRST4 = 0; // 事件4后不复位 ECap1Regs.ECCTL1.bit.CAP4POL = 1; // 事件4:下降沿 ECap1Regs.ECCTL1.bit.PRESCALE = 0; // 事件预分频为1(无分频) ECap1Regs.ECCTL1.bit.CAPLDEN = 1; // 使能捕获加载 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.TSCTRSTOP = 0; // 先停止计数器 ECap1Regs.ECEINT.bit.CEVT4 = 1; // 使能捕获事件4中断4.2 应用场景二:生成固定占空比的PWM信号(APWM模式)
需求:使用eCAP模块生成一个频率为10kHz,占空比为30%的PWM波。
配置思路:
- 模式选择:APWM模式(ECCTL2[CAP/APWM]=1)。此模式下,CAP1/CAP2作为影子寄存器,CAP3/CAP4作为活动寄存器。
- 周期与比较值计算:假设系统时钟SYSCLKOUT为100MHz,eCAP时间基准时钟TBCLK不分频(通过ECCTL2的CLKDIV设置)。
- 周期值
APRD = (SYSCLKOUT / PWM_Freq) - 1 = (100e6 / 10e3) - 1 = 9999 - 比较值
ACMP = Duty * (APRD + 1) = 0.3 * 10000 = 3000
- 周期值
- 寄存器映射:在APWM模式下,用户写入CAP1设定周期,写入CAP4设定比较值。硬件在CTR=PRD时,将CAP1加载到CAP3(活动周期寄存器),将CAP4加载到CAP2(活动比较寄存器)。
- 计数器模式:通常使用递增-递减计数模式以生成对称PWM,但这需要结合动作限定器(AQ)模块,而eCAP的APWM模式输出逻辑是固定的(CTR<CMP时输出有效电平)。更简单的做法是使用递增计数模式,并通过ECCTL2[APWMPOL]设置极性。
关键配置代码片段:
// 生成10kHz, 30%占空比PWM(高电平有效) uint32_t period = 9999; // 对应10kHz uint32_t cmpValue = 3000; // 对应30%占空比 ECap1Regs.ECCTL2.bit.CAP_APWM = 1; // APWM模式 ECap1Regs.ECCTL2.bit.APWMPOL = 0; // 高电平有效(CTR<CMP时输出高) ECap1Regs.ECCTL2.bit.SYNCI_EN = 0; ECap1Regs.ECCTL2.bit.TSCTRSTOP = 0; // 停止计数器 // 配置影子寄存器 ECap1Regs.CAP1 = period; // 写入周期影子寄存器 (APRD shadow) ECap1Regs.CAP4 = cmpValue; // 写入比较值影子寄存器 (ACMP shadow) // 注意:在APWM模式下,CAP2和CAP3由硬件管理,用户通常不直接操作 // 启动计数器 ECap1Regs.ECCTL2.bit.TSCTRSTOP = 1;避坑指南:在APWM模式下,如果你发现更改CAP1或CAP4后PWM输出没有立即更新,这是正常的!因为影子寄存器到活动寄存器的加载发生在特定的同步事件(默认为CTR=PRD,即一个PWM周期结束)。这种设计避免了在PWM周期中间改变参数导致的输出毛刺。如果你需要立即更新,可以手动触发一个软件同步(SWSYNC),但这会破坏当前周期的完整性,需谨慎使用。
4.3 常见问题排查与调试技巧
问题:捕获不到任何数据,CAPx寄存器始终为0。
- 检查1:输入引脚配置。确保GPIO复用功能已正确配置为eCAP输入模式,而不仅仅是普通GPIO。
- 检查2:捕获加载使能。确认ECCTL1[CAPLDEN]位已设置为1。
- 检查3:计数器运行。确认ECCTL2[TSCTRSTOP]位为1,且TSCTR在计数(可通过调试器观察TSCNT寄存器值是否变化)。
- 检查4:事件极性。确认CAPnPOL设置与输入信号的实际边沿匹配。
- 检查5:预分频器。检查PRESCALE设置是否过大,导致有效事件被过滤掉。
问题:中断无法进入,或只进入一次。
- 检查1:中断使能与标志清除。严格按照“初始化流程”操作,确保在使能中断前清除了所有虚假标志(ECCLR)。在ISR中必须清除对应的中断标志和全局INT标志。
- 检查2:PIE/CPU中断配置(针对C2000)。除了eCAP模块自身中断使能(ECEINT),还需配置外设中断扩展(PIE)向量表,并使能CPU级中断。
- 检查3:单次模式未重载。如果在单次模式下使用,确保在捕获序列结束后(如在ISR中)设置了ECCTL2[RE-ARM]位。
问题:APWM模式输出频率或占空比不对。
- 检查1:时钟源与分频。确认eCAP模块的时钟(TBCLK)频率是否正确。检查ECCTL2中CLKDIV分频设置。
- 检查2:周期与比较值计算。记住公式:
PWM_Freq = TBCLK / (APRD + 1),Duty = ACMP / (APRD + 1)。APRD和ACMP是寄存器值,不是直接的时间值。 - 检查3:影子寄存器与活动寄存器。理解APWM模式下CAP1/CAP4是影子寄存器,其值在周期边界才加载到活动的CAP3/CAP2。更改CAP1/CAP4后,输出会在下一个周期生效。
调试技巧:使用强制中断(ECFRC)。在调试初期,可以不连接实际信号。通过配置好eCAP后,在软件中向ECFRC寄存器的相应位(如CEVT1)写1,手动触发一个中断。这可以验证你的中断服务程序链路(从eCAP到PIE到CPU)是否已正确接通,将硬件问题和软件配置问题分离开来。
调试技巧:监控关键寄存器。在调试器中使用实时内存/寄存器查看窗口,持续观察以下寄存器:
TSCTR:看计数器是否在运行。ECFLG:看事件标志位是否按预期置位。CAP1-CAP4:在捕获模式下看是否捕获到时间戳,在APWM模式下看影子值和活动值。ECEINT和ECCLR:确认中断使能和清除状态。
理解eCAP寄存器,本质上是理解一个高度可配置的“时间事件处理器”的工作逻辑。从最基础的CAPx数据存储,到ECCTL1/2的行为控制,再到中断系统的响应机制,每一层都提供了精细的调控手段。在实际项目中,我习惯于先在一张纸上画出信号流图和数据流图:输入信号如何被预处理、计数器如何工作、事件如何触发捕获或比较、中断如何产生和处理。然后,再将图中的每一个环节对应到具体的寄存器位上。这种从功能到寄存器的映射思维,能让你在面对任何复杂的外设时,都能快速抓住配置要点,写出稳定可靠的底层驱动。