瑞萨RA8D1 AGT定时器:低功耗模式、时钟分频与五大工作模式实战详解
1. 项目概述与核心价值
在嵌入式开发,尤其是对功耗和实时性有严苛要求的应用中,一个灵活、可靠且低功耗的定时器外设往往是项目成败的关键。瑞萨电子的RA8D1微控制器内置的低功耗异步通用定时器(Asynchronous General-purpose Timer, AGT),正是为此类场景量身打造的核心模块。它不仅仅是一个简单的倒计时器,更是一个集成了多种工作模式、支持外部事件触发、并能在深度休眠模式下保持运行的强大时序引擎。
我最近在为一个电池供电的无线传感器节点项目选型和开发时,深入研究了RA8D1的AGT模块。官方手册虽然详尽,但超过八百页的篇幅和寄存器位域的分散描述,让快速上手和精准配置变得颇具挑战。在实际调试中,诸如**低功耗模式(LPM)**下寄存器访问的时序陷阱、**时钟分频(CKS)**与计数源(TCK)切换的耦合关系、以及不同工作模式(如脉冲测量与比较匹配)下的引脚行为,都需要反复翻阅手册和测试才能理清。
本文旨在将这份“踩坑”经验系统化,抛开手册式的平铺直叙,以一线开发者的视角,深入剖析AGT定时器的三大核心机制:低功耗模式的运作原理与安全访问流程、时钟分频系统的配置逻辑与避坑指南,以及五大工作模式(定时器、脉冲输出、事件计数、脉冲宽度/周期测量)的实战配置要点。无论你是正在评估RA8D1,还是已经深陷AGT的调试泥潭,希望这篇结合了原理、实操和“血泪教训”的详解,能为你点亮一盏灯。
2. AGT整体架构与核心寄存器解析
在深入细节之前,我们需要先建立起对AGT模块的全局认知。AGT是一个16位递减计数器,其核心魅力在于“异步”与“通用”。所谓“异步”,是指它可以使用独立的低速时钟(如AGTLCLK)运行,即使在CPU主频降低或进入某些低功耗模式时,也能独立工作,为系统提供“心跳”。而“通用”,则体现在它通过寄存器配置,能化身多种功能的外设。
2.1 寄存器地图与关键寄存器概览
RA8D1提供两个AGT实例(AGT0和AGT1),它们的寄存器结构完全一致,基地址有规律偏移。所有功能都通过对一系列寄存器的读写来控制。以下是几个最核心的寄存器,理解了它们,就掌握了AGT的命脉:
- AGTMR1 (模式寄存器1): 这是模式的“总开关”。
TMOD[2:0]位域决定了AGT工作在五种模式中的哪一种(定时器、脉冲输出等)。TCK[2:0]位域则用于选择计数器的时钟源,例如是内部低速时钟(AGTLCLK)、子时钟(AGTSCLK)还是另一个AGT的溢出信号。特别注意:TCK的选择会直接影响后续分频器(CKS)是否有效。 - AGTMR2 (模式寄存器2): 本文的重点之一。它主要包含两个关键控制位:
CKS[2:0]:时钟分频比选择。当计数源为AGTLCLK或AGTSCLK时,此分频器生效,可将时钟进行1/1到1/128的分频,用于进一步降低计数频率,延长定时周期。LPM:低功耗模式开关。将此位置1后,AGT进入低功耗状态,此时对部分关键寄存器的访问会受到限制,这是实现超低功耗运行的关键,但操作不当会导致读写错误。
- AGTIOC (I/O控制寄存器): 控制AGT与外部引脚交互的行为。包括输入滤波(
TIPF[1:0])、输出使能(TOE)、计数控制(TIOGT[1:0],用于事件计数模式)以及输入/输出极性选择(TEDGSEL)。 - AGTCR (控制寄存器): 包含启动/停止控制位(
TSTART)、计数状态标志(TCSTF)以及各种中断标志位(如溢出标志TUNDF、比较匹配标志TCMAF/TCMBF等)。它是控制定时器“生命”的寄存器。 - AGT/AGTCMA/AGTCMB (计数器和比较寄存器): AGT是16位计数器/重载寄存器。AGTCMA和AGTCMB是两个独立的比较匹配寄存器。它们是实现精准定时的核心,通过写入目标值,配合比较匹配功能,可以在计数器递减到特定值时产生中断或触发事件。
2.2 寄存器访问的“交通规则”
在操作这些寄存器时,手册中强调的几条“铁律”必须遵守,否则会导致不可预测的行为:
- 模式切换必须在停止状态:在更改
AGTMR1(模式/时钟源)、AGTMR2(分频/LPM)、AGTIOC、AGTISR、AGTCMSR这些决定工作模式的寄存器之前,必须确保AGTCR中的TSTART和TCSTF标志位都为0,即定时器完全停止。在计数运行时修改它们,后果自负。 - 启动/停止的延迟:写入
TSTART启动或停止定时器后,硬件需要若干时钟周期来同步状态(TCSTF标志会延迟反映)。在此期间,除了查询TCSTF,不要访问其他AGT寄存器。 - 连续写计数器的间隔:在定时器运行(
TSTART=1且TCSTF=1)时,如果需要对AGT计数器寄存器进行连续写操作,两次写入之间必须间隔至少3个计数源时钟周期。
实操心得:养成一个好习惯,在编写任何AGT配置函数时,第一步总是先停止定时器(
TSTART=0),然后循环等待TCSTF变为0。配置完成后,再启动定时器,并等待TCSTF变为1。这个简单的等待循环能避免绝大多数因时序问题导致的诡异故障。
3. 低功耗模式(LPM)深度解析与安全操作流程
低功耗是RA8D1 AGT的一大卖点,而LPM位正是打开这扇大门的钥匙。但这是一把双刃剑,配置不当会直接“锁死”你对寄存器的访问。
3.1 LPM模式的工作原理与影响
当AGTMR2.LPM位设置为1时,AGT进入低功耗模式。此时,为了降低功耗,模块内部的部分电路可能被关闭或降速。手册明确指出,在此模式下,访问AGT、AGTCMA、AGTCMB和AGTCR这几个寄存器是被禁止的。尝试读写这些寄存器可能无法得到正确结果,甚至引发总线错误。
这个机制的意义在于,当系统进入深度休眠(如Software Standby模式)而AGT仍需基于低速时钟运行时,LPM模式可以最大限度地减少定时器模块本身的功耗。此时,CPU已停机,自然也不会去访问这些寄存器。
3.2 进出LPM的安全操作流程
最关键的陷阱发生在退出LPM模式的时刻。当你将LPM位从1清0,准备恢复正常操作时,硬件需要时间重新同步。手册给出了非常具体的约束:
- 退出LPM后的首次读操作:需要连续读取目标寄存器两次,且只有第二次读取的数据是有效的。第一次读取的数据是无效的。
- 退出LPM后的写操作:在向
AGT、AGTCMA、AGTCMB、AGTCR寄存器写入数据后,需要等待至少2个计数源时钟周期,才能认为写入完成。 - 验证写入值:
- 如果定时器已停止,写入后下一个周期即可读出验证。
- 如果定时器正在运行,则需要在写入后等待4个计数源时钟周期才能读出验证。
手册中的流程图(Figure 22.2)清晰地描绘了标准流程:先设置LPM=1,再启动计数(TSTART=1);反之,先清除LPM=0,再停止计数(TSTART=0)。这个顺序保证了状态切换在稳定的条件下进行。
3.3 实战配置示例与避坑指南
假设我们使用AGTLCLK(假设为32.768kHz)作为时钟源,希望配置AGT在低功耗模式下产生一个约1秒的定时中断,然后在中断服务程序中退出LPM并进行一些处理。
// 假设寄存器地址已通过头文件定义 void AGT_LowPower_Timer_Setup(void) { // 步骤1:确保定时器完全停止 AGT->AGTCR_b.TSTART = 0; // 请求停止 while(AGT->AGTCR_b.TCSTF != 0); // 等待真正停止 // 步骤2:配置模式、时钟源、分频 // 定时器模式,时钟源为AGTLCLK AGT->AGTMR1 = (0x0 << 0) | (0x4 << 4); // TMOD=000b(定时器), TCK=100b(AGTLCLK) // 配置分频,假设1秒定时,计数器为16位最大值65535 // 时钟频率 = 32.768kHz / 分频比。若分频比=128,则计数频率=256Hz // 重载值 = 定时时间 * 计数频率 = 1s * 256Hz = 256 AGT->AGTMR2 = (0x7 << 0) | (0x0 << 7); // CKS=111b(1/128), LPM=0(先正常模式配置) AGT->AGT = 65535 - 256; // 设置重载值,计数器从该值递减到0 // 步骤3:使能溢出中断(此处省略中断控制器配置) AGT->AGTCR_b.TUNDF = 0; // 清除可能存在的旧标志 // ... 配置NVIC等 ... // 步骤4:进入低功耗模式配置流程 AGT->AGTMR2_b.LPM = 1; // 1. 先开启低功耗模式 // 注意:此时不要访问AGT, AGTCMA, AGTCMB, AGTCR AGT->AGTCR_b.TSTART = 1; // 2. 再启动定时器 while(AGT->AGTCR_b.TCSTF == 0); // 等待启动完成,此时AGT已在LPM下运行 // 系统此时可进入Software Standby模式,AGT仍将运行 } // 在定时器溢出中断服务程序(AGTI)中 void AGT_IRQHandler(void) { if(AGT->AGTCR_b.TUNDF) { AGT->AGTCR_b.TUNDF = 0; // 清除中断标志 // 步骤5:退出低功耗模式流程 AGT->AGTMR2_b.LPM = 0; // 1. 先关闭低功耗模式 // !!!关键:等待硬件同步,遵循访问约束 !!! // 简单做法:延时至少2个AGTLCLK周期。由于AGTLCLK=32.768kHz,周期约30.5us。 // 使用一个短暂的软件延时循环,或操作其他外设消耗时间。 delay_us(100); // 保守延时100us,远大于2个周期 // 现在可以安全访问AGT等寄存器了 AGT->AGTCR_b.TSTART = 0; // 2. 再停止定时器 while(AGT->AGTCR_b.TCSTF != 0); // ... 执行需要的处理任务 ... // 如果需要重新配置并进入LPM,重复步骤4 AGT->AGTMR2_b.LPM = 1; AGT->AGTCR_b.TSTART = 1; while(AGT->AGTCR_b.TCSTF == 0); } }避坑指南:最大的坑就是忽略退出LPM后的访问延迟。我曾因为退出LPM后立即读取计数器值来判断是否超时,结果读到的永远是错误值,导致逻辑混乱。务必在
LPM=1和LPM=0时,在心理上划一条红线,明确哪些寄存器能碰,哪些不能碰,并在切换后给予足够的同步时间。对于时间不敏感的应用,调用一个毫秒级的delay函数是最稳妥的。
4. 时钟分频系统(CKS[2:0])配置精讲
CKS[2:0]位提供了对AGTLCLK或AGTSCLK时钟源的预分频,分频比从1/1到1/128。这是扩展定时周期最直接的手段。
4.1 分频器的作用域与限制
一个至关重要的前提是:CKS[2:0]分频器仅当计数源(AGTMR1.TCK[2:0])选择为AGTLCLK(100b)或AGTSCLK(110b)时才有效。如果你选择其他时钟源(如PCLKB或另一个AGT的溢出),设置CKS是无效的。
其配置限制也非常严格:
- 禁止运行时修改:绝对不能在计数器运行(
TSTART=1且TCSTF=1)时改写CKS[2:0]位。必须在定时器完全停止时修改。 - 与TCK位的互锁:当
CKS[2:0]不为000b(即分频生效)时,禁止切换TCK[2:0]位(即切换时钟源)。正确的操作顺序是:先将CKS[2:0]设为000b(无分频),等待至少一个计数源时钟周期后,再修改TCK[2:0]。修改完TCK后,如果需要分频,再重新配置CKS。
4.2 定时周期计算实战
定时周期由三个因素决定:源时钟频率、CKS分频比、计数器重载值。 公式为:定时周期 = (重载值 + 1) / (源时钟频率 / 分频比)
假设我们使用32.768kHz的AGTLCLK,需要产生一个精确的1秒定时。
- 方案A:不使用CKS分频:
CKS=000b (1/1)。计数频率为32.768kHz。16位计数器最大值为65535,对应的最长定时为65536 / 32768 = 2秒。要定时1秒,重载值应为32768 - 1 = 32767。这个值在16位范围内。 - 方案B:使用最大分频:
CKS=111b (1/128)。计数频率为32768 / 128 = 256 Hz。定时1秒需要的重载值为256 - 1 = 255。这个值非常小。
如何选择?
- 方案A(高分频比)优点:重载值小,便于计算和动态调整。缺点:分辨率降低,定时精度为
1 / 256 Hz ≈ 3.9ms,无法实现更精细的定时。 - 方案B(低分频比或无分频)优点:分辨率高(~30.5us),定时精度高。缺点:若需要很长定时(如1小时),可能需要配合软件计数器(多次溢出)来实现。
实操心得:对于需要长时间、低功耗的定时(如传感器每小时采样一次),我会优先选择方案A。因为重载值小,意味着在低功耗模式下,对计数器进行读写操作(虽然LPM下禁止,但退出LPM后可能需要)的时间窗口和功耗影响更小。同时,256Hz的计数频率本身也更低功耗。而对于需要精准PWM控制或时间戳的应用,方案B的高分辨率是不可或缺的。
4.3 分频比动态切换策略
虽然禁止在运行时修改CKS,但我们可以通过“停止-修改-启动”来实现动态调整。关键在于,如果定时器正在产生中断服务,简单的开关可能会导致丢失定时周期。一个更稳健的策略是:
- 在中断服务程序中,停止定时器(
TSTART=0,等待TCSTF=0)。 - 修改
AGTMR2中的CKS[2:0]位和AGT重载值。 - 重新启动定时器(
TSTART=1,等待TCSTF=1)。 - 为了补偿停止期间流逝的时间,可以根据停止的时长,适当减小新的重载值。这需要借助一个更高精度的系统时钟来测量“停止间隙”。
5. 五大工作模式实战详解
AGT的通用性体现在其五种工作模式上。理解每种模式的本质和配置差异,是将其应用到实际场景的关键。
5.1 定时器模式(Timer Mode)
这是最基础的模式。计数器根据选定的时钟源(经CKS分频后)递减,减到0时产生下溢中断,并自动重载。
配置核心:
AGTMR1.TMOD[2:0] = 000b- 时钟源通过
AGTMR1.TCK[2:0]选择。 - 定时周期由
CKS分频比和AGT重载值决定。 - 中断源为
AGTCR.TUNDF(下溢标志)。
应用场景:系统心跳时钟、软件延时、任务调度器时基。在低功耗模式下,用AGTLCLK提供稳定的休眠唤醒时钟。
5.2 脉冲输出模式(Pulse Output Mode)
此模式下,AGT不仅计数,还会在每次计数器下溢时,翻转指定的输出引脚(AGTOn或AGTIOn)的电平,从而产生固定占空比(50%)的方波。
配置核心:
AGTMR1.TMOD[2:0] = 001bAGTIOC.TOE = 1使能AGTOn引脚输出。AGTIOC.TEDGSEL控制输出初始极性(0为低电平起始,1为高电平起始)。- 输出频率 =
(计数源频率 / CKS分频比) / (2 * (重载值 + 1))。
应用场景:生成简单的蜂鸣器驱动信号、时钟分频输出、测试信号。注意:占空比固定为50%,无法调节。
5.3 事件计数器模式(Event Counter Mode)
在此模式下,计数器不再依赖内部时钟,而是由外部引脚(AGTIOn)上的输入信号边沿触发递减。这实现了对外部事件的计数功能。
配置核心:
AGTMR1.TMOD[2:0] = 010bAGTIOC.TIOGT[1:0]控制计数条件:00b:AGTIOn引脚上每个有效边沿(由TEDGSEL选择上升沿或下降沿)都计数。01b: 仅在另一个控制引脚AGTEEn为有效电平(由AGTISR.EEPS选择高或低)期间,AGTIOn的有效边沿才被计数。这实现了门控计数。
AGTIOC.TIPF[1:0]可配置输入滤波,防止毛刺误触发。- 读取当前的
AGT计数器值,用初始值减去它,即可得到事件数量。
应用场景:旋转编码器脉冲计数、产品流水线计数、频率较低的频率计。
避坑指南:事件计数器模式在Software Standby模式下使用时,数字滤波功能(
TIPF)不可用。如果信号环境嘈杂,需要在进入待机前评估风险。此外,手册图22.9的注释提到,计数启动后可能有2个计数源周期的计数不受控,建议在启动计数前,先写AGTCR.TSTOP=1初始化内部电路,以消除此影响。
5.4 脉冲宽度测量模式(Pulse Width Measurement Mode)
该模式用于测量输入到AGTIOn引脚上,一个特定电平(高或低)的持续时间。
配置核心:
AGTMR1.TMOD[2:0] = 011bAGTIOC.TEDGSEL选择测量高电平宽度(1)还是低电平宽度(0)。- 当
AGTIOn出现被测电平时,计数器开始对内部时钟源(由TCK选择)递减。 - 当被测电平结束时,计数器停止,
AGTCR.TEDGF标志置1,产生中断。 - 脉冲宽度 = (计数器初始值 - 停止时的计数器值) * 计数时钟周期。
应用场景:测量红外遥控信号、PWM输入占空比(需结合周期测量)、按键长按时间。
关键限制:测量的最大脉冲宽度受16位计数器和时钟频率限制。如果脉冲太宽导致计数器下溢(减到0),TUNDF标志会置位,此次测量失败。因此,需要根据预期最大脉宽来合理选择时钟分频(CKS),或者使用更慢的时钟源(如AGTLCLK)。
5.5 脉冲周期测量模式(Pulse Period Measurement Mode)
此模式用于测量输入脉冲的周期,即连续两个同向边沿(如上升沿到上升沿)之间的时间。
配置核心:
AGTMR1.TMOD[2:0] = 100bAGTIOC.TEDGSEL选择测量上升沿周期(0)还是下降沿周期(1)。- 计数器持续运行。当检测到第一个有效边沿时,不做特殊处理。当检测到第二个有效边沿时,硬件自动将当前的计数器值锁存到一个“读出缓冲区”,然后立即用重载值重置计数器。同时置位
TEDGF标志。 - 脉冲周期 = (重载值 - 读出缓冲区的值 + 1) * 计数时钟周期。注意:这里需要“+1”,因为计数器在检测到边沿的时钟周期内已经递减了一次。
- 必须在下一个有效边沿到来之前,读取
AGT寄存器(此时读出的就是锁存的缓冲区值),否则数据会被覆盖。
应用场景:测量未知频率的数字信号、转速测量(通过测量霍尔传感器周期)。
关键限制与技巧:
- 最小可测周期:输入脉冲的周期必须大于2倍的计数源时钟周期,且高电平和低电平宽度都必须大于1个计数源时钟周期。否则脉冲可能被忽略。这意味着测量高频信号时,必须使用更高的计数时钟频率。
- 读取时机至关重要:必须在
TEDGF置位后、下一个有效边沿到来前读取测量结果。通常在中斷服务程序中第一时间读取。 - 首次测量无效:手册建议,使能该模式并启动计数后,第一次完成的测量应丢弃,从第二次开始采用。这是因为内部状态可能未稳定。
6. 比较匹配功能与输出控制
比较匹配功能是AGT的“瑞士军刀”,它允许你在计数器递减过程中的任意点(而不仅仅是0)触发事件,极大地增强了灵活性。
6.1 比较匹配寄存器(AGTCMA/AGTCMB)
这两个16位寄存器独立工作。当AGTCMSR.TCMEA或TCMEB置1时,相应的比较匹配功能被使能。计数器(AGT)在递减过程中,会不断与AGTCMA和AGTCMB的值进行比较。
6.2 匹配与输出行为
当匹配发生时:
AGTCR中的TCMAF或TCMBF标志置1,可产生中断。- 如果对应的输出使能位(
AGTCMSR.TOEA或TOEB)为1,则AGTOAn或AGTOBn引脚的电平会在匹配时刻发生翻转。输出极性由TOPOLA或TOPOLB控制。 - 计数器继续递减,直到下溢(为0)。下溢时,输出引脚电平会再次翻转。这意味着,通过合理设置比较匹配值和重载值,可以生成任意占空比的PWM波。
6.3 生成PWM波形实战
假设我们需要在AGTOAn引脚上产生一个频率为1kHz,占空比为30%的PWM波。使用PCLKB = 60MHz作为计数源,不分频(CKS=000b)。
计算计数周期:PWM频率为1kHz,则周期T=1ms。计数频率 = PCLKB = 60MHz。
- 一个PWM周期需要的计数次数 = 60,000,000 Hz * 0.001 s =60,000。
- 由于是16位计数器,最大值65535 > 60000,可行。
- 设置重载值
AGT = 65535 - 60000 = 5535。(注:也可设置为59999,取决于计数器是从重载值开始减到0,还是从0开始加到重载值,这里是递减模式,所以用65535 - N来设置初始值更方便理解,但手册描述是设置重载值,计数器加载该值后递减。为简化,我们直接设置AGT = 60000,并让计数器从该值递减到0,下溢后重载。这里采用后一种更直观的方式。)
计算比较值:占空比30%,即高电平时间 = 1ms * 0.3 = 0.3ms。
- 高电平对应的计数次数 = 60,000,000 Hz * 0.0003 s =18,000。
- 我们希望输出在计数开始时为高电平,计数到比较匹配值时翻转为低电平,在下溢时再翻回高电平。
- 因此,设置比较匹配值
AGTCMA = 60000 - 18000 = 42000。(假设计数器从60000递减,减到42000时匹配,翻转输出为低;减到0时下溢,翻转输出为高,开始新周期)。
配置代码:
void AGT_PWM_Setup(void) { // 停止定时器 AGT->AGTCR_b.TSTART = 0; while(AGT->AGTCR_b.TCSTF != 0); // 配置为定时器模式,时钟源为PCLKB AGT->AGTMR1 = (0x0 << 0) | (0x0 << 4); // TMOD=000b, TCK=000b(PCLKB) AGT->AGTMR2 = 0x00; // CKS=000b (1/1) // 设置周期和占空比 AGT->AGT = 60000; // 重载值,决定周期 AGT->AGTCMA = 42000; // 比较匹配值,决定占空比 // 使能比较匹配A功能,并使能AGTOAn引脚输出,初始输出低电平(TOPOLA=0) AGT->AGTCMSR = (1 << 0) | (1 << 1) | (0 << 2); // TCMEA=1, TOEA=1, TOPOLA=0 // 使能比较匹配A中断和下溢中断(可选) AGT->AGTCR_b.TCMAF = 0; AGT->AGTCR_b.TUNDF = 0; // ... 配置NVIC ... // 启动定时器 AGT->AGTCR_b.TSTART = 1; while(AGT->AGTCR_b.TCSTF == 0); }通过调整AGT和AGTCMA/AGTCMB的值,可以轻松产生多路、不同占空比的PWM信号,非常适合LED调光、电机控制等应用。
7. 在Software Standby模式下的应用
这是体现AGT低功耗价值的关键场景。在Software Standby模式下,CPU和大多数外设时钟停止,但AGT可以依靠AGTLCLK(内部低速振荡器)或AGTSCLK(外部子时钟)继续运行。
7.1 配置要点
- 时钟源选择:必须选择AGTLCLK(
TCK=100b)或AGTSCLK(TCK=110b)。PCLKB等系统时钟在待机下不可用。 - 引脚输入使能:如果要在待机模式下使用
AGTIOn引脚作为事件计数器或脉冲测量的输入,必须将AGTIOSEL.TIES位置1,以使能待机下的输入功能。 - 作为唤醒源:只有AGT1的中断(下溢、比较匹配A/B)可以唤醒CPU从Software Standby模式恢复。AGT0的中断不具备此功能。这在设计低功耗唤醒逻辑时至关重要。
- 模式支持:如表22.9和22.10所示,所有模式在待机下基本都支持,但事件计数器模式在待机下无法使用数字滤波功能。
7.2 低功耗定时唤醒实战流程
一个典型的应用是让系统每隔10秒从Software Standby模式唤醒一次进行数据采集。
配置AGT1:
- 模式:定时器模式(
TMOD=000b)。 - 时钟源:AGTLCLK(
TCK=100b),假设为32.768kHz。 - 分频:
CKS=111b(1/128),得到256Hz计数频率。 - 重载值:
AGT = 65535 - 2560(10秒 * 256Hz = 2560次计数)。 - 使能下溢中断(
AGTI)。 - 不要启动定时器。
- 模式:定时器模式(
进入待机前:
- 启动AGT1定时器(
TSTART=1)。 - 等待定时器真正运行(
TCSTF=1)。 - 配置中断控制器,确保AGT1中断能唤醒CPU。
- 执行进入Software Standby模式的指令。
- 启动AGT1定时器(
唤醒后:
- CPU被AGT1下溢中断唤醒。
- 在中断服务程序中,处理数据采集等任务。
- 清除中断标志。
- 可以重新配置定时器(如果需要改变唤醒间隔),然后再次进入待机模式。
核心提醒:在进入待机前确保定时器已稳定运行,并在中断服务程序中及时清除标志,是避免系统无法唤醒或重复错误唤醒的关键。同时,要仔细检查AGTIOSEL等寄存器的配置,确保在待机模式下所需的引脚功能是激活的。
