Tiva™ TM4C129DNCPDT通用定时器寄存器级编程实战指南
1. 从零开始理解Tiva™ TM4C129DNCPDT的通用定时器在嵌入式开发的世界里时间就是一切。无论是让一个LED灯精确地每秒闪烁一次还是驱动一个步进电机以特定转速旋转亦或是捕捉一个外部按键按下的精确时长背后都离不开一个核心硬件——通用定时器。对于初次接触德州仪器Tiva™ C系列微控制器特别是像TM4C129DNCPDT这样功能强大的器件的朋友来说面对动辄上百页的数据手册和密密麻麻的寄存器位域很容易感到无从下手。我最初接触TM4C129时也有同感。它的通用定时器模块功能异常丰富远不止简单的“数时钟脉冲”那么简单。它可以配置成单次触发、周期性定时、输入捕获边沿计数或边沿时间测量以及生成PWM波等多种模式几乎涵盖了嵌入式系统中所有与时间相关的需求。但强大的功能也意味着复杂的配置。如果你只是照搬例程代码一旦需求稍有变化很可能就会陷入“知其然不知其所以然”的困境调试起来异常痛苦。因此我决定抛开库函数和驱动库回归最本质的寄存器级编程把GPTM模块彻底吃透。这篇文章就是我啃完数据手册、经过多个项目实践后为你梳理的一份“保姆级”指南。我们将聚焦于最常用也最核心的三种模式输入边沿计数、输入边沿定时和PWM生成并深入每一个关键寄存器解释每一个配置位的含义。我的目标是让你读完本文后不仅能配置出需要的功能更能理解每一个配置步骤背后的逻辑真正做到举一反三独立驾驭这颗芯片的定时器外设。2. 核心架构与工作模式总览在深入寄存器之前我们必须先建立起对TM4C129DNCPDT的GPTM模块的整体认知。这有助于我们理解后续所有配置步骤的来龙去脉。2.1 GPTM模块的基本结构TM4C129DNCPDT微控制器提供了多达8个通用定时器模块GPTM编号为0到7。其中Timer 0到Timer 5的基地址是连续的0x4003.0000开始而Timer 6和Timer 7的基地址则位于另一个外设区域0x400E.0000。每个GPTM模块在物理上包含两个独立的16位定时器Timer A和Timer B。这是理解所有配置的基石。这两个16位定时器既可以独立工作也可以串联起来形成一个32位定时器这通过GPTM配置寄存器中的模式选择位来决定。当作为32位定时器使用时Timer A作为高16位Timer B作为低16位此时绝大多数配置都由Timer A的寄存器GPTMTAMR等控制Timer B的相应寄存器被忽略。这种灵活性使得我们可以根据实际需求精度 vs. 数量来分配定时器资源。每个定时器的核心是一个递减计数器在大多数模式下。它从一个初始值加载到GPTMTnILR寄存器开始每来一个时钟脉冲就减1直到减到0此时会产生一个“超时”事件。这个“时钟脉冲”的来源可以是系统时钟经过预分频器分频后的信号。预分频器由GPTMTnPR寄存器控制它可以将计数频率进一步降低从而实现更长的定时周期。简单来说定时周期 GPTMTnILR值 1 * GPTMTnPR值 1 / 系统时钟频率。2.2 关键工作模式解析根据数据手册GPTM可以配置为多种模式我们重点剖析工程中最常用的三种输入边沿计数模式此模式下定时器不再由内部时钟驱动而是变成一个事件计数器。它等待外部引脚CCP引脚上发生的边沿事件上升沿、下降沿或双边沿。每检测到一次指定的边沿计数器就减1。当计数器减到0时表示预设数量的事件已经发生可以触发中断。这常用于测量旋转编码器的脉冲数、统计按键按压次数等场景。输入边沿定时模式此模式用于测量时间间隔。定时器由内部时钟驱动持续运行。当外部引脚上发生指定的边沿事件时定时器会瞬间“冻结”当前计数器的值并将其锁存到GPTMTnR寄存器中。通过读取这个锁存值我们就可以计算出从定时器启动到边沿事件发生所经过的精确时间。这是测量脉冲宽度、信号周期或事件间延迟的利器。PWM模式这是脉冲宽度调制模式。定时器在周期性模式下工作产生一个周期固定的方波。通过设置GPTMTnMATCHR寄存器可以改变方波中高电平或低电平的持续时间从而改变占空比。PWM广泛应用于控制LED亮度、电机速度、舵机角度等。注意在配置任何模式之前有一个黄金法则必须先禁用目标定时器将GPTMCTL寄存器中的TnEN位清零。在定时器运行期间修改其配置寄存器如GPTMCFG, GPTMTnMR可能导致不可预测的行为。这是一个非常容易忽略但至关重要的安全操作。3. 寄存器详解配置的核心战场理解了框架我们进入实战环节——逐一拆解配置这些模式所涉及的核心寄存器。我会用“配置PWM模式”作为主线任务将各个寄存器的功能串联起来讲解这样更有代入感。3.1 全局配置寄存器GPTM配置寄存器是模块的“总开关”它决定了定时器的基本位宽和运行框架。GPTM Configuration Register (GPTMCFG) - 偏移量 0x000这个32位寄存器只有低3位GPTMCFG[2:0]是有效的。对于我们最常见的应用只需要关注两个值0x0: 选择32位定时器模式。此时Timer A和Timer B串联。0x4: 选择16位定时器模式。此时Timer A和Timer B作为两个独立的16位定时器使用。例如如果我们想用Timer A产生一个PWM信号同时用Timer B做输入捕获那么就必须将GPTMCFG配置为0x4让它们独立工作。配置为32位模式通常是为了获得更长的定时周期因为计数器范围从65535变成了约42.9亿。3.2 定时器模式寄存器这是模式配置的核心每个定时器A和B都有自己的模式寄存器结构完全相同。GPTM Timer A Mode Register (GPTMTAMR) - 偏移量 0x004GPTM Timer B Mode Register (GPTMTBMR) - 偏移量 0x008这个寄存器内容非常丰富我们拆开看TAMR[1:0]/TBMR[1:0](位1-0)定时器模式选择。这是决定工作模式的基础。0x1: 单次触发模式。计数器减到0后停止需手动重启。0x2:周期性模式。计数器减到0后自动从GPTMTnILR重载初值并继续计数。PWM模式就是基于周期性模式工作的。0x3: 输入捕获模式用于边沿计数和边沿定时。TAAMS/TBAMS(位3)交替模式选择。此位为0时定时器处于捕获或比较模式为1时则进入PWM模式。注意要启用PWM必须同时将此位置1并将TACMR/TBCMR清零。TACMR/TBCMR(位2)捕获模式选择。仅在TnMR设为捕获模式0x3时有效。0: 边沿计数模式。1: 边沿定时模式。TACDIR/TBCDIR(位4)计数方向。0为递减1为递增。需要注意的是在PWM模式下此位被忽略强制为递减计数在RTC模式下强制为递增。TAILD/TBILD(位8)间隔加载模式。控制何时将GPTMTnILR的值更新到实际计数器GPTMTnR。0: 立即更新。在写入GPTMTnILR后的下一个时钟周期生效。1: 下次超时更新。在下次计数器归零时生效。这在需要同步、无毛刺地改变PWM周期时非常有用。PWM模式配置示例假设我们要配置Timer A为PWM模式。那么我们需要向GPTMTAMR写入的值应满足TAAMS1(PWM模式)TACMR0(非捕获模式)TAMR2(周期性模式)。假设其他位保持默认值0那么写入GPTMTAMR的值应为(13) | (20) 0x0000.000A。3.3 控制寄存器GPTM Control Register (GPTMCTL) - 偏移量 0x00C这个寄存器负责更精细的控制和功能使能。TAEN/TBEN(位0, 8)定时器使能位。这是定时器的“启动按钮”。所有配置完成后最后一步就是将此位置1定时器才开始工作。TAEVENT/TBEVENT(位3:2, 11:10)事件边沿选择。在输入捕获模式下用来选择捕获哪种边沿事件上升沿0x0下降沿0x1双边沿0x3。在PWM模式下此字段用于选择在何种PWM边沿产生中断。TAPWML/TBPWML(位6, 14)PWM输出电平控制。这是一个非常实用的位。0: 输出不受影响。通常意味着“匹配时输出低周期开始时输出高”的标准PWM。1: 输出取反。这直接改变了PWM的极性。例如原本是“高电平有效”的PWM取反后就变成了“低电平有效”。这在驱动某些需要共阳极接法的LED或特定的电机驱动桥时非常方便无需改动硬件电路。TAOTE/TBOTE(位5, 13)输出触发使能。将此位置1后定时器的超时或匹配事件可以触发ADC开始一次转换。这对于需要周期性、精准采样的应用如电机电流环控制至关重要实现了硬件级的定时采样无需CPU干预。3.4 关键数据寄存器配置好了模式和控制接下来就是设定具体的定时参数。GPTM Timer n Interval Load Register (GPTMTnILR) - 偏移量 0x028 (A), 0x02C (B)这是周期寄存器。在周期性或PWM模式下它定义了计数器的重载值即PWM的周期。定时器从该值开始递减到0后触发超时并重载。周期 (GPTMTnILR 1) * (GPTMTnPR 1) / 系统时钟频率。GPTM Timer n Match Register (GPTMTnMATCHR) - 偏移量 0x030 (A), 0x034 (B)这是匹配寄存器。在PWM模式下它定义了输出电平发生翻转的计数值即PWM的脉冲宽度占空比。当递减计数器等于这个匹配值时PWM输出翻转。高电平时间假设非反转模式 (GPTMTnMATCHR 1) * (GPTMTnPR 1) / 系统时钟频率。GPTM Timer n Prescale Register (GPTMTnPR) - 偏移量 0x038 (A), 0x03C (B)预分频寄存器。用于扩展定时范围。计数器每计数GPTMTnPR 1个系统时钟才减1。这相当于将计数频率降低了GPTMTnPR 1倍。例如系统时钟80MHz若GPTMTnPR设为99则计数器实际时钟为80MHz / (991) 800kHz。实操心得在计算PWM周期和占空比时一定要牢记“1”。因为计数器是从加载值N递减到0总共经历了N1个时钟周期。这是很多新手容易出错的地方。例如想要1ms的周期系统时钟80MHz预分频设为0即不分频那么GPTMTnILR应该设置为 (0.001s * 80,000,000 Hz) - 1 79999。4. 实战演练三种模式的配置流程与代码实现理论说得再多不如一行代码。下面我将以Timer A为例展示如何通过直接操作寄存器配置上述三种模式。这里假设系统时钟已配置为80MHz并且相关GPIO引脚CCP0已初始化为外设功能。4.1 模式一输入边沿计数配置场景统计连接到CCP0引脚的外部按钮的按下次数下降沿触发计满10次后产生中断。// 1. 确保定时器禁用 HWREG(GPTM0_BASE GPTM_O_CTL) ~(GPTM_CTL_TAEN); // 2. 配置为16位定时器模式 HWREG(GPTM0_BASE GPTM_O_CFG) GPTM_CFG_16_BIT; // 3. 配置Timer A为输入边沿计数模式 uint32_t ui32Mode HWREG(GPTM0_BASE GPTM_O_TAMR); ui32Mode ~(GPTM_TAMR_TAMR_M | GPTM_TAMR_TACMR); // 先清零模式位和捕获模式位 ui32Mode | GPTM_TAMR_TACMR; // TACMR1 等等不对根据手册边沿计数模式TACMR应为0。 // 更正对于边沿计数TAMR应设为0x3捕获模式TACMR应设为0边沿计数。 ui32Mode | (GPTM_TAMR_TAMR_CAP | GPTM_TAMR_TACMR_EDGCNT); // TAMR0x3, TACMR0 HWREG(GPTM0_BASE GPTM_O_TAMR) ui32Mode; // 4. 配置捕获事件类型为下降沿 HWREG(GPTM0_BASE GPTM_O_CTL) ~(GPTM_CTL_TAEVENT_M); // 清零事件字段 HWREG(GPTM0_BASE GPTM_O_CTL) | GPTM_CTL_TAEVENT_NEG; // 下降沿 // 5. 设置预分频器这里不需要分频设为0 HWREG(GPTM0_BASE GPTM_O_TAPR) 0; // 6. 加载计数值我们想计10次所以从9开始递减到0 HWREG(GPTM0_BASE GPTM_O_TAILR) 10 - 1; // 计数值 期望事件数 - 1 // 7. 使能捕获事件中断 HWREG(GPTM0_BASE GPTM_O_IMR) | GPTM_IMR_CAEIM; // 8. 使能定时器开始等待边沿事件 HWREG(GPTM0_BASE GPTM_O_CTL) | GPTM_CTL_TAEN; // 9. 中断服务函数中需要清除标志位 void Timer0A_Handler(void) { if(HWREG(GPTM0_BASE GPTM_O_RIS) GPTM_RIS_CAERIS) { // 处理计满10次的事件... HWREG(GPTM0_BASE GPTM_O_ICR) GPTM_ICR_CAECINT; // 写1清除捕获事件中断标志 } }关键点解析在步骤3中我故意先写了一个常见的错误将TACMR设为1然后进行了更正。TACMR位在TAMR设为捕获模式0x3时才有效0代表边沿计数1代表边沿定时。这个细节很容易混淆务必对照手册仔细核对。4.2 模式二输入边沿定时配置场景测量CCP0引脚上一个高电平脉冲的宽度。// 1. 禁用定时器 HWREG(GPTM0_BASE GPTM_O_CTL) ~(GPTM_CTL_TAEN); // 2. 配置为16位定时器模式 HWREG(GPTM0_BASE GPTM_O_CFG) GPTM_CFG_16_BIT; // 3. 配置Timer A为输入边沿定时模式 uint32_t ui32Mode HWREG(GPTM0_BASE GPTM_O_TAMR); ui32Mode ~(GPTM_TAMR_TAMR_M | GPTM_TAMR_TACMR); ui32Mode | (GPTM_TAMR_TAMR_CAP | GPTM_TAMR_TACMR_TIME); // TAMR0x3, TACMR1 (边沿定时) HWREG(GPTM0_BASE GPTM_O_TAMR) ui32Mode; // 4. 配置捕获事件类型为上升沿假设测量高电平从上升沿开始捕获 HWREG(GPTM0_BASE GPTM_O_CTL) ~(GPTM_CTL_TAEVENT_M); HWREG(GPTM0_BASE GPTM_O_CTL) | GPTM_CTL_TAEVENT_POS; // 上升沿 // 5. 设置预分频器。系统时钟80MHz若想测量较长时间可适当分频。 // 例如分频到1MHz计数频率便于计算微秒数。 HWREG(GPTM0_BASE GPTM_O_TAPR) 80 - 1; // 预分频值 (80MHz / 1MHz) - 1 79 // 6. 加载定时器初始值最大值0xFFFF因为我们是16位模式递减计数 HWREG(GPTM0_BASE GPTM_O_TAILR) 0xFFFF; // 7. 使能捕获事件中断 HWREG(GPTM0_BASE GPTM_O_IMR) | GPTM_IMR_CAEIM; // 8. 使能定时器开始自由运行计数 HWREG(GPTM0_BASE GPTM_O_CTL) | GPTM_CTL_TAEN; // 中断服务函数 void Timer0A_Handler(void) { if(HWREG(GPTM0_BASE GPTM_O_RIS) GPTM_RIS_CAERIS) { // 读取捕获到的计时器值 uint32_t ui32CaptureValue HWREG(GPTM0_BASE GPTM_O_TAR); // 脉冲宽度 (0xFFFF - ui32CaptureValue) * (79 1) / 80MHz // 注意因为是递减计数初始值最大捕获值是事件发生时的剩余值。 // 实际经过的计数值 初始值 - 捕获值 0xFFFF - ui32CaptureValue。 uint32_t ui32PulseWidthTicks 0xFFFF - ui32CaptureValue; float fPulseWidthUs (ui32PulseWidthTicks * 80.0) / 80.0; // 这里因为预分频80计数器频率1MHz1tick1us // fPulseWidthUs 即为以微秒为单位的脉冲宽度 HWREG(GPTM0_BASE GPTM_O_ICR) GPTM_ICR_CAECINT; // 清除中断标志 // 如果需要连续测量定时器会继续运行等待下一个上升沿。 // 注意读取GPTM_O_TAR后该值即为事件发生时的瞬间值不会自动重置。 } }关键点解析边沿定时模式下定时器是自由运行的。捕获事件发生时当前计数器的值被“快照”到GPTMTnR寄存器中。计算时间间隔时需要根据计数方向这里是递减和初始值来换算。另外预分频器的设置直接影响测量精度和量程需要根据待测信号的大致范围来权衡。4.3 模式三PWM模式配置场景在CCP0引脚上产生一个频率为1kHz占空比为30%的PWM信号。// 1. 禁用定时器 HWREG(GPTM0_BASE GPTM_O_CTL) ~(GPTM_CTL_TAEN); // 2. 配置为16位定时器模式独立PWM输出 HWREG(GPTM0_BASE GPTM_O_CFG) GPTM_CFG_16_BIT; // 3. 配置Timer A为PWM模式 uint32_t ui32Mode HWREG(GPTM0_BASE GPTM_O_TAMR); ui32Mode ~(GPTM_TAMR_TAMR_M | GPTM_TAMR_TACMR | GPTM_TAMR_TAAMS); ui32Mode | (GPTM_TAMR_TAMR_PERIOD | GPTM_TAMR_TAAMS); // TAMR0x2 (周期性), TAAMS1 (PWM模式) // TACMR默认为0符合PWM模式要求。 HWREG(GPTM0_BASE GPTM_O_TAMR) ui32Mode; // 4. 配置PWM输出极性可选这里使用默认非反转 HWREG(GPTM0_BASE GPTM_O_CTL) ~(GPTM_CTL_TAPWML); // TAPWML0匹配时输出低周期开始输出高 // 5. 设置预分频器。系统时钟80MHz目标PWM频率1kHz。 // 先确定不分频情况下的周期计数值Period 80,000,000 / 1,000 80,000。 // 这个值超过了16位定时器的最大值65535所以必须使用预分频。 // 选择预分频值使得 (GPTMTnILR 1) 在一个合理的范围内比如几千。 // 假设我们选择预分频为 80-1 79则定时器时钟 80MHz / 80 1MHz。 HWREG(GPTM0_BASE GPTM_O_TAPR) 79; // 预分频寄存器写入79 // 6. 计算并设置周期值GPTMTAILR。 // 新的周期计数值 1MHz / 1kHz 1000。 // 因为计数器从N递减到0所以 GPTMTAILR 1000 - 1 999。 HWREG(GPTM0_BASE GPTM_O_TAILR) 999; // 7. 计算并设置匹配值GPTMTAMATCHR决定占空比。 // 占空比30%则高电平时间 周期 * 30% 1000 ticks * 0.3 300 ticks。 // 在递减计数、非反转模式下当计数器值等于匹配值时输出从高变低。 // 因此匹配值 周期计数值 - 高电平ticks 999 - 300 699。 // 另一种理解计数器从999开始减减到699时翻转高电平持续了(999-699)300个 ticks。 HWREG(GPTM0_BASE GPTM_O_TAMATCHR) 699; // 8. 可选如果需要PWM边沿中断在此配置TAEVENT并设置TAPWMIE位。 // 本例不需要故跳过。 // 9. 使能定时器开始产生PWM输出 HWREG(GPTM0_BASE GPTM_O_CTL) | GPTM_CTL_TAEN;关键点解析PWM配置的核心在于三个值的计算预分频值、周期值和匹配值。计算时务必统一单位都是分频后的时钟周期数。占空比的实现逻辑与计数方向和输出极性紧密相关。在递减计数、非反转模式下匹配值越小高电平时间越短占空比越小。如果设置了输出反转TAPWML1则逻辑相反。务必在纸上画一下计数器递减波形和输出翻转的关系这是理解PWM配置的关键。5. 调试宝典常见问题与实战排查技巧即使按照手册一步步配置在实际调试中依然会遇到各种问题。下面是我在项目中踩过的一些“坑”以及解决方法。5.1 PWM无输出或波形异常问题现象代码运行后用示波器测量CCP引脚没有信号或者信号频率、占空比完全不对。排查思路检查GPIO复用这是最常见的原因CCP引脚默认是GPIO功能必须将其复用为定时器外设功能。使用GPIOPinConfigure()和GPIOPinTypeTimer()函数如果使用TivaWare或直接配置GPIOAFSEL和GPIOPCTL寄存器将引脚映射到对应的Timer CCP功能上。务必查阅数据手册的“引脚复用”章节确认你使用的引脚支持Timer功能。确认定时器时钟已使能在访问任何定时器寄存器前必须通过SYSCTL_RCGCGPTM_R寄存器使能对应定时器模块的时钟。例如使能GPTM0HWREG(SYSCTL_BASE SYSCTL_O_RCGCGPTM) | 0x01;。使能后最好插入几个空操作循环等待外设时钟稳定这是手册明确要求的。复查寄存器配置顺序是否在定时器使能TAEN1后才修改了GPTMCFG或GPTMTnMR一定要遵循“先禁用再配置最后使能”的铁律。验证计算值用调试器或通过串口打印出你写入GPTMTAILR和GPTMTAMATCHR的值。检查它们是否在16位范围内0-65535并且匹配值是否小于周期值。如果匹配值大于或等于周期值PWM输出可能恒为高或恒为低。检查输出极性如果你预期的是“高电平有效”但实际是“低电平有效”或者反之检查GPTMCTL中的TAPWML位。5.2 输入捕获无法触发中断问题现象外部事件发生了但程序始终进不了定时器中断服务函数。排查思路中断总开关与优先级首先确认处理器全局中断是否使能对于Cortex-M使用__enable_irq()或设置PRIMASK寄存器。其次在NVIC嵌套向量中断控制器中是否使能了对应定时器中断例如Timer0A并设置了合适的优先级GPTM中断使能位是否设置了GPTMIMR寄存器中对应的中断屏蔽位对于捕获事件是CnEIM位边沿计数或CnMIM位边沿定时这一步很容易遗漏。清除中断标志在中断服务函数中必须向GPTMICR寄存器的对应位写1来清除中断标志。如果忘记清除中断会持续触发或者触发一次后就不再触发取决于中断类型。一个良好的习惯是进入中断后先读取GPTMRIS寄存器判断中断源然后立即清除对应的标志位。事件边沿配置检查GPTMCTL中的TAEVENT字段是否与你实际信号产生的边沿一致用示波器观察输入引脚确认信号质量是否有毛刺或抖动导致多次误触发5.3 定时精度偏差大问题现象设置的1ms定时实际测量可能是1.05ms或0.95ms误差超出预期。排查思路系统时钟源你的系统主时钟SYSCLK是否准确如果使用内部振荡器PIOSC其精度可能只有±1%到±3%。对于精度要求高的应用必须使用外部晶振。预分频器计算预分频器是整数分频。例如从80MHz分频到1kHz理想分频比是80000但GPTMTnPR是16位寄存器最大值65535。你可能需要先进行一次整数分频如80分频到1MHz再用周期寄存器细调。这种两级分频会引入误差吗不会因为最终频率 系统时钟 / ( (预分频值1) * (周期值1) )只要乘积准确频率就准确。中断响应延迟如果你依赖定时器中断来执行周期性任务中断响应时间从触发到进入ISR、ISR执行时间都会引入抖动。对于高精度定时应考虑使用DMA或PWM输出硬件信号而非软件中断。寄存器访问延迟手册中提到在使能定时器模块时钟后需要等待至少3个系统时钟周期才能访问其寄存器。虽然现代编译器优化和流水线使得这个问题不常出现但在极端追求可靠性的代码中可以在时钟使能后插入__nop();之类空指令。5.4 寄存器操作通用技巧使用位域操作而非直接赋值为了避免影响同一寄存器中的其他配置位强烈建议使用“读-改-写”操作。TivaWare提供了一套完善的位定义宏在hw_gptm.h和gptm.h中如GPTM_CTL_TAEN、GPTM_TAMR_TAMR_PERIOD等可以极大地提高代码可读性和安全性。// 推荐使用位操作 HWREG(GPTM0_BASE GPTM_O_CTL) | GPTM_CTL_TAEN; // 仅使能TAEN位 // 不推荐直接赋值可能覆盖其他位 // HWREG(GPTM0_BASE GPTM_O_CTL) 0x01;善用调试器观察寄存器在IDE如Keil, IAR, CCS的调试模式下可以直接查看外设寄存器的窗口。配置后逐一核对关键寄存器GPTMCFG,GPTMTAMR,GPTMCTL,GPTMTAILR,GPTMTAMATCHR的值是否与预期一致。这是最直接的调试手段。理解“影子寄存器”像GPTMTAILR、GPTMTAMATCHR这样的寄存器在某些模式下如TAILD1时写入的值不会立即生效而是有一个“影子寄存器”在背后在下次超时时才更新到实际计数器。如果你在运行时动态修改PWM参数发现变化不是立即生效就要检查TAILD位的配置。