深入解析CC27xx LGPT3定时器:从寄存器映射到PWM、捕获与DMA实战

深入解析CC27xx LGPT3定时器:从寄存器映射到PWM、捕获与DMA实战 1. LGPT3定时器架构与核心设计思路在嵌入式开发中定时器是连接软件逻辑与硬件时序的桥梁其重要性不亚于CPU本身。德州仪器CC27xx系列MCU内置的LGPT3Low-Power General Purpose Timer 3模块是一个功能异常丰富的24位通用定时器。它远不止一个简单的计数器而是一个集成了多通道捕获/比较、PWM生成、正交解码、DMA联动、ADC触发等高级功能的时序控制中心。理解它的寄存器映射是将其性能发挥到极致的第一步。LGPT3的设计哲学是“灵活且高效”。它通过一套精心设计的寄存器组将复杂的硬件逻辑暴露给开发者进行精细控制。整个模块可以看作一个由核心计数器CNTR驱动周围环绕着多个功能通道Channel和辅助逻辑单元的生态系统。每个通道C0, C1, C2都是独立的可以配置为输入捕获或输出比较模式并且能独立控制最多3个物理输出引脚OUT0, OUT1, OUT2。这种设计使得单个定时器能同时处理多个并发的时序任务例如用通道0生成PWM驱动电机同时用通道1捕获外部传感器信号的频率再用通道2在特定时刻触发ADC采样。它的核心工作流程是这样的一个可配置的预分频器由PRECFG寄存器控制将系统时钟或外部时钟源分频产生定时器自己的计数时钟。计数器CNTR在这个时钟驱动下按照CTL.MODE寄存器设定的模式如单次向上计数、周期向上计数、上下计数等运行。当计数器的值达到目标值TGT或零时会产生基础事件。而每个通道则将自己的比较值CxCC与计数器值实时比对或在检测到输入引脚特定边沿时捕获当前计数值从而产生更精细的通道级事件。这些事件可以直接翻转IO引脚产生PWM也可以触发中断、启动DMA传输或发起ADC转换形成一个高度自动化的响应链。2. 寄存器全景解析与功能分类面对LGPT3多达40个寄存器直接按地址顺序记忆是低效的。更好的方法是根据功能进行分组理解每一组寄存器扮演的角色。我们可以将其划分为以下几个核心功能簇2.1 身份识别与模块配置寄存器这一组寄存器用于识别模块和配置其固有属性通常在初始化时一次性读取或配置。DESC (Description Register, 偏移 0h)这是模块的“身份证”。MODID字段固定值0xDE49用于软件识别此IP模块。MAJREV和MINREV指明了IP的主次版本号对于依赖特定硬件特性的驱动兼容性检查至关重要。INSTIDX在多实例系统中标识这是第几个LGPT模块。DESCEX (Description Extended Register, 偏移 4h)这是模块的“能力说明书”。它用只读位字段宣告了该定时器实例支持哪些高级功能例如HIR是否支持中断逻辑。HDMA是否支持uDMA。CNTRW计数器位宽对于LGPT3这里是2代表24位计数器。NCH通道数量对于LGPT3这里是3。PREW预分频器宽度决定了最大分频系数2^PREW - 1。HCIF和CIFS指明了通道输入滤波器的存在与深度。注意在编写可移植驱动时应首先读取DESC和DESCEX寄存器根据CNTRW和NCH等字段动态分配缓冲区大小或使能相应功能而不是硬编码这样代码才能适配该系列不同型号的MCU。2.2 定时器核心控制寄存器这组寄存器掌管着定时器的“心脏”——计数器及其运行节奏。CTL (Timer Control, 偏移 Ch)这是总指挥。MODE字段是灵魂所在它定义了计数器的行为模式DIS (0h)关闭。所有动作停止。UP_ONCE (1h)单次向上计数。从0计到TGT后停止自动回到DIS模式。适用于产生单次延时或触发单次事件。UP_PER (2h)周期向上计数。从0计到TGT然后归零重复。这是产生边沿对齐PWM和周期性中断的经典模式。UPDWN_PER (3h)周期上下计数。从0计到TGT再递减回0如此循环。这是产生中心对齐对称PWM的理想模式能有效减少谐波。QDEC (4h)正交解码模式。在此模式下计数器会根据外部输入的PHA和PHB两相正交编码信号自动增减计数IDX信号可作为归零索引。这是连接旋转编码器的标准接口。SYNC_* (5h-7h)同步模式。允许本定时器由另一个LGPT定时器的事件通过STARTCFG配置来启动实现多个定时器的精确同步在复杂多轴控制中非常有用。CMPDIR字段控制比较事件在何种计数方向下有效这对于上下计数模式中精确控制PWM边沿非常关键。CxRST位提供了一种快速复位单个通道配置和比较值的方法而无需影响整个定时器。PRECFG (Clock Prescaler Configuration, 偏移 18h)这是节奏控制器。它通过TICKSRC选择时钟源系统时钟或外部TICKEN引脚并通过TICKDIV设置分频值。定时器最终的工作频率 TICKSRC频率 / (TICKDIV 1)。例如系统时钟48MHzTICKDIV设为47则定时器时钟为1MHz计数周期为1微秒。合理配置分频器是平衡计时精度和计数器溢出周期的关键。CNTR (Counter, 偏移 14h)TGT (Target, 偏移 13Ch)这是核心运行单元。CNTR是24位当前计数值只读QDEC模式除外。TGT是24位目标值它决定了计数周期。在UP_PER模式下信号周期 (TGT.VAL 1) * 定时器时钟周期。在UPDWN_PER模式下信号周期 (TGT.VAL * 2) * 定时器时钟周期。PREEVENT (Prescaler Event, 偏移 1Ch)这是一个精巧的预告触发器。它可以在预分频器计数器归零前的特定时刻由VAL设定产生一个高电平脉冲。这个功能的一个典型应用是在正交解码QDEC模式中用于在采样前预先给外部电路如滤波器上电确保采样时刻信号的稳定性。2.3 通道配置与捕获比较寄存器这是LGPT3功能多样性的体现每个通道都是一套独立的子系统。CnCFG (Channel n Configuration, 偏移 C0h/C4h/C8h)通道功能定义寄存器。这是配置中最复杂也最强大的部分。CCACTCapture-Compare Action定义了通道的15种工作模式是理解通道行为的关键。我们可以将其归纳为几大类单次动作模式 (0h-7h)如SET_ON_CAPT_DIS捕获后置位输出并禁用通道、TOGGLE_ON_CMP_DIS比较时翻转输出后禁用等。适用于需要精确单次响应的事件。连续动作模式 (8h-Fh)如SET_ON_CAPT连续捕获、TOGGLE_ON_CMP连续比较翻转。这是生成连续PWM或处理连续输入信号的基础。特殊模式PER_PULSE_WIDTH_MEAS (8h)是周期与脉宽测量模式。在此模式下通道会连续测量输入信号的周期存入CxCC和脉宽存入PCxCC无需CPU干预极大减轻了处理高频信号的负担。EDGE选择触发捕获的输入边沿上升、下降、双边沿或无。INPUT选择输入信号源是来自事件 fabric 还是 IO 控制器。OUTx使能该通道控制对应的物理输出。CnCC / PCnCC (Channel n Capture Compare / Pipeline, 偏移 140h/144h/148h 等)这是通道的“值”寄存器。比较模式向CnCC写入一个值当CNTR等于该值时触发该通道配置的动作如翻转输出。PCnCC管道寄存器的存在是为了实现无抖动更新在PWM运行中如果直接写入CnCC可能会在计数器周期中间写入导致当前周期的PWM占空比出现异常。而写入PCnCC后硬件会在下一个计数器周期开始CNTR归零时才将其加载到CnCC确保了PWM边沿的平滑。捕获模式当配置的输入边沿事件发生时当前的CNTR值会被捕获到CnCC中在周期脉宽测量模式下PCnCC捕获脉宽。这用于测量外部信号的频率、脉宽或时间戳。CHFILT (Channel Input Filter, 偏移 20h)输入信号滤波器。当输入信号有毛刺时这个数字滤波器可以确保只有稳定持续了LOAD1个采样时钟的信号边沿才会被确认为有效事件。MODE选择滤波器的时钟源。在工业环境等噪声较大的场景中合理配置滤波器是保证捕获准确性的前提。2.4 中断、DMA与事件系统寄存器这是实现高效、低延迟响应的关键让CPU从轮询中解放出来。中断相关寄存器组 (IMASK, RIS, MIS, ICLR, ISET, IMSET, IMCLR, 偏移 68h-80h)RIS (Raw Interrupt Status)原始中断状态寄存器。任何中断事件如计数到目标TGT、归零ZERO、通道比较匹配CxCC、捕获完成、正交解码索引IDX等都会置位对应的位。它是硬件事件的直接反映。IMASK (Interrupt Mask)中断掩码寄存器。只有被IMASK允许置1的中断源其状态才能传递到MIS。MIS (Masked Interrupt Status)被屏蔽后的中断状态。通常CPU中断服务程序ISR查询的是MIS寄存器以判断是哪个被使能的中断触发了。ICLR (Interrupt Clear)中断清除寄存器。向某位写1可清除RIS和MIS中对应的中断标志位。这是清除中断挂起状态的正确方式。ISET软件中断设置寄存器可用于测试或软件触发中断事件。IMSET/IMCLR用于原子操作地设置或清除IMASK中的某一位比直接读写IMASK寄存器在某些场景下更安全。DMA寄存器 (DMA, DMARW, 偏移 3Ch, 40h)直接内存访问配置。DMA.REQ字段选择将哪个中断事件如C0CC匹配作为DMA触发源。RWADDR和RWCNTR定义了DMA传输的起始地址和次数。当选定的事件发生时DMA控制器会自动读写DMARW寄存器而硬件会自动递增内部地址指针。这意味着你可以设置DMA在每次PWM周期结束时自动将下一个占空比值从内存数组传输到PCxCC寄存器实现极其平滑、无CPU干预的PWM序列播放。ADCTRG (ADC Trigger, 偏移 44h)ADC触发源选择寄存器。其逻辑与DMA配置类似SRC字段选择将哪个定时器事件如计数器归零ZERO或通道比较CxCC连接到ADC的触发输入端。这使得ADC采样可以与PWM中心点、周期起点等关键时间点严格同步在电机控制相电流采样或精密传感器读取中至关重要。2.5 输出控制与调试寄存器OUTCTL (Output Control, 偏移 10h)提供了一种软件直接强制设置或清除输出引脚电平的方法优先级高于通道的自动控制。用于紧急关断或手动测试。IOCTL (IO Controller, 偏移 48h)对输出到IO控制器的信号进行最终修饰可以强制输出高、低、正常或取反。这在需要互补PWM对驱动H桥时特别有用可以方便地统一设置死区时间或强制输出状态。EMU (Debug control, 偏移 84h)仿真调试控制。HALT位使能后当CPU因调试器断点而暂停时定时器也可以停止计数可选择立即停止或在CNTR0时停止方便观察定时器在断点时刻的状态而不会让计数器在调试期间一直运行导致状态错乱。3. 核心功能实战配置详解理解了寄存器地图后我们通过几个典型场景来看看如何将这些寄存器组合起来完成实际任务。3.1 生成一路标准PWM信号假设我们需要在OUT0引脚上产生一个频率为1kHz占空比为30%的边沿对齐PWM。系统时钟为48MHz。计算参数期望PWM频率1kHz周期 T 1/1000 1ms。选择CTL.MODE UP_PER周期向上计数模式。设定定时器时钟为了获得灵活的占空比调节精度和较长的周期我们让定时器时钟慢一些。设PRECFG.TICKDIV 479。则定时器时钟频率 48MHz / (4791) 100kHz周期为10us。计算目标值TGT在UP_PER模式下周期 (TGT.VAL 1) * 定时器时钟周期。所以 TGT.VAL (1ms / 10us) - 1 100 - 1 99。计算比较值C0CC占空比 C0CC.VAL / (TGT.VAL 1)。所以 C0CC.VAL 30% * (99 1) 30。配置步骤配置预分频器PRECFG.TICKDIV 479PRECFG.TICKSRC 0系统时钟。配置目标值TGT.VAL 99。配置通道0为比较模式C0CFG.CCACT SET_ON_ZERO_TOGGLE_ON_CMP_REPEAT (Bh)。此模式在CNTR0时置位输出在CNTRC0CC时翻转输出产生边沿对齐PWM。使能通道0控制OUT0C0CFG.OUT0 1。写入比较值C0CC.VAL 30。关键步骤使用管道寄存器更新为了确保PWM波形无抖动应在运行中通过管道寄存器更新占空比PC0CC.VAL new_duty_value。新值将在下一个周期生效。最后启动定时器CTL.MODE UP_PER (2h)。实操心得在PWM应用中如果需要在运行中改变频率周期需要同时更新TGT和所有通道的CxCC值。为了保持多个通道间的相位关系并避免周期中间更新造成的毛刺应遵循“先写PTGT和所有PCxCC最后再同时生效”的原则。即先写入PTGT和各个PCxCC由于硬件会在CNTR归零时才加载这些值所以它们会在同一个新周期开始时间步生效。3.2 测量外部信号频率与占空比使用通道0测量一个未知数字信号的频率和占空比。配置思路使用通道0的PER_PULSE_WIDTH_MEAS (8h)模式。此模式下通道会自动连续测量输入信号的周期和脉宽。信号从IO控制器输入假设连接到IOC输入0。需要设置一个合理的超时值通过TGT设定防止在无信号时一直等待。配置步骤首先停止定时器CTL.MODE DIS。配置通道0C0CFG.CCACT PER_PULSE_WIDTH_MEAS (8h)C0CFG.INPUT 1IO控制器C0CFG.EDGE 1上升沿触发测量周期和正脉宽。OUTx全部禁用。配置输入滤波器CHFILT如果需要抗干扰。配置一个足够大的TGT值作为超时阈值例如对应100ms的计数值。使能通道0中断IMASK.C0CC 1。启动定时器为周期向上计数模式CTL.MODE UP_PER。在中断服务程序ISR中读取C0CC.VAL获得信号周期计数值读取PC0CC.VAL获得正脉宽计数值。结合定时器时钟周期即可计算出实际频率和占空比。读取操作会自动清除RIS.C0CC中断标志。3.3 使用DMA实现PWM序列播放实现一个呼吸灯效果需要PWM占空比从0%到100%再回到0%平滑变化。配置思路预先在内存中计算好一个占空比值数组比如100个点构成一个正弦波或线性变化序列。配置DMA使其在每次PWM周期结束例如CNTR归零ZERO事件时自动将数组中的下一个值搬运到PC0CC寄存器。DMA传输完成整个数组后可以触发中断让CPU重新配置DMA或改变播放模式。配置步骤按3.1配置好PWM基础参数模式、预分频、TGT。配置DMA寄存器DMA.REQ 2选择RIS.ZERO事件作为DMA请求源。DMA.RWADDR PC0CC寄存器地址偏移 / 4。例如PC0CC偏移为0x100则RWADDR 0x100/4 0x40。DMA.RWCNTR 数组长度 - 1。如果数组有100个值则设为99。配置DMA控制器这是MCU的另一个模块非LGPT部分设置源地址为内存数组地址目标地址为LGPT模块的DMARW寄存器地址传输宽度为32位使能自动递增源地址。启动定时器和DMA。此后每个PWM周期结束时ZERO事件触发DMA自动更新下一个占空比CPU完全不用干预。4. 高级功能与避坑指南4.1 正交解码模式QDEC配置要点将LGPT3配置为正交解码器用于读取旋转编码器。接线与配置编码器的A相、B相接至LGPT3的IOC输入0PHA和输入1PHB。索引信号如果有接至IOC输入2IDX。设置CTL.MODE QDEC (4h)。在QDEC模式下计数器会根据PHA和PHB的相位关系自动递增或递减。CNTR寄存器可以直接读取反映位置信息。C2CFG.EDGE可以配置IDX信号的行为如果不需要索引归零则设置为NONE。可以通过RIS.DIRCHNG中断感知方向改变通过RIS.IDX中断感知索引脉冲。注意事项QDEC模式的采样时钟由PRECFG配置的定时器时钟决定。必须确保定时器时钟频率远高于编码器信号的最大预期频率通常至少4-8倍否则会丢失计数或误判方向。例如编码器最高转速对应100kHz信号则定时器采样时钟最好在1MHz以上。输入信号建议启用CHFILT滤波以消除机械抖动产生的毛刺。4.2 同步模式实现多个定时器协同在电机多轴控制中需要多个PWM输出严格同步。配置步骤选择一个定时器如LGPT0作为主定时器Master配置其PWM输出。配置从定时器如LGPT3STARTCFG.LGPT0 1假设主定时器是LGPT0。设置从定时器CTL.MODE SYNC_UP_PER (6h)。当主定时器启动时从定时器会自动同步启动。它们的计数器零点将对齐从而实现输出的完全同步。4.3 常见问题与排查技巧问题PWM输出没有波形。检查顺序确认配置顺序正确。一个推荐的稳健初始化顺序是先配置DESCEX了解能力 - 配置PRECFG分频 - 配置TGT目标值 - 配置通道CnCFG和CnCC- 最后才设置CTL.MODE启动定时器。特别是涉及捕获功能的配置手册强调应在MODEDIS时进行。检查IO复用确认对应的输出引脚OUT0/1/2已通过GPIO模块正确复用为LGPT功能并且输出使能。检查通道使能确认CnCFG.OUTx位已使能对应输出。验证时钟检查系统时钟是否运行PRECFG配置是否合理TICKDIV不为0时分频后时钟可能极慢。问题捕获值不准或跳动。检查滤波器如果输入信号有噪声务必配置CHFILT寄存器。LOAD值决定了需要连续多少个相同采样才确认为有效边沿。MODE决定了滤波器时钟通常与输入信号同步或使用系统时钟。注意捕获假事件手册在CnCFG描述中专门警告了“假捕获事件”。当在定时器运行中(MODE ! DIS)重新配置通道的CCACT或EDGE时边沿检测电路中的旧采样值可能导致立即触发一次捕获。正确的做法是先将EDGE设为NONE再配置CCACT等待至少3个系统时钟周期最后再设置EDGE为所需边沿。检查中断处理延迟在高速捕获时如果中断服务程序处理太慢可能错过下一次捕获。此时应考虑使用DMA将捕获值直接搬运到内存环形缓冲区或者使用双缓冲机制一个通道捕获另一个通道准备。问题使用管道寄存器更新PWM但变化不生效。理解生效时机写入PCnCC或PTGT的值只在下一个计数器周期开始CNTR从TGT归零的瞬间才会被加载到工作寄存器CnCC或TGT中。在写入后立即读取CnCC看到的还是旧值。这是正常现象旨在消除抖动。使用*NC寄存器如果需要在不影响中断标志的情况下查询或修改管道值应使用PCnCCNC和PTGTNC寄存器进行读写。对PCnCC/PTGT的读写会清除相应的中断标志位。问题调试时断点导致定时器状态异常。使用EMU寄存器在调试电机控制等对时序极其敏感的程序时CPU暂停会导致PWM输出停滞可能损坏硬件。可以设置EMU.HALT 1并选择EMU.CTL 1Zero condition。这样当调试器暂停CPU时定时器会在完成当前计数周期CNTR0后优雅地暂停输出保持安全状态恢复运行时也能从周期起点继续。通过对LGPT3寄存器组的层层剖析和实战演练我们可以看到它不仅仅是一个定时器更是一个高度可编程的时序事件发生器。从简单的延时到复杂的多轴同步PWM从信号捕获到与DMA、ADC的联动其设计覆盖了嵌入式实时控制的大多数需求。掌握其寄存器映射就是掌握了精准操控硬件时序的钥匙。关键在于理解各个功能模块之间的联动关系并遵循正确的配置序列这样才能稳定可靠地发挥这颗强大定时器的全部潜力。