news 2026/7/26 14:11:03

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
深入解析CC27xx LGPT3定时器:从寄存器映射到PWM、捕获与DMA实战

1. LGPT3定时器架构与核心设计思路

在嵌入式开发中,定时器是连接软件逻辑与硬件时序的桥梁,其重要性不亚于CPU本身。德州仪器CC27xx系列MCU内置的LGPT3(Low-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模块。MAJREVMINREV指明了IP的主次版本号,对于依赖特定硬件特性的驱动兼容性检查至关重要。INSTIDX在多实例系统中标识这是第几个LGPT模块。
  • DESCEX (Description Extended Register, 偏移 4h):这是模块的“能力说明书”。它用只读位字段宣告了该定时器实例支持哪些高级功能,例如:
    • HIR:是否支持中断逻辑。
    • HDMA:是否支持uDMA。
    • CNTRW:计数器位宽(对于LGPT3,这里是2,代表24位计数器)。
    • NCH:通道数量(对于LGPT3,这里是3)。
    • PREW:预分频器宽度,决定了最大分频系数(2^PREW - 1)。
    • HCIFCIFS:指明了通道输入滤波器的存在与深度。

注意:在编写可移植驱动时,应首先读取DESC和DESCEX寄存器,根据CNTRWNCH等字段动态分配缓冲区大小或使能相应功能,而不是硬编码,这样代码才能适配该系列不同型号的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)。例如,系统时钟48MHz,TICKDIV设为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):通道功能定义寄存器。这是配置中最复杂也最强大的部分。

    • CCACT(Capture-Compare Action):定义了通道的15种工作模式,是理解通道行为的关键。我们可以将其归纳为几大类:
      1. 单次动作模式 (0h-7h):如SET_ON_CAPT_DIS(捕获后置位输出并禁用通道)、TOGGLE_ON_CMP_DIS(比较时翻转输出后禁用)等。适用于需要精确单次响应的事件。
      2. 连续动作模式 (8h-Fh):如SET_ON_CAPT(连续捕获)、TOGGLE_ON_CMP(连续比较翻转)。这是生成连续PWM或处理连续输入信号的基础。
      3. 特殊模式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):输入信号滤波器。当输入信号有毛刺时,这个数字滤波器可以确保只有稳定持续了LOAD+1个采样时钟的信号边沿才会被确认为有效事件。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触发源。RWADDRRWCNTR定义了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因调试器断点而暂停时,定时器也可以停止计数(可选择立即停止或在CNTR=0时停止),方便观察定时器在断点时刻的状态,而不会让计数器在调试期间一直运行导致状态错乱。

3. 核心功能实战配置详解

理解了寄存器地图后,我们通过几个典型场景,来看看如何将这些寄存器组合起来,完成实际任务。

3.1 生成一路标准PWM信号

假设我们需要在OUT0引脚上产生一个频率为1kHz,占空比为30%的边沿对齐PWM。系统时钟为48MHz。

  1. 计算参数

    • 期望PWM频率:1kHz,周期 T = 1/1000 = 1ms。
    • 选择CTL.MODE = UP_PER(周期向上计数模式)。
    • 设定定时器时钟:为了获得灵活的占空比调节精度和较长的周期,我们让定时器时钟慢一些。设PRECFG.TICKDIV = 479。则定时器时钟频率 = 48MHz / (479+1) = 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。
  2. 配置步骤

    • 配置预分频器:PRECFG.TICKDIV = 479PRECFG.TICKSRC = 0(系统时钟)。
    • 配置目标值:TGT.VAL = 99
    • 配置通道0为比较模式:C0CFG.CCACT = SET_ON_ZERO_TOGGLE_ON_CMP_REPEAT (Bh)。此模式在CNTR=0时置位输出,在CNTR=C0CC时翻转输出,产生边沿对齐PWM。
    • 使能通道0控制OUT0:C0CFG.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测量一个未知数字信号的频率和占空比。

  1. 配置思路

    • 使用通道0的PER_PULSE_WIDTH_MEAS (8h)模式。此模式下,通道会自动连续测量输入信号的周期和脉宽。
    • 信号从IO控制器输入,假设连接到IOC输入0。
    • 需要设置一个合理的超时值(通过TGT设定),防止在无信号时一直等待。
  2. 配置步骤

    • 首先停止定时器:CTL.MODE = DIS
    • 配置通道0:C0CFG.CCACT = PER_PULSE_WIDTH_MEAS (8h)C0CFG.INPUT = 1(IO控制器),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%平滑变化。

  1. 配置思路

    • 预先在内存中计算好一个占空比值数组(比如100个点,构成一个正弦波或线性变化序列)。
    • 配置DMA,使其在每次PWM周期结束(例如CNTR归零ZERO事件)时,自动将数组中的下一个值搬运到PC0CC寄存器。
    • DMA传输完成整个数组后,可以触发中断,让CPU重新配置DMA或改变播放模式。
  2. 配置步骤

    • 按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配置为正交解码器,用于读取旋转编码器。

  1. 接线与配置

    • 编码器的A相、B相接至LGPT3的IOC输入0(PHA)和输入1(PHB)。索引信号(如果有)接至IOC输入2(IDX)。
    • 设置CTL.MODE = QDEC (4h)
    • 在QDEC模式下,计数器会根据PHA和PHB的相位关系自动递增或递减。CNTR寄存器可以直接读取,反映位置信息。
    • C2CFG.EDGE可以配置IDX信号的行为,如果不需要索引归零,则设置为NONE
    • 可以通过RIS.DIRCHNG中断感知方向改变,通过RIS.IDX中断感知索引脉冲。
  2. 注意事项

    • QDEC模式的采样时钟由PRECFG配置的定时器时钟决定。必须确保定时器时钟频率远高于编码器信号的最大预期频率(通常至少4-8倍),否则会丢失计数或误判方向。例如,编码器最高转速对应100kHz信号,则定时器采样时钟最好在1MHz以上。
    • 输入信号建议启用CHFILT滤波,以消除机械抖动产生的毛刺。

4.2 同步模式实现多个定时器协同

在电机多轴控制中,需要多个PWM输出严格同步。

  1. 配置步骤
    • 选择一个定时器(如LGPT0)作为主定时器(Master),配置其PWM输出。
    • 配置从定时器(如LGPT3):STARTCFG.LGPT0 = 1(假设主定时器是LGPT0)。
    • 设置从定时器CTL.MODE = SYNC_UP_PER (6h)
    • 当主定时器启动时,从定时器会自动同步启动。它们的计数器零点将对齐,从而实现输出的完全同步。

4.3 常见问题与排查技巧

  1. 问题:PWM输出没有波形。

    • 检查顺序:确认配置顺序正确。一个推荐的稳健初始化顺序是:先配置DESCEX了解能力 -> 配置PRECFG分频 -> 配置TGT目标值 -> 配置通道CnCFGCnCC-> 最后才设置CTL.MODE启动定时器。特别是涉及捕获功能的配置,手册强调应在MODE=DIS时进行。
    • 检查IO复用:确认对应的输出引脚(OUT0/1/2)已通过GPIO模块正确复用为LGPT功能,并且输出使能。
    • 检查通道使能:确认CnCFG.OUTx位已使能对应输出。
    • 验证时钟:检查系统时钟是否运行,PRECFG配置是否合理(TICKDIV不为0时,分频后时钟可能极慢)。
  2. 问题:捕获值不准或跳动。

    • 检查滤波器:如果输入信号有噪声,务必配置CHFILT寄存器。LOAD值决定了需要连续多少个相同采样才确认为有效边沿。MODE决定了滤波器时钟,通常与输入信号同步或使用系统时钟。
    • 注意捕获假事件:手册在CnCFG描述中专门警告了“假捕获事件”。当在定时器运行中(MODE != DIS)重新配置通道的CCACTEDGE时,边沿检测电路中的旧采样值可能导致立即触发一次捕获。正确的做法是:先将EDGE设为NONE,再配置CCACT,等待至少3个系统时钟周期,最后再设置EDGE为所需边沿。
    • 检查中断处理延迟:在高速捕获时,如果中断服务程序处理太慢,可能错过下一次捕获。此时应考虑使用DMA将捕获值直接搬运到内存环形缓冲区,或者使用双缓冲机制(一个通道捕获,另一个通道准备)。
  3. 问题:使用管道寄存器更新PWM,但变化不生效。

    • 理解生效时机:写入PCnCCPTGT的值,只在下一个计数器周期开始(CNTR从TGT归零的瞬间)才会被加载到工作寄存器CnCCTGT。在写入后立即读取CnCC,看到的还是旧值。这是正常现象,旨在消除抖动。
    • 使用*NC寄存器:如果需要在不影响中断标志的情况下查询或修改管道值,应使用PCnCCNCPTGTNC寄存器进行读写。对PCnCC/PTGT的读写会清除相应的中断标志位。
  4. 问题:调试时断点导致定时器状态异常。

    • 使用EMU寄存器:在调试电机控制等对时序极其敏感的程序时,CPU暂停会导致PWM输出停滞,可能损坏硬件。可以设置EMU.HALT = 1,并选择EMU.CTL = 1(Zero condition)。这样当调试器暂停CPU时,定时器会在完成当前计数周期(CNTR=0)后优雅地暂停,输出保持安全状态,恢复运行时也能从周期起点继续。

通过对LGPT3寄存器组的层层剖析和实战演练,我们可以看到,它不仅仅是一个定时器,更是一个高度可编程的时序事件发生器。从简单的延时到复杂的多轴同步PWM,从信号捕获到与DMA、ADC的联动,其设计覆盖了嵌入式实时控制的大多数需求。掌握其寄存器映射,就是掌握了精准操控硬件时序的钥匙。关键在于理解各个功能模块之间的联动关系,并遵循正确的配置序列,这样才能稳定可靠地发挥这颗强大定时器的全部潜力。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/26 14:10:31

Explorer Tab Utility:Windows 11文件资源管理器终极标签管理指南

Explorer Tab Utility:Windows 11文件资源管理器终极标签管理指南 【免费下载链接】ExplorerTabUtility 🚀 Supercharge Windows 11s File Explorer: Auto-convert windows to tabs, duplicate tabs, reopen closed ones, and more! 项目地址: https:/…

作者头像 李华
网站建设 2026/7/26 14:09:15

OpenGlass:25美元如何让普通眼镜变身AI智能助手?

OpenGlass:25美元如何让普通眼镜变身AI智能助手? 【免费下载链接】OpenGlass Turn any glasses into AI-powered smart glasses 项目地址: https://gitcode.com/GitHub_Trending/op/OpenGlass 在科技圈内,一个看似不可能的技术挑战正在…

作者头像 李华
网站建设 2026/7/26 14:07:27

免费Illustrator脚本合集:30+实用工具提升10倍设计效率

免费Illustrator脚本合集:30实用工具提升10倍设计效率 【免费下载链接】illustrator-scripts Adobe Illustrator scripts 项目地址: https://gitcode.com/gh_mirrors/il/illustrator-scripts 还在为Adobe Illustrator中重复繁琐的操作而烦恼吗?每…

作者头像 李华
网站建设 2026/7/26 14:06:34

5分钟快速汉化Axure RP:新手完整中文界面安装指南

5分钟快速汉化Axure RP:新手完整中文界面安装指南 【免费下载链接】axure-cn Chinese language file for Axure RP. Axure RP 简体中文语言包。支持 Axure 11、10、9。不定期更新。 项目地址: https://gitcode.com/gh_mirrors/ax/axure-cn 还在为Axure RP的英…

作者头像 李华
网站建设 2026/7/26 14:05:30

多模型统一API网关:解决Agent开发中模型切换与集成的技术方案

在 Agent 开发领域,最头疼的问题莫过于每个模型都有自己的 API 接口规范、认证方式和参数格式。当你需要在 DeepSeek、Qwen、GLM、Llama 等多个模型之间切换时,代码中充斥着各种 if-else 分支,维护成本急剧上升。 这次我们来看一个实用的解决…

作者头像 李华