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模块。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)。例如,系统时钟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种工作模式,是理解通道行为的关键。我们可以将其归纳为几大类:- 单次动作模式 (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干预,极大减轻了处理高频信号的负担。
- 单次动作模式 (0h-7h):如
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触发源。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因调试器断点而暂停时,定时器也可以停止计数(可选择立即停止或在CNTR=0时停止),方便观察定时器在断点时刻的状态,而不会让计数器在调试期间一直运行导致状态错乱。
3. 核心功能实战配置详解
理解了寄存器地图后,我们通过几个典型场景,来看看如何将这些寄存器组合起来,完成实际任务。
3.1 生成一路标准PWM信号
假设我们需要在OUT0引脚上产生一个频率为1kHz,占空比为30%的边沿对齐PWM。系统时钟为48MHz。
计算参数:
- 期望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。
配置步骤:
- 配置预分频器:
PRECFG.TICKDIV = 479,PRECFG.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测量一个未知数字信号的频率和占空比。
配置思路:
- 使用通道0的
PER_PULSE_WIDTH_MEAS (8h)模式。此模式下,通道会自动连续测量输入信号的周期和脉宽。 - 信号从IO控制器输入,假设连接到IOC输入0。
- 需要设置一个合理的超时值(通过TGT设定),防止在无信号时一直等待。
- 使用通道0的
配置步骤:
- 首先停止定时器:
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%平滑变化。
配置思路:
- 预先在内存中计算好一个占空比值数组(比如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输入0(PHA)和输入1(PHB)。索引信号(如果有)接至IOC输入2(IDX)。
- 设置
CTL.MODE = QDEC (4h)。 - 在QDEC模式下,计数器会根据PHA和PHB的相位关系自动递增或递减。
CNTR寄存器可以直接读取,反映位置信息。 C2CFG.EDGE可以配置IDX信号的行为,如果不需要索引归零,则设置为NONE。- 可以通过
RIS.DIRCHNG中断感知方向改变,通过RIS.IDX中断感知索引脉冲。
注意事项:
- QDEC模式的采样时钟由
PRECFG配置的定时器时钟决定。必须确保定时器时钟频率远高于编码器信号的最大预期频率(通常至少4-8倍),否则会丢失计数或误判方向。例如,编码器最高转速对应100kHz信号,则定时器采样时钟最好在1MHz以上。 - 输入信号建议启用
CHFILT滤波,以消除机械抖动产生的毛刺。
- QDEC模式的采样时钟由
4.2 同步模式实现多个定时器协同
在电机多轴控制中,需要多个PWM输出严格同步。
- 配置步骤:
- 选择一个定时器(如LGPT0)作为主定时器(Master),配置其PWM输出。
- 配置从定时器(如LGPT3):
STARTCFG.LGPT0 = 1(假设主定时器是LGPT0)。 - 设置从定时器
CTL.MODE = SYNC_UP_PER (6h)。 - 当主定时器启动时,从定时器会自动同步启动。它们的计数器零点将对齐,从而实现输出的完全同步。
4.3 常见问题与排查技巧
问题:PWM输出没有波形。
- 检查顺序:确认配置顺序正确。一个推荐的稳健初始化顺序是:先配置
DESCEX了解能力 -> 配置PRECFG分频 -> 配置TGT目标值 -> 配置通道CnCFG和CnCC-> 最后才设置CTL.MODE启动定时器。特别是涉及捕获功能的配置,手册强调应在MODE=DIS时进行。 - 检查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 = 1(Zero condition)。这样当调试器暂停CPU时,定时器会在完成当前计数周期(CNTR=0)后优雅地暂停,输出保持安全状态,恢复运行时也能从周期起点继续。
- 使用EMU寄存器:在调试电机控制等对时序极其敏感的程序时,CPU暂停会导致PWM输出停滞,可能损坏硬件。可以设置
通过对LGPT3寄存器组的层层剖析和实战演练,我们可以看到,它不仅仅是一个定时器,更是一个高度可编程的时序事件发生器。从简单的延时到复杂的多轴同步PWM,从信号捕获到与DMA、ADC的联动,其设计覆盖了嵌入式实时控制的大多数需求。掌握其寄存器映射,就是掌握了精准操控硬件时序的钥匙。关键在于理解各个功能模块之间的联动关系,并遵循正确的配置序列,这样才能稳定可靠地发挥这颗强大定时器的全部潜力。