TM4C123定时器B配置详解:从GPTMTBMR寄存器到PWM与中断实战
1. 整体设计与思路拆解
通用定时器(GPTM)是嵌入式系统开发中不可或缺的“心脏”部件,它负责精确地度量时间,是驱动电机、生成通信协议、采集传感器数据等一切需要精准时序控制功能的基础。Tiva™ TM4C123BH6ZRB微控制器内置的GPTM模块功能强大且灵活,但这也意味着其寄存器配置相对复杂。很多开发者初次接触时,面对密密麻麻的寄存器位域,往往感到无从下手,要么配置不生效,要么产生意料之外的定时行为。
我最初接触TM4C系列时,也曾在定时器配置上踩过不少坑。比如,想配置一个简单的周期中断,却发现中断死活不触发;或者想生成一个PWM波,输出引脚却毫无反应。后来发现,问题往往出在对寄存器位之间复杂的依赖关系和配置顺序理解不清上。特别是GPTM Timer B模式寄存器(GPTMTBMR),它就像Timer B的“大脑”,决定了这个定时器是当“闹钟”(单次触发)、当“节拍器”(周期定时)、当“秒表”(输入捕获)还是当“调光器”(PWM输出)。但仅仅配置它还不够,还必须与GPTM配置寄存器(GPTMCFG)、控制寄存器(GPTMCTL)协同工作,并且严格遵守“先配置,后使能”的黄金法则。
本文将以GPTMTBMR寄存器为核心,结合其紧密关联的GPTMCTL、GPTMSYNC、GPTMIMR、GPTMRIS、GPTMMIS等寄存器,为你彻底拆解TM4C123BH6ZRB定时器B的配置逻辑。我不会仅仅翻译数据手册,而是会结合我实际项目中的经验,告诉你每个关键位背后的设计意图、配置时的“潜规则”以及那些容易让人栽跟头的细节。我们的目标是:让你读完本文后,不仅能看懂寄存器手册,更能胸有成竹地写出稳定、可靠的定时器驱动代码。
2. 核心寄存器详解与位域功能解析
要驾驭Timer B,我们必须先成为它的“解剖专家”。GPTMTBMR寄存器位于偏移地址0x008,是一个32位可读写寄存器,复位值为0。它的每一位都控制着Timer B的某一项关键行为。下面,我们逐位深入,并解释其与相关寄存器的联动关系。
2.1 模式选择核心:TBMR[1:0] 与 TBAMS[3], TBCMR[2]
这三个位共同决定了Timer B最根本的工作模式,是配置的起点。
TBMR[1:0] (Timer B Mode):这是模式选择的主开关。
0x0: 保留。切勿使用此值,否则定时器行为未定义。0x1:单次触发(One-Shot)模式。定时器从装载值(GPTMTBILR)开始计数(向上或向下),达到目标(0或装载值)后产生一次超时中断,然后自动停止。就像设定一个只响一次的闹钟。适用于需要精确单次延迟的场景,如按键消抖后执行一次动作。0x2:周期(Periodic)模式。定时器在超时后自动重载初始值,并继续运行,周而复始。这是最常用的模式,用于产生固定频率的中断,作为系统的“心跳”或软件定时器的时基。0x3:输入捕获(Capture)模式。在此模式下,定时器通常作为一个自由运行的计数器。当外部引脚(CCP)发生指定边沿事件时,当前计数器的值会被瞬间“捕获”并存入GPTMTBR(和GPTMTBPR)寄存器。通过计算两次捕获值之差,可以精确测量脉冲宽度或信号频率。
TBAMS[3] (Timer B Alternate Mode Select):这是PWM模式的使能开关。
0: 选择捕获或比较(Capture/Compare)模式。此时Timer B工作在上述TBMR定义的三种模式之一。1: 选择PWM(Pulse Width Modulation)模式。此时,Timer B将化身为一个硬件PWM发生器,自动在CCP引脚上输出占空比可调的方波。注意:启用PWM模式有严格的前提条件:必须同时TBAMS=1,TBCMR=0,并且TBMR必须设置为0x1或0x2。这个组合限制是新手最容易忽略的地方。
TBCMR[2] (Timer B Capture Mode):此位仅在TBAMS=0(即非PWM模式)且TBMR=0x3(捕获模式)时才有意义。
0:边沿计数(Edge-Count)模式。定时器记录在CCP引脚上发生的指定边沿事件(上升沿、下降沿或双边沿,由GPTMCTL寄存器的TBEVENT位控制)的次数。1:边沿定时(Edge-Time)模式。定时器作为一个自由运行的计数器,在CCP引脚发生指定边沿事件时,锁存(捕获)当前的计数值。这是测量脉冲宽度或频率的典型模式。
实操心得:模式配置的“三步检查法”
- 定基调:先想好你要Timer B做什么?单次延时、周期中断、测频率还是输出PWM?
- 查组合:根据目标,对照上述规则确定
TBMR、TBAMS、TBCMR三位的合法组合。例如,要输出PWM,组合必须是(TBAMS=1, TBCMR=0, TBMR=0x1/0x2)。- 联外围:模式选定后,立刻思考需要配合的其他寄存器。例如,周期模式需要设置GPTMTBILR(重载值),PWM模式需要设置GPTMTBILR(周期)和GPTMTBMATCHR(匹配值/占空比),捕获模式需要配置GPTMCTL中的TBEVENT(边沿选择)。
2.2 计数方向与高级控制位
TBCDIR[4] (Timer B Count Direction):控制计数方向。
0:向下计数(Count Down)。从装载值(GPTMTBILR)开始递减到0。这是PWM模式的固定方向。1:向上计数(Count Up)。从0开始递增到装载值(GPTMTBILR)。重要提示:数据手册明确指出,在PWM或RTC模式下,此位被忽略。PWM固定向下计数,RTC固定向上计数。在单次或周期模式下,你可以根据习惯选择方向。向上计数时,超时或匹配事件发生在计数值等于装载值时;向下计数时,则发生在计数值等于0时。这会影响你计算装载值和匹配值的逻辑。
TBWOT[6] (Timer B Wait-on-Trigger):这是一个高级同步功能位。
0: 常规模式。一旦Timer B被使能(TBEN=1),立即开始计数。1:等待触发模式。即使TBEN=1,Timer B也会保持挂起状态,直到它接收到来自“菊花链”中前一个定时器的超时触发信号。这个功能用于实现多个定时器的精确硬件级同步启动,在需要复杂多路定时控制的场合(如多步进电机控制序列)非常有用。触发源和菊花链结构需要参考数据手册的图11-9。
TBSNAPS[7] (Timer B Snap-Shot Mode):快照模式,仅在周期模式下有效。
0: 禁用。1:启用。在每次超时事件发生时,Timer B自由运行的当前值会被自动捕获并加载到GPTMTBR(和GPTMTBPR)寄存器中。这允许你在不停止定时器的情况下,安全地读取一个“瞬间”的计数值,对于某些需要监控定时器实时状态的调试或特定算法很有帮助。
2.3 更新与加载行为控制
TBILD[8] (Timer B Interval Load Write):控制重载寄存器(GPTMTBILR和GPTMTBPR)的值何时更新到实际工作的计数器(GPTMTBR和GPTMTBV)。
0:立即更新(On the next cycle)。在写入操作后的下一个时钟周期,新值就生效。1:超时更新(On the next timeout)。新值会先被缓存,直到当前计数周期结束(发生超时)时,才更新到工作计数器。为什么需要这个控制?想象一下,你正在用定时器生成一个稳定的PWM波驱动电机。如果在PWM周期中间突然修改了周期或占空比,可能会导致输出产生一个畸变的短脉冲,这可能引起电机抖动甚至损坏。设置为超时更新,可以确保所有参数都在一个周期结束后统一切换,保证输出的连续性。注意:在向上计数模式下,此位无效。
TBMRSU[10] (Timer B Match Register Update):与TBILD类似,但控��的是匹配寄存器(GPTMTBMATCHR和GPTMTBPMR)的更新时机。
0:立即更新。1:超时更新。 同样的道理,在PWM应用中,将TBMRSU设为1,可以避免在修改占空比时产生“毛刺”脉冲。
TBPLO[11] (Timer B PWM Legacy Operation):这是一个PWM输出极性控制位,仅当TBAMS=1(PWM模式)时有效。
0:传统低电平操作。当定时器计数到0重载时,CCP引脚输出低电平。这是较早期的PWM输出行为。1:传统高电平操作。当定时器计数到0重载时,CCP引脚输出高电平。 这个位通常与GPTMCTL寄存器中的TBPWML位(输出电平反转)结合使用,来最终确定PWM输出的初始极性和有效电平。例如,要生成一个初始为高电平、占空比期间为低电平的PWM(即低有效PWM),一种常见的配置是TBPLO=1(重载时高)且TBPWML=1(输出反转),这样实际引脚在重载时为低,匹配点跳变为高。
2.4 中断使能与关键依赖
TBMIE[5] (Timer B Match Interrupt Enable):使能匹配中断。
0: 禁用。1: 使能。当计数值达到GPTMTBMATCHR(和GPTMTBPMR)中设定的匹配值时,会产生中断。仅用于单次和周期模式。这里有一个极其重要的“坑”:数据手册Note中明确指出,即使你在GPTMDMAEV或GPTMADCEV寄存器中设置了通过匹配事件触发DMA或ADC,如果TBMIE=0,那么DMA或ADC请求也不会被发出!这意味着,TBMIE位不仅仅是中断使能,它还是匹配事件对外产生任何触发信号(中断、DMA、ADC)的总开关。如果你配置了匹配触发DMA但DMA不动作,请第一时间检查此位。
TBPWMIE[9] (Timer B PWM Interrupt Enable):使能PWM模式下的捕获事件中断。
0: 禁用。1: 使能。在PWM模式下,根据GPTMCTL中TBEVENT位的配置(上升沿、下降沿或双边沿),在CCP引脚上发生相应事件时产生中断。这可以用于在PWM输出上检测外部事件。
3. 关联寄存器协同配置实战
孤立的GPTMTBMR是无法让Timer B工作的,它必须与一系列寄存器协同配置。下面我们以两个最典型的场景为例,展示完整的配置流程和代码片段。
3.1 场景一:配置Timer B为周期中断模式(系统心跳)
目标:使用Timer B产生一个1ms的周期中断,作为操作系统时基或任务调度器心跳。
步骤与代码实现:
时钟使能与外设启用:首先确保系统时钟和GPTM模块时钟已启用(通过
SYSCTL_RCGCGPTM_R寄存器)。这是所有外设操作的前提。// 假设使用16/32位定时器1的Timer B (WTIMER1B) #define GPTM1_BASE 0x40031000 #define GPTM1_CTL (*((volatile uint32_t *)(GPTM1_BASE + 0x00C))) #define GPTM1_CFG (*((volatile uint32_t *)(GPTM1_BASE + 0x000))) #define GPTM1_TBMR (*((volatile uint32_t *)(GPTM1_BASE + 0x008))) #define GPTM1_CTL (*((volatile uint32_t *)(GPTM1_BASE + 0x00C))) #define GPTM1_TBILR (*((volatile uint32_t *)(GPTM1_BASE + 0x02C))) #define GPTM1_IMR (*((volatile uint32_t *)(GPTM1_BASE + 0x018))) #define GPTM1_ICR (*((volatile uint32_t *)(GPTM1_BASE + 0x024))) // 1. 使能GPTM1模块时钟 SYSCTL->RCGCGPTM |= (1UL << 1); // 置位第1位,使能GPTM1 __asm("NOP"); __asm("NOP"); __asm("NOP"); // 等待时钟稳定禁用定时器(黄金法则):在修改任何配置寄存器(尤其是GPTMCFG, GPTMTBMR, GPTMCTL)之前,必须先禁用定时器。
GPTM1_CTL &= ~(1UL << 8); // 清除TBEN位(第8位),禁用Timer B配置全局模式(GPTMCFG):选择32位定时器模式。
0x0代表32位模式。GPTM1_CFG = 0x00000000; // 32-bit timer configuration配置Timer B模式(GPTMTBMR):设置为周期模式,并配置更新行为。我们希望参数立即更新,计数方向向下。
uint32_t tbrmr_value = 0; tbrmr_value |= (0x2 << 0); // TBMR[1:0] = 0x2 (Periodic mode) tbrmr_value |= (0x0 << 4); // TBCDIR = 0 (Count down) tbrmr_value |= (0x0 << 8); // TBILD = 0 (立即更新周期值) tbrmr_value |= (0x0 << 10); // TBMRSU = 0 (立即更新匹配值,本例未用) GPTM1_TBMR = tbrmr_value;设置周期值(GPTMTBILR):计算1ms对应的计数值。假设系统时钟为16MHz,则1ms需要
16000000 Hz * 0.001 s = 16000个周期。由于是向下计数到0触发,所以初始装载值应为计数值 - 1 = 15999。#define SYSTEM_CLOCK_HZ 16000000 #define INTERVAL_MS 1 uint32_t load_value = (SYSTEM_CLOCK_HZ / 1000 * INTERVAL_MS) - 1; GPTM1_TBILR = load_value; // 例如 15999配置中断(GPTMIMR):使能超时中断。
GPTM1_IMR |= (1UL << 8); // 置位TBTOIM位(第8位),使能Timer B超时中断 // 在NVIC中使能GPTM1中断 NVIC_EnableIRQ(TIMER1B_IRQn);最后使能定时器(GPTMCTL):完成所有配置后,再启动定时器。
GPTM1_CTL |= (1UL << 8); // 置位TBEN位,使能Timer B中断服务程序(ISR):在中断中清除标志位。
void TIMER1B_Handler(void) { if (GPTM1_MIS & (1UL << 8)) { // 检查TBTOMIS位 GPTM1_ICR = (1UL << 8); // 写1清除TBTORIS和TBTOMIS // 你的1ms定时任务在这里执行 } }
3.2 场景二:配置Timer B为PWM模式驱动LED
目标:使用Timer B生成一个频率为1kHz,占空比为30%的PWM波,驱动LED实现调光。
步骤与代码实现:
时钟使能与引脚复用:使能GPTM模块时钟,并将对应CCP引脚配置为定时器输出功能(通过
GPIO_AFSEL和GPIO_PCTL寄存器)。假设使用PB6作为WTIMER1B的CCP引脚。// 使能GPIOB和GPTM1时钟 SYSCTL->RCGCGPIO |= (1UL << 1); // GPIOB SYSCTL->RCGCGPTM |= (1UL << 1); // GPTM1 __asm("NOP"); __asm("NOP"); __asm("NOP"); // 配置PB6为外设功能 GPIOB->AFSEL |= (1UL << 6); // 启用PB6的备用功能 GPIOB->PCTL &= ~(0xFUL << 24); // 清除PB6的PMCx位域 GPIOB->PCTL |= (0x7UL << 24); // 设置PB6为WTIMER1B CCP (查阅数据手册表) GPIOB->DEN |= (1UL << 6); // 数字使能禁用定时器。
GPTM1_CTL &= ~(1UL << 8); // 禁用Timer B配置全局模式:选择32位模式。
GPTM1_CFG = 0x00000000;配置Timer B为PWM模式:这是关键步骤,必须严格按照组合设置。
uint32_t tbrmr_value = 0; tbrmr_value |= (0x2 << 0); // TBMR[1:0] = 0x2 (Periodic mode, PWM必须用0x1或0x2) tbrmr_value |= (0x0 << 2); // TBCMR = 0 (PWM模式必须为0) tbrmr_value |= (0x1 << 3); // TBAMS = 1 (启用PWM模式) tbrmr_value |= (0x0 << 8); // TBILD = 0 (立即更新周期) tbrmr_value |= (0x1 << 10); // TBMRSU = 1 (超时更新匹配值,避免占空比更新毛刺) tbrmr_value |= (0x1 << 11); // TBPLO = 1 (重载时输出高电平) GPTM1_TBMR = tbrmr_value;设置PWM周期和占空比:
- 周期:1kHz对应周期T=1/1000=1ms。计数值计算同上例,
load_value = 15999。 - 匹配值(决定占空比):30%占空比意味着高电平时间为0.3ms。在
TBPLO=1且TBPWML=0(默认不反转)的情况下,输出在计数值等于匹配值时从高变低,在重载(计数值为0)时从低变高。因此,匹配值应设置为load_value * (1 - duty_cycle) = 15999 * 0.7 ≈ 11199。我们将其写入GPTMTBMATCHR。
#define PWM_FREQ_HZ 1000 #define PWM_DUTY_PERCENT 30 uint32_t period_ticks = (SYSTEM_CLOCK_HZ / PWM_FREQ_HZ) - 1; // 15999 uint32_t match_ticks = period_ticks * (100 - PWM_DUTY_PERCENT) / 100; // 11199 GPTM1_TBILR = period_ticks; // 设置周期 GPTM1_TBMATCHR = match_ticks; // 设置匹配值(占空比)- 周期:1kHz对应周期T=1/1000=1ms。计数值计算同上例,
配置PWM输出极性(可选,在GPTMCTL中):如果我们希望PWM默认输出低电平,高电平为有效脉宽(即低有效),可以启用输出反转。
// 在GPTMCTL寄存器中设置TBPWML位 GPTM1_CTL |= (1UL << 14); // 置位TBPWML,输出反转 // 此时,由于TBPLO=1(重载高),再经过反转(TBPWML=1),实际引脚在重载时为低电平。 // 当计数值向下计数到匹配值(match_ticks)时,输出翻转为高电平,持续到下一个重载点。 // 这样,高电平时间 = (period_ticks - match_ticks) / clock,对应30%占空比。使能定时器。
GPTM1_CTL |= (1UL << 8); // 使能Timer B
注意事项:PWM模式下的匹配值逻辑PWM模式下匹配值(GPTMTBMATCHR)与输出电平的关系,取决于
TBPLO和TBPWML的组合,容易混淆。一个简单的记忆方法是:先看TBPLO决定重载点电平,再看TBPWML决定是否反转。
(TBPLO=0, TBPWML=0): 重载低,匹配变高。占空比 = (匹配值) / (周期值)。(TBPLO=1, TBPWML=0): 重载高,匹配变低。占空比 = (周期值 - 匹配值) / (周期值)。(TBPLO=0, TBPWML=1): 重载低且反转 -> 重载高,匹配变低。占空比 = (周期值 - 匹配值) / (周期值)。(TBPLO=1, TBPWML=1): 重载高且反转 -> 重载低,匹配变高。占空比 = (匹配值) / (周期值)。 实际项目中,建议先用逻辑分析仪抓取波形,验证配置是否符合预期。
4. 关键配置禁忌与常见问题排查
即使按照手册配置,也可能会遇到定时器不工作、中断不触发、PWM无输出等问题。下面是我总结的几个最常见“坑点”和排查思路。
4.1 配置禁忌清单
- 修改配置前未禁用定时器:这是最根本的原则。数据手册在GPTMTBMR和GPTMCTL的“Important”中明确强调,修改这些寄存器的位之前,必须确保对应的
TBEN位为0。否则,行为不可预测,可能导致配置无法生效或定时器行为异常。 - PWM模式配置组合错误:启用PWM模式 (
TBAMS=1) 时,必须同时满足TBCMR=0且TBMR=0x1或0x2。任何一个条件不满足,PWM模式都无法正确启用。 - 忽略
TBMIE对DMA/ADC触发的影响:如前所述,TBMIE是匹配事件对外发送触发信号的总开关。即使你在DMA或ADC事件使能寄存器中配置了触发源,如果TBMIE=0,触发信号也不会产生。 - 错误理解保留位(Reserved Bits):寄存器中标记为“reserved”的位,必须保持其复位值或在读-修改-写操作中保留原值。随意写入可能影响未来芯片版本的兼容性,甚至导致立即的未定义行为。
- 在错误的时间点读取计数寄存器:直接读取GPTMTBR(计数器值寄存器)可能读到正在变化的不稳定值。在需要精确读数的场合(如输入捕获模式读取捕获值),应读取GPTMTBV(快照值寄存器),或者在读取前确保定时器已停止(
TBEN=0)。
4.2 常见问题排查速查表
| 问题现象 | 可能原因 | 排查步骤 |
|---|---|---|
| 定时器完全不计数 | 1. GPTM模块时钟未使能。 2. TBEN位未置1。3. 在 TBWOT=1模式下,未收到触发信号。 | 1. 检查SYSCTL_RCGCGPTM对应位。2. 检查GPTMCTL寄存器的TBEN位。 3. 检查触发源定时器是否已产生超时。 |
| 周期中断不触发 | 1. 中断未使能(GPTMIMR中的TBTOIM位)。2. NVIC中断未使能。 3. 周期值(GPTMTBILR)设置过大或为0。 4. 中断标志未清除,导致后续中断被屏蔽。 | 1. 检查GPTMIMR寄存器。 2. 检查NVIC的ISER寄存器。 3. 确认装载值计算正确(计数值-1)。 4. 在ISR中读取GPTMMIS后,向GPTMICR相应位写1清除。 |
| PWM无输出或波形不对 | 1. PWM模式配置组合错误(TBAMS,TBCMR,TBMR)。2. CCP引脚未正确配置为外设功能(AFSEL, PCTL)。 3. 周期值或匹配值设置错误(为0或过大)。 4. 输出极性( TBPLO和TBPWML)理解错误,导致占空比计算逻辑反了。5. 匹配值大于周期值。 | 1. 仔细核对GPTMTBMR寄存器的0-3位。 2. 检查对应GPIO的AFSEL和PCTL寄存器。 3. 用示波器或逻辑分析仪测量引脚,检查周期是否与计算值相符。 4. 根据上述“PWM模式下的匹配值逻辑”重新计算匹配值。 5. 确保 match_value < interval_load_value。 |
| 修改PWM占空比后输出有毛刺 | 匹配寄存器更新模式TBMRSU设置为立即更新(0),在PWM周期中间修改了GPTMTBMATCHR。 | 将TBMRSU位设置为1(超时更新),确保新占空比在下一个PWM周期开始时生效。 |
| 输入捕获值不准 | 1. 未正确配置捕获边沿(GPTMCTL中的TBEVENT)。2. 计数器在捕获发生时已溢出。 3. 读取了不稳定的GPTMTBR值。 | 1. 确认TBEVENT位与待测信号边沿一致。2. 对于长脉冲测量,需启用计数器溢出中断并记录溢出次数。 3. 读取捕获事件锁存后的GPTMTBV寄存器值,或先停止定时器再读取。 |
| DMA/ADC由匹配事件触发失败 | TBMIE位(匹配中断使能)为0。 | 记住:TBMIE是匹配事件触发输出的总闸门!即使不用中断,也要将其置1才能使能DMA/ADC触发。 |
4.3 调试技巧:寄存器状态检查
当问题出现时,不要盲目修改代码。系统地读取并打印相关寄存器的值,与你的预期配置进行比对,是最高效的调试方法。可以编写一个简单的调试函数:
void debug_print_timerb_registers(uint32_t base) { printf("GPTMCFG: 0x%08X\n", *(volatile uint32_t *)(base + 0x000)); printf("GPTMTBMR: 0x%08X\n", *(volatile uint32_t *)(base + 0x008)); printf("GPTMCTL: 0x%08X\n", *(volatile uint32_t *)(base + 0x00C)); printf("GPTMTBILR: 0x%08X\n", *(volatile uint32_t *)(base + 0x02C)); printf("GPTMTBMATCHR: 0x%08X\n", *(volatile uint32_t *)(base + 0x030)); printf("GPTMIMR: 0x%08X\n", *(volatile uint32_t *)(base + 0x018)); printf("GPTMRIS: 0x%08X\n", *(volatile uint32_t *)(base + 0x01C)); printf("GPTMMIS: 0x%08X\n", *(volatile uint32_t *)(base + 0x020)); }通过对比GPTMRIS(原始中断状态)和GPTMMIS(已屏蔽中断状态),可以快速判断是中断事件未产生,还是中断被屏蔽了。GPTMCTL中的TBEN位和GPTMTBMR中的模式位是首要检查对象。
5. 高级应用:多定时器同步与触发链
TM4C123的GPTM模块提供了一个强大的同步寄存器(GPTMSYNC),它允许软件同时触发多个定时器的超时事件,实现硬件级的精确同步。这个功能在模块0(Timer0-5, WideTimer0-5)上可用。
应用场景:假设你需要控制三个步进电机,要求它们严格同时启动,或者按照精确的相位差启动。使用软件先后使能的方式会引入微秒级的误差,而GPTMSYNC可以做到近乎同时的硬件触发。
配置要点:
- 配置从定时器:将需要被同步的定时器(例如Timer1B, Timer2A)配置为等待触发模式,即将其
TBWOT或TAWOT位置1。同时,将它们禁用(TBEN=0或TAEN=0)。 - 配置主定时器:选择一个定时器作为触发源(例如Timer0A),将其配置为所需的模式(如单次或周期),并使能。
- 设置同步寄存器:当主定时器达到超时条件时,你需要手动设置GPTMSYNC寄存器来触发从定时器。例如,要触发Timer1B和Timer2A的超时事件(假设它们都是16/32位定时器):
// 假设GPTM0_BASE是GPTM模块0的基地址(0x4003.0000) #define GPTM0_SYNC (*((volatile uint32_t *)(GPTM0_BASE + 0x010))) // SYNCT1[1:0]对应Timer1, 0x2表示触发Timer B // SYNCT2[5:4]对应Timer2, 0x1表示触发Timer A GPTM0_SYNC = (0x2 << 0) | (0x1 << 4); // 写入后,Timer1B和Timer2A将同时开始计数。 - 启动流程:先使能主定时器。当主定时器超时并进入中断服务程序(或在主循环中检测到超时标志)时,在ISR或相应代码位置写入GPTMSYNC寄存器,从而一次性触发所有配置为等待模式的从定时器。
注意事项:GPTMSYNC寄存器是一个“触发即清”的寄存器。你写入的值在产生同步脉冲后不会保持。同步操作本身不会自动重复,每次需要同步启动时,都需要在适当的时机(通常是在主定时器超时处理中)重新写入GPTMSYNC。这个功能将同步的精度从软件指令级提升到了硬件时钟边沿级,对于高精度的多轴协同控制至关重要。
通过对GPTMTBMR及其关联寄存器的深入理解和正确配置,你可以充分发挥Tiva™ TM4C123BH6ZRB定时器模块的潜力,构建出稳定、精准、高效的嵌入式时序控制系统。记住,寄存器编程的关键在于细心和对硬件机制的透彻理解,每设置一个位,都要清楚它将对硬件产生何种影响。
