当前位置: 首页 > news >正文

瑞萨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的命脉:

  1. AGTMR1 (模式寄存器1): 这是模式的“总开关”。TMOD[2:0]位域决定了AGT工作在五种模式中的哪一种(定时器、脉冲输出等)。TCK[2:0]位域则用于选择计数器的时钟源,例如是内部低速时钟(AGTLCLK)、子时钟(AGTSCLK)还是另一个AGT的溢出信号。特别注意TCK的选择会直接影响后续分频器(CKS)是否有效。
  2. AGTMR2 (模式寄存器2): 本文的重点之一。它主要包含两个关键控制位:
    • CKS[2:0]:时钟分频比选择。当计数源为AGTLCLK或AGTSCLK时,此分频器生效,可将时钟进行1/1到1/128的分频,用于进一步降低计数频率,延长定时周期。
    • LPM:低功耗模式开关。将此位置1后,AGT进入低功耗状态,此时对部分关键寄存器的访问会受到限制,这是实现超低功耗运行的关键,但操作不当会导致读写错误。
  3. AGTIOC (I/O控制寄存器): 控制AGT与外部引脚交互的行为。包括输入滤波(TIPF[1:0])、输出使能(TOE)、计数控制(TIOGT[1:0],用于事件计数模式)以及输入/输出极性选择(TEDGSEL)。
  4. AGTCR (控制寄存器): 包含启动/停止控制位(TSTART)、计数状态标志(TCSTF)以及各种中断标志位(如溢出标志TUNDF、比较匹配标志TCMAF/TCMBF等)。它是控制定时器“生命”的寄存器。
  5. AGT/AGTCMA/AGTCMB (计数器和比较寄存器): AGT是16位计数器/重载寄存器。AGTCMA和AGTCMB是两个独立的比较匹配寄存器。它们是实现精准定时的核心,通过写入目标值,配合比较匹配功能,可以在计数器递减到特定值时产生中断或触发事件。

2.2 寄存器访问的“交通规则”

在操作这些寄存器时,手册中强调的几条“铁律”必须遵守,否则会导致不可预测的行为:

  • 模式切换必须在停止状态:在更改AGTMR1(模式/时钟源)、AGTMR2(分频/LPM)、AGTIOCAGTISRAGTCMSR这些决定工作模式的寄存器之前,必须确保AGTCR中的TSTARTTCSTF标志位都为0,即定时器完全停止。在计数运行时修改它们,后果自负。
  • 启动/停止的延迟:写入TSTART启动或停止定时器后,硬件需要若干时钟周期来同步状态(TCSTF标志会延迟反映)。在此期间,除了查询TCSTF,不要访问其他AGT寄存器。
  • 连续写计数器的间隔:在定时器运行(TSTART=1TCSTF=1)时,如果需要对AGT计数器寄存器进行连续写操作,两次写入之间必须间隔至少3个计数源时钟周期。

实操心得:养成一个好习惯,在编写任何AGT配置函数时,第一步总是先停止定时器(TSTART=0),然后循环等待TCSTF变为0。配置完成后,再启动定时器,并等待TCSTF变为1。这个简单的等待循环能避免绝大多数因时序问题导致的诡异故障。

3. 低功耗模式(LPM)深度解析与安全操作流程

低功耗是RA8D1 AGT的一大卖点,而LPM位正是打开这扇大门的钥匙。但这是一把双刃剑,配置不当会直接“锁死”你对寄存器的访问。

3.1 LPM模式的工作原理与影响

AGTMR2.LPM位设置为1时,AGT进入低功耗模式。此时,为了降低功耗,模块内部的部分电路可能被关闭或降速。手册明确指出,在此模式下,访问AGTAGTCMAAGTCMBAGTCR这几个寄存器是被禁止的。尝试读写这些寄存器可能无法得到正确结果,甚至引发总线错误。

这个机制的意义在于,当系统进入深度休眠(如Software Standby模式)而AGT仍需基于低速时钟运行时,LPM模式可以最大限度地减少定时器模块本身的功耗。此时,CPU已停机,自然也不会去访问这些寄存器。

3.2 进出LPM的安全操作流程

最关键的陷阱发生在退出LPM模式的时刻。当你将LPM位从1清0,准备恢复正常操作时,硬件需要时间重新同步。手册给出了非常具体的约束:

  1. 退出LPM后的首次读操作:需要连续读取目标寄存器两次,且只有第二次读取的数据是有效的。第一次读取的数据是无效的。
  2. 退出LPM后的写操作:在向AGTAGTCMAAGTCMBAGTCR寄存器写入数据后,需要等待至少2个计数源时钟周期,才能认为写入完成。
  3. 验证写入值
    • 如果定时器已停止,写入后下一个周期即可读出验证。
    • 如果定时器正在运行,则需要在写入后等待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=1LPM=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是无效的。

其配置限制也非常严格:

  1. 禁止运行时修改:绝对不能在计数器运行(TSTART=1TCSTF=1)时改写CKS[2:0]位。必须在定时器完全停止时修改。
  2. 与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,但我们可以通过“停止-修改-启动”来实现动态调整。关键在于,如果定时器正在产生中断服务,简单的开关可能会导致丢失定时周期。一个更稳健的策略是:

  1. 在中断服务程序中,停止定时器(TSTART=0,等待TCSTF=0)。
  2. 修改AGTMR2中的CKS[2:0]位和AGT重载值。
  3. 重新启动定时器(TSTART=1,等待TCSTF=1)。
  4. 为了补偿停止期间流逝的时间,可以根据停止的时长,适当减小新的重载值。这需要借助一个更高精度的系统时钟来测量“停止间隙”。

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不仅计数,还会在每次计数器下溢时,翻转指定的输出引脚(AGTOnAGTIOn)的电平,从而产生固定占空比(50%)的方波。

配置核心

  • AGTMR1.TMOD[2:0] = 001b
  • AGTIOC.TOE = 1使能AGTOn引脚输出。
  • AGTIOC.TEDGSEL控制输出初始极性(0为低电平起始,1为高电平起始)。
  • 输出频率 =(计数源频率 / CKS分频比) / (2 * (重载值 + 1))

应用场景:生成简单的蜂鸣器驱动信号、时钟分频输出、测试信号。注意:占空比固定为50%,无法调节。

5.3 事件计数器模式(Event Counter Mode)

在此模式下,计数器不再依赖内部时钟,而是由外部引脚(AGTIOn)上的输入信号边沿触发递减。这实现了对外部事件的计数功能。

配置核心

  • AGTMR1.TMOD[2:0] = 010b
  • AGTIOC.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] = 011b
  • AGTIOC.TEDGSEL选择测量高电平宽度(1)还是低电平宽度(0)。
  • AGTIOn出现被测电平时,计数器开始对内部时钟源(由TCK选择)递减。
  • 当被测电平结束时,计数器停止,AGTCR.TEDGF标志置1,产生中断。
  • 脉冲宽度 = (计数器初始值 - 停止时的计数器值) * 计数时钟周期

应用场景:测量红外遥控信号、PWM输入占空比(需结合周期测量)、按键长按时间。

关键限制:测量的最大脉冲宽度受16位计数器和时钟频率限制。如果脉冲太宽导致计数器下溢(减到0),TUNDF标志会置位,此次测量失败。因此,需要根据预期最大脉宽来合理选择时钟分频(CKS),或者使用更慢的时钟源(如AGTLCLK)。

5.5 脉冲周期测量模式(Pulse Period Measurement Mode)

此模式用于测量输入脉冲的周期,即连续两个同向边沿(如上升沿到上升沿)之间的时间。

配置核心

  • AGTMR1.TMOD[2:0] = 100b
  • AGTIOC.TEDGSEL选择测量上升沿周期(0)还是下降沿周期(1)。
  • 计数器持续运行。当检测到第一个有效边沿时,不做特殊处理。当检测到第二个有效边沿时,硬件自动将当前的计数器值锁存到一个“读出缓冲区”,然后立即用重载值重置计数器。同时置位TEDGF标志。
  • 脉冲周期 = (重载值 - 读出缓冲区的值 + 1) * 计数时钟周期注意:这里需要“+1”,因为计数器在检测到边沿的时钟周期内已经递减了一次。
  • 必须在下一个有效边沿到来之前,读取AGT寄存器(此时读出的就是锁存的缓冲区值),否则数据会被覆盖。

应用场景:测量未知频率的数字信号、转速测量(通过测量霍尔传感器周期)。

关键限制与技巧

  1. 最小可测周期:输入脉冲的周期必须大于2倍的计数源时钟周期,且高电平和低电平宽度都必须大于1个计数源时钟周期。否则脉冲可能被忽略。这意味着测量高频信号时,必须使用更高的计数时钟频率。
  2. 读取时机至关重要:必须在TEDGF置位后、下一个有效边沿到来前读取测量结果。通常在中斷服务程序中第一时间读取。
  3. 首次测量无效:手册建议,使能该模式并启动计数后,第一次完成的测量应丢弃,从第二次开始采用。这是因为内部状态可能未稳定。

6. 比较匹配功能与输出控制

比较匹配功能是AGT的“瑞士军刀”,它允许你在计数器递减过程中的任意点(而不仅仅是0)触发事件,极大地增强了灵活性。

6.1 比较匹配寄存器(AGTCMA/AGTCMB)

这两个16位寄存器独立工作。当AGTCMSR.TCMEATCMEB置1时,相应的比较匹配功能被使能。计数器(AGT)在递减过程中,会不断与AGTCMA和AGTCMB的值进行比较。

6.2 匹配与输出行为

当匹配发生时:

  1. AGTCR中的TCMAFTCMBF标志置1,可产生中断。
  2. 如果对应的输出使能位(AGTCMSR.TOEATOEB)为1,则AGTOAnAGTOBn引脚的电平会在匹配时刻发生翻转。输出极性由TOPOLATOPOLB控制。
  3. 计数器继续递减,直到下溢(为0)。下溢时,输出引脚电平会再次翻转。这意味着,通过合理设置比较匹配值和重载值,可以生成任意占空比的PWM波。

6.3 生成PWM波形实战

假设我们需要在AGTOAn引脚上产生一个频率为1kHz,占空比为30%的PWM波。使用PCLKB = 60MHz作为计数源,不分频(CKS=000b)。

  1. 计算计数周期: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,下溢后重载。这里采用后一种更直观的方式。)
  2. 计算比较值:占空比30%,即高电平时间 = 1ms * 0.3 = 0.3ms。

    • 高电平对应的计数次数 = 60,000,000 Hz * 0.0003 s =18,000
    • 我们希望输出在计数开始时为高电平,计数到比较匹配值时翻转为低电平,在下溢时再翻回高电平。
    • 因此,设置比较匹配值AGTCMA = 60000 - 18000 = 42000。(假设计数器从60000递减,减到42000时匹配,翻转输出为低;减到0时下溢,翻转输出为高,开始新周期)。
  3. 配置代码

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); }

通过调整AGTAGTCMA/AGTCMB的值,可以轻松产生多路、不同占空比的PWM信号,非常适合LED调光、电机控制等应用。

7. 在Software Standby模式下的应用

这是体现AGT低功耗价值的关键场景。在Software Standby模式下,CPU和大多数外设时钟停止,但AGT可以依靠AGTLCLK(内部低速振荡器)或AGTSCLK(外部子时钟)继续运行。

7.1 配置要点

  1. 时钟源选择:必须选择AGTLCLK(TCK=100b)或AGTSCLK(TCK=110b)。PCLKB等系统时钟在待机下不可用。
  2. 引脚输入使能:如果要在待机模式下使用AGTIOn引脚作为事件计数器或脉冲测量的输入,必须将AGTIOSEL.TIES位置1,以使能待机下的输入功能。
  3. 作为唤醒源:只有AGT1的中断(下溢、比较匹配A/B)可以唤醒CPU从Software Standby模式恢复。AGT0的中断不具备此功能。这在设计低功耗唤醒逻辑时至关重要。
  4. 模式支持:如表22.9和22.10所示,所有模式在待机下基本都支持,但事件计数器模式在待机下无法使用数字滤波功能。

7.2 低功耗定时唤醒实战流程

一个典型的应用是让系统每隔10秒从Software Standby模式唤醒一次进行数据采集。

  1. 配置AGT1

    • 模式:定时器模式(TMOD=000b)。
    • 时钟源:AGTLCLK(TCK=100b),假设为32.768kHz。
    • 分频:CKS=111b(1/128),得到256Hz计数频率。
    • 重载值:AGT = 65535 - 2560(10秒 * 256Hz = 2560次计数)。
    • 使能下溢中断(AGTI)。
    • 不要启动定时器
  2. 进入待机前

    • 启动AGT1定时器(TSTART=1)。
    • 等待定时器真正运行(TCSTF=1)。
    • 配置中断控制器,确保AGT1中断能唤醒CPU。
    • 执行进入Software Standby模式的指令。
  3. 唤醒后

    • CPU被AGT1下溢中断唤醒。
    • 在中断服务程序中,处理数据采集等任务。
    • 清除中断标志
    • 可以重新配置定时器(如果需要改变唤醒间隔),然后再次进入待机模式。

核心提醒:在进入待机前确保定时器已稳定运行,并在中断服务程序中及时清除标志,是避免系统无法唤醒或重复错误唤醒的关键。同时,要仔细检查AGTIOSEL等寄存器的配置,确保在待机模式下所需的引脚功能是激活的。

http://www.cnnetsun.cn/news/3047223.html

相关文章:

  • BetterNCM安装器:5分钟为网易云音乐解锁插件生态
  • 终极免费风扇控制软件FanControl:5分钟打造静音高效散热系统
  • Hint Learning与知识蒸馏本质区别:教模型‘看哪里’vs‘怎么想’
  • Solidworks 2018 自定义全局坐标系:从默认Y轴到Z轴朝上的完整方案
  • ADS1274设计实战:从引脚配置到系统级硬件规划
  • AIOps 自动化巡检与容量预测:从被动救火到主动防御的体系设计
  • Selenium数据驱动测试实战:告别硬编码,用Excel+Pytest构建可维护UI自动化框架
  • 缓存完全指南:从 CPU 缓存到 .NET Core WebAPI 生产级“万金油“方案
  • Video2X 6.0.0深度解析:C/C++重构带来的视频超分辨率性能突破与架构优化
  • 红帆iOffice.net SQL注入漏洞深度剖析与防护实践
  • openEuler/kvcache-ops vs 传统KVCache方案:5大关键优势对比
  • 百度网盘直链解析终极指南:免费解锁高速下载的完整解决方案
  • Python供应链安全审计:三大盲区与实战防御指南
  • 终极AMD锐龙处理器调试指南:如何深度访问SMU、PCI和MSR寄存器
  • Selenium与PyAutoGUI联动:突破Web自动化测试的浏览器沙盒限制
  • 2026年GEO优化系统源码架构与高性能实践
  • 3分钟上手!Android GPS位置模拟终极指南:MockGPS让你随心所欲定位
  • 【河南大学】计算机考研复试核心考点精讲与实战解析
  • 终极ncmdumpGUI指南:3步快速解密网易云音乐NCM加密文件
  • RA8T2 ADC16H寄存器实战:从状态机到驱动代码的避坑指南
  • 3种场景,1个工具:Video2X如何让AI视频增强变得简单实用
  • PPT+VBA打造动态计时器:从倒计时到正计时的场景化应用
  • 5个技巧快速掌握PvZ Toolkit:免费开源植物大战僵尸修改器
  • 如何轻松抢到B站会员购热门门票:5个自动化抢票技巧指南
  • Fay数字人框架终极指南:如何快速构建你的智能AI助手
  • GPT Plus 低价方式还能不能选?长期使用先看这几个风险
  • 传统流行由明星主导,编程抓取普通素人穿搭传播数据,证明短视频素人种草影响力赶超明星。
  • Neuralangelo:面向工业级CAD可用的神经隐式几何重建
  • 如何快速掌握AMD处理器调优:5个实用技巧完全指南
  • 瑞数6.5 sign生成与Cookie获取:逆向工程与自动化实战