UART低功耗与中断优化:FIFO触发与睡眠唤醒机制详解

发布时间:2026/7/20 10:39:11
UART低功耗与中断优化:FIFO触发与睡眠唤醒机制详解 1. 项目概述与核心价值在嵌入式开发尤其是电池供电的物联网节点、便携式设备或工业传感器中功耗和实时响应能力是两个永恒的核心矛盾。设备大部分时间可能处于空闲状态但一旦有数据到来又需要立刻被唤醒并处理。UART通用异步收发传输器作为最基础、最广泛使用的串行通信接口其传统的轮询Polling工作方式在低功耗场景下显得力不从心因为它要求CPU持续检查状态无法进入深度休眠。而中断驱动方式虽然能解放CPU但如果中断过于频繁例如每收到一个字节就中断一次又会带来大量的上下文切换开销影响系统整体性能。因此现代微控制器中的UART模块其设计精髓远不止于配置波特率、数据位和停止位。真正体现其技术深度和实用价值的在于低功耗睡眠模式与智能中断/DMA管理这两大机制的协同工作。这就像给一个守夜人配备了智能感应灯和自动传送带平时他可以彻底休息睡眠模式只有特定强度的动静FIFO达到触发阈值或关键事件RX线变化才会唤醒他唤醒中断醒来后大量工作数据搬运可以交给传送带DMA自动完成他只需处理最关键的任务。本文将深入解析TI AM263P等现代MCU中UART模块的睡眠唤醒机制与FIFO触发配置。我不会停留在手册的寄存器描述层面而是结合我多年在低功耗嵌入式产品开发中的实战经验拆解这些功能如何在实际项目中落地包括配置的“为什么”、常见的“坑”以及如何根据你的数据流特性来精细化调优FIFO阈值从而在功耗、响应速度和CPU占用率之间找到最佳平衡点。2. UART低功耗睡眠模式深度解析2.1 睡眠模式的本质与进入条件UART的睡眠模式Sleep Mode并非让整个芯片休眠而是指UART外设模块本身停止其内部时钟。具体来说模块时钟Module Clock和波特率时钟Baud Rate Clock会被停止。由于绝大多数UART内部寄存器都由这些时钟驱动时钟停止后其动态功耗会大幅降低通常能达到微安甚至纳安级别。注意这里存在一个关键但易混淆的概念。许多MCU有芯片级的多种低功耗模式如Stop, Standby。UART的模块睡眠模式是外设级的功耗管理它可以与芯片级低功耗模式配合使用也可以独立运作。例如CPU可能仍在运行但UART模块为了省电自己进入了睡眠。要让UART模块进入睡眠通常需要满足一系列条件这些条件确保了进入睡眠是安全的不会丢失数据。根据手册在UART模式下通过设置UART_IER_UART[4] SLEEP_MODE位为1来使能睡眠模式。但“使能”不等于“立即进入”它只是打开了模块响应睡眠条件的大门。模块实际进入睡眠还需要软件触发或硬件自动判断取决于具体实现通常需要确保当前没有活跃的数据传输。而在IrDA模式下逻辑类似但更严格通过设置UART_MDR1[3] IR_SLEEP位为1来使能。其进入睡眠的条件明确列出极具参考价值RXD输入线空闲没有正在进行的接收。TX FIFO和TX移位寄存器为空所有要发送的数据都已发出。RX FIFO为空所有接收到的数据都已被读取。除了THR中断外没有其他中断挂起意味着没有需要紧急处理的事件。这些条件共同构成了一个“安全点”确保模块在休眠时不会影响任何进行中的通信任务。在实际编程中我们往往需要在软件层面模仿这些检查例如在准备让系统进入低功耗前先等待TX发送完成、清空RX缓冲区并处理完所有中断。2.2 唤醒源如何把UART“叫醒”模块睡着了谁来唤醒它手册指出了几个关键的唤醒事件Wake-up EventsRX线路上的变化这是最常用、最直接的唤醒源。当UART的RX引脚上检测到起始位从高电平到低电平的跳变时模块会被唤醒以接收数据。这对于由外部设备发起通信的场景至关重要例如传感器上报数据。向TX FIFO写入数据当CPU或DMA需要发送数据向TX FIFO写入时会唤醒模块。这适用于由本机主动发起通信的场景。调制解调器Modem输入引脚状态改变如CTS、DCD等引脚的电平变化。这在涉及硬件流控的复杂通信中用作唤醒条件。这里有一个至关重要的细节唤醒事件Wake-up Event本身不一定会产生中断。它只是一个将模块从睡眠状态拉回工作状态的硬件机制。模块被唤醒后会恢复正常工作接收或发送数据但CPU可能并不知道这件事已经发生。2.3 唤醒中断让CPU感知“醒来”这件事如果仅仅唤醒模块而CPU还在休眠那么数据来了也无法处理。因此我们需要将“唤醒”这个事件通知给CPU。这就是唤醒中断Wake-Up Interrupt的作用。通过设置UART_SCR[4] RX_CTS_WU_EN在AM263P中该位可能命名为RX_CTS_DSR_WAKE_UP_ENABLE位为1可以将上述唤醒事件配置为中断源。一旦使能当唤醒事件发生时不仅UART模块被唤醒还会向CPU产生一个特定的唤醒中断。唤醒中断的特殊性 它与UART的其他七类中断如接收数据就绪、发送缓存空等处理方式不同。常规中断通过查询UART_IIR_UART中断标识寄存器来识别类型。但唤醒中断不会修改IIR寄存器。这意味着你不能通过读IIR来判断是否是唤醒事件。正确的做法是检查另一个状态寄存器例如UART_SSR[1]或其他型号MCU中的类似位来检测唤醒事件的发生。清除唤醒中断常规中断通常在服务后通过读/写特定寄存器清除。但唤醒中断的清除方法很特殊必须通过将UART_SCR[4]使能位写0来清除。也就是说你需要在唤醒中断服务程序中先处理事件然后禁用再重新使能唤醒中断以清除当前的中断标志位。这是一个常见的踩坑点如果忘记清除可能导致无法再次进入睡眠或产生虚假中断。// 伪代码示例UART唤醒中断服务例程 (ISR) void UART_Wakeup_ISR(void) { // 1. 检查并确认是唤醒中断例如通过SSR寄存器 if (UART_SSR WAKEUP_FLAG) { // 2. 清除唤醒中断标志位关键步骤 UART_SCR ~RX_CTS_WU_EN; // 写0清除 UART_SCR | RX_CTS_WU_EN; // 如果需要重新使能 // 3. 执行唤醒后的操作例如读取可能已接收的数据 // 注意模块已被唤醒可以正常操作UART寄存器 // 4. 可能需要重新配置FIFO、中断等因为从睡眠唤醒后某些配置可能需要恢复 } // ... 处理其他可能的中断源 }2.4 睡眠模式下的操作禁忌手册中特别强调了一个严重的操作禁忌在睡眠模式下绝对不可以向波特率除数锁存器UART_DLL和UART_DLH写入数据来修改波特率时钟BCLK。为什么因为睡眠模式下模块时钟已停止此时操作这些依赖时钟的寄存器会导致不可预测的行为可能造成波特率配置错误、通信彻底失败甚至模块锁死。正确的做法在计划修改波特率之前必须先将UART_IER_UART[4] SLEEP_MODE位清零退出睡眠模式待模块时钟稳定运行后再进行DLL/DLH的配置完成后再重新使能睡眠模式。// 伪代安全修改波特率的流程 void UART_ChangeBaudrate_Safe(uint32_t new_baud) { // 1. 禁用睡眠模式 UART_IER_UART ~SLEEP_MODE; // 2. 等待至少几个时钟周期确保模块完全激活根据手册要求 delay_us(10); // 示例具体时间需参考芯片数据手册 // 3. 进入配置模式如需访问DLL/DLH可能需要设置LCR[7] uint8_t lcr_backup UART_LCR; UART_LCR | 0x80; // 设置DLAB位访问除数锁存器 // 4. 计算并写入新的波特率除数 uint16_t divisor get_baud_divisor(new_baud); UART_DLL divisor 0xFF; UART_DLH (divisor 8) 0xFF; // 5. 恢复LCR退出配置模式 UART_LCR lcr_backup; // 6. 可选重新使能睡眠模式 // UART_IER_UART | SLEEP_MODE; }3. UART中断管理系统详解3.1 中断类型与优先级机制UART模块是一个多事件源的外设因此其中断系统被设计成一个带优先级的仲裁结构。以UART模式为例通常支持多达7种中断类型被归纳为6个优先级Priority Level。当多个中断条件同时发生时高优先级的中断会被优先报告给CPU。中断的状态和类型通过中断标识寄存器IIR来查询。当IIR[0] IT_PENDING位为0时表示有中断待处理。IIR[5:1]位域则指明了具体的中断类型。下表整理了UART模式下的主要中断类型、来源和清除方式这是理解和编写中断服务程序ISR的基础IIR[5:0]优先级中断类型中断源清除方法0001101 (最高)接收线路状态OE溢出错误、FE帧错误、PE奇偶校验错误、BI线路中断FE/PE/BI读UART_RHROE读UART_LSR0011002RX超时RX FIFO中存在陈旧数据未读时间过长取决于超时模式默认模式下读UART_RHR周期超时模式下读IIR本身0001002RHR中断 (数据就绪)FIFO禁用时DRDY位有效FIFO使能时RX FIFO数据量达到或超过触发阈值读UART_RHR寄存器直到中断条件消失FIFO数据低于阈值0000103THR中断 (发送保持寄存器空)FIFO禁用时THR空FIFO使能时TX FIFO数据量低于触发阈值写UART_THR寄存器直到中断条件消失FIFO数据高于阈值0000004调制解调器状态CTS、DSR、RI、DCD等Modem引脚状态变化读UART_MSR寄存器0100005XOFF/特殊字符中断接收到XOFF流控字符或预设的特殊字符XOFF中断接收XON字符特殊字符中断读IIR寄存器1000006 (最低)CTS/RTS变化RTS或CTS引脚从有效低变为无效高读UART_IIR寄存器实操心得中断服务程序ISR编写要点一个健壮的UART ISR应该遵循以下流程循环读取IIR因为一次可能产生多个中断需要循环读取IIR直到IT_PENDING位变为1无中断。根据IIR值分支处理使用switch-case语句处理不同类型的中断。严格遵循清除方式例如处理接收数据就绪中断时必须通过读取RHR来清除处理发送寄存器空中断时必须通过写入THR来清除。用错方法会导致中断无法清除陷入死循环。处理错误中断线路状态中断优先级1包含各种错误必须处理否则可能无法恢复通信。读取LSR寄存器可以获取具体的错误标志。// 伪代码UART中断服务例程框架 void UART_IRQHandler(void) { uint8_t iir_value; do { iir_value UART_IIR_UART; // 读取IIR同时可能清除某些中断 if ((iir_value 0x01) 1) { break; // IT_PENDING1无中断 pending } uint8_t int_id (iir_value 1) 0x07; // 提取中断ID switch(int_id) { case 0x03: // 011b: 接收线路状态错误 (优先级1) handle_line_status_error(); break; case 0x06: // 110b: 接收超时 (优先级2) handle_rx_timeout(); break; case 0x02: // 010b: 接收数据就绪 (优先级2) handle_rx_data_ready(); break; case 0x01: // 001b: 发送保持寄存器空 (优先级3) handle_tx_buffer_empty(); break; // ... 处理其他中断类型 default: // 可能是唤醒中断或其他未处理类型读取SSR等寄存器判断 if (UART_SSR WAKEUP_FLAG) { handle_wakeup(); // 处理唤醒中断 } break; } } while(1); // 循环处理直到所有pending中断被处理完 }3.2 不同工作模式下的中断差异UART模块除了标准的异步串行模式通常还支持IrDA红外和CIR消费红外模式。这些模式下的中断源和寄存器映射会有所不同。IrDA模式中断更侧重于红外通信特有的帧处理。例如增加了“最后一字节接收完成”、“TX状态帧发送成功或欠载错误”、“接收EOF帧结束”等中断。它的中断没有硬件优先级任何中断都会拉高中断线需要ISR读取UART_IIR_IRDA来区分。CIR模式中断更为简化专注于红外遥控信号的接收如RX_STOP_IT和发送完成TX status。重要提示在切换UART工作模式UART/IrDA/CIR时必须重新配置中断使能寄存器IER和了解对应的IIR寄存器因为它们的位定义可能完全不同。直接沿用UART模式的配置会导致中断无法正常工作。4. FIFO管理平衡性能与中断开销的核心4.1 FIFO触发级别Trigger Level的配置哲学FIFO先进先出缓冲区是UART性能优化的关键。没有FIFO时每收/发一个字节就会产生一次中断CPU忙于上下文切换效率极低。有了FIFO我们可以设置一个“水位线”触发级别只有当数据量达到这个水位线时才通知CPU从而批量处理数据大幅减少中断频率。AM263P的UART FIFO触发级别配置非常灵活主要通过三个寄存器协作完成UART_FCRFIFO控制寄存器、UART_SCR辅助控制寄存器和UART_TLR触发级别寄存器。TX FIFO触发配置逻辑 TX FIFO的触发级别决定了“何时请求更多数据”。当TX FIFO中的数据量低于触发级别时会产生THR中断或DMA请求。 其配置取决于SCR[6]和TLR[3:0]的组合SCR[6]TLR[3:0]TX FIFO 触发级别含义0 0x0由UART_FCR[5:4](TX_FIFO_TRIG) 决定可选 8, 16, 32, 56 个空位空间。0! 0x0由UART_TLR[3:0](TX_FIFO_TRIG_DMA) 决定范围 4 到 60 个空位步进为 4。1任意值由TLR[3:0](高4位) 和FCR[5:4](低2位)拼接后的6位值决定范围 1 到 63 个空位步进为 1。注意全零(0)组合无效最小为1。RX FIFO触发配置逻辑 RX FIFO的触发级别决定了“何时通知数据已就绪”。当RX FIFO中的数据量达到或超过触发级别时会产生RHR中断或DMA请求。 其配置取决于SCR[7]和TLR[7:4]的组合逻辑与TX FIFO完全对称。如何选择触发别这是一个需要权衡的决策低触发值如1-4响应延迟低CPU或DMA能很快开始处理数据。但中断/请求频率高CPU负载大不利于功耗优化。适用于对实时性要求极高、数据量小的场景。高触发值如56-60断/请求频率低CPU可以长时间休眠或处理其他任务效率高。但数据在FIFO中堆积的延迟也高。适用于大数据量传输、对延迟不敏感的场景。中等触发值如16-32在延迟和效率之间取得平衡。这是许多应用的默认选择。我的经验法则对于发送TX如果使用中断触发值可以设得稍低例如8或16确保发送流不会断流。如果使用DMA可以设得较高例如32或56让DMA一次性搬运更多数据减少总线占用。对于接收RX需要结合超时中断一起考虑。如果数据包长度固定可以将RX触发值设为包长度。如果数据包长度可变或带有结束符可以设置一个较低的触发值如1或4并启用RX超时中断这样既能快速响应数据开始又能在数据流暂停后超时及时处理不满触发值的数据。4.2 FIFO工作模式中断、轮询与DMA4.2.1 FIFO中断模式这是最常用的模式。通过设置UART_FCR[0] FIFO_EN 1使能FIFO并在UART_IER_UART中使能相应的中断如RHR中断、THR中断。RX中断当RX FIFO中数据量达到预设的触发级别时产生中断。中断标志只有在CPU读取足够多的数据使FIFO深度低于触发级别后才会清除。这防止了中断的“抖动”频繁触发。TX中断当TX FIFO空时产生中断。当中断服务程序向TX FIFO写入数据使其深度超过触发级别后中断标志清除。当中断程序写入的数据被发送FIFO深度再次低于触发级别时会再次产生中断。这种机制确保了中断产生的节奏与数据处理能力相匹配。4.2.2 FIFO轮询模式通过设置UART_FCR[0] FIFO_EN 0禁用FIFO或禁用相关中断然后通过软件定期查询UART_LSR_UART线路状态寄存器的位来判断状态。LSR[0](DR)数据就绪。为1表示RHR/FIFO中有数据可读。LSR[5](THRE)发送保持寄存器空。为1表示可以写入新的发送数据。LSR[6](TEMT)发送器空。为1表示THR和移位寄存器都空。轮询模式适用场景在简单的单任务系统中没有复杂的中断管理系统。在操作系统如RTOS的任务中以阻塞或非阻塞方式等待UART事件。在极低功耗场景下CPU处于深度睡眠只能通过外部事件如RX引脚变化唤醒唤醒后再轮询处理数据。4.2.3 FIFO DMA模式DMA直接内存访问是解放CPU的终极武器。UART的DMA请求与FIFO触发级别直接绑定。RX DMA当RX FIFO中数据量达到触发级别时向DMA控制器发出请求。DMA控制器随后将FIFO中的数据批量搬运到指定的内存缓冲区。搬运的数据量通常等于触发级别值或由DMA控制器传输长度决定。TX DMA当TX FIFO空或低于某个阈值时向DMA控制器发出请求。DMA控制器将内存中的数据批量搬运到TX FIFO中。AM263P支持多种DMA模式Mode 0/1/2/3通过UART_SCR和UART_FCR寄存器配置。模式1是典型的双向DMATX和RX独立通道。模式2和3是传统模式分别仅使用RX或TX DMA请求。DMA模式下的一个高级特性可以通过UART_MDR3[2] SET_DMA_TX_THRESHOLD和UART_TX_DMA_THRESHOLD寄存器独立于TX FIFO中断触发级别设置一个更低的DMA请求阈值。例如TX FIFO中断触发在16个空位但DMA请求可以设置在4个空位。这样DMA可以更早、更细粒度地开始填充FIFO确保发送流极其平滑几乎不会出现断流特别适合高速、连续的数据流传输。4.3 流控Flow Control与FIFO触发的协同当使能硬件流控RTS/CTS或软件流控XON/XOFF时FIFO触发级别的设置需要额外小心。手册中明确指出在使能流控的FIFO中断模式下必须确保流控制的“停止传输”阈值UART_TCR[3:0] RX_FIFO_TRIG_HALT大于或等于RX FIFO的中断触发阈值UART_TLR[7:4]或UART_FCR[7:6]。为什么假设RX FIFO中断触发级别是8字节而流控的HALT阈值是4字节。当对方连续发送数据你的RX FIFO收到4字节时你的UART就会通过拉高RTS或发送XOFF告诉对方“暂停发送”。但此时你的RX FIFO只有4字节并未达到8字节的中断触发条件因此你的CPU不会产生中断去读取数据。这就导致了一个死锁对方暂停了你的CPU却不知道有数据需要读取FIFO永远无法被清空通信就此卡住。因此正确的配置顺序是先设置RX FIFO中断触发级别再设置流控HALT阈值并确保 HALT阈值 中断触发级别。通常HALT阈值会设得比中断触发级别高几个字节为CPU的中断响应和处理留出时间缓冲。5. 实战配置流程与避坑指南5.1 一个完整的低功耗UART带中断接收配置示例假设我们需要配置一个UART用于接收不定长的传感器数据包以换行符\n结束要求平时UART模块和CPU尽可能休眠有数据到来时快速唤醒并接收。// 假设寄存器地址已定义 void UART_Init_LowPower_RX(void) { // 步骤1: 基本UART配置 (波特率、数据位、停止位等) // 先确保退出睡眠模式以配置波特率 UART_IER_UART ~SLEEP_MODE; // ... 配置LCR, 设置DLAB1, 写入DLL/DLH设置波特率设置数据格式最后DLAB0 // 步骤2: 配置FIFO和触发级别 UART_FCR 0; // 先清零 UART_FCR | (1 0); // FCR[0]1, 使能FIFO UART_FCR | (1 1); // FCR[1]1, 复位RX FIFO UART_FCR | (1 2); // FCR[2]1, 复位TX FIFO // 设置RX FIFO触发级别为8字节 (假设FCR[7:6]00代表8字节) // 设置TX FIFO触发级别为8空位 (假设FCR[5:4]00代表8空位) // UART_FCR | (0 6) | (0 4); // 默认可能就是00 // 如果需要更精细的触发级别使用TLR寄存器 // 例如设置RX触发为12字节TX触发为16空位 UART_SCR | (1 7) | (1 6); // SCR[7]和[6]1使能TLR精细控制 UART_TLR (12 4) | (16 0); // TLR[7:4]12(0xC), TLR[3:0]16(0x10)? 注意范围1-63 // 注意TLR值需要根据SCR和FCR的拼接规则计算此处为示例。 // 步骤3: 配置中断 UART_IER_UART 0; // 先禁用所有中断 UART_IER_UART | (1 0); // IER[0]1, 使能RHR中断数据就绪 UART_IER_UART | (1 1); // IER[1]1, 使能THR中断发送空如果需要发送的话 // 使能接收线路状态中断错误处理 UART_IER_UART | (1 2); // IER[2]1 // 步骤4: 配置唤醒中断 UART_SCR | (1 4); // SCR[4]1, 使能RX/CTS等引脚变化唤醒中断 // 步骤5: 配置并启用接收超时中断用于处理不定长包 // 需要设置相关超时寄存器并使能超时中断可能在IER或EFR中 // UART_IER_UART | (1 4); // 例如使能接收超时中断 // 步骤6: 最后使能UART模块睡眠模式 UART_IER_UART | (1 4); // IER[4]1, 使能睡眠模式 // 注意此时模块不会立即睡眠需要满足睡眠条件如TX空闲、RX空闲等 // 步骤7: 在NVIC中使能UART全局中断 NVIC_EnableIRQ(UART_IRQn); }5.2 常见问题排查与解决实录问题1UART进入睡眠后无法被唤醒。检查唤醒源配置确认UART_SCR[4]已正确使能。检查硬件连接确保RX引脚上有预期的电平变化起始位。检查睡眠条件确保在期望模块睡眠时TX FIFO和移位寄存器确实为空RX FIFO也为空。如果有数据未发送完或未读取模块可能无法进入睡眠。检查中断屏蔽确认CPU的全局中断已开启并且UART的中断在NVIC中已使。唤醒事件产生的是中断如果中断被屏蔽CPU不会响应。检查唤醒中断标志清除在第一次唤醒中断服务程序中是否按照要求通过写UART_SCR[4]来清除了唤醒中断标志如果没有清除后续唤醒中断可能无法产生。问题2FIFO中断不产生或产生过于频繁。检查FIFO使能UART_FCR[0]必须为1。检查中断使能在UART_IER_UART中是否使能了对应的中断RHR中断或THR中断验证触发级别确认UART_FCR或UART_TLR中的触发级别设置是否符合预期。一个常见的错误是误以为设置的是字节数实际设置的是“空位数”对于TX或理解错了寄存器的拼接规则。中断风暴如果RX中断疯狂产生检查是否在中断服务程序中读取了足够的数据使FIFO深度降到了触发级别以下。如果没有中断标志会一直有效导致不断重入中断。确保你的ISR能处理达到触发级别的所有数据。问题3使用DMA时数据丢失或错位。DMA缓冲区大小匹配确保DMA控制器配置的传输数据量Burst Size与UART FIFO的触发级别合理匹配。例如RX FIFO触发级别是8字节那么DMA最好配置为每次传输8字节或其整数倍。如果DMA每次只传输1字节效率极低如果传输远大于FIFO深度的数据可能造成溢出。DMA和中断的冲突如果同时使能了DMA和FIFO中断要小心处理。通常使用DMA时会禁用对应的FIFO中断如RHR或THR中断让DMA全权负责数据搬运。两者都使能可能导致不可预知的行为。DMA传输完成中断除了关注UART的FIFO触发更要配置好DMA控制器本身的传输完成中断或半传输中断以便在内存缓冲区满或半满时及时处理数据防止缓冲区被覆盖。问题4通信速率高时出现数据错误或丢失。时钟与波特率精度首先检查系统时钟和波特率分频器设置是否正确。高波特率如115200以上对时钟精度要求很高。FIFO溢出检查线路状态中断中的溢出错误OE。如果频繁发生说明CPU或DMA处理数据的速度跟不上接收速度。解决方法提高RX FIFO触发级别让CPU/DMA每次处理更多数据减少切换开销优化数据处理代码性能或者考虑使用更高效的DMA环形缓冲区。流控未正确配置在高速全双工通信中务必使用硬件流控RTS/CTS。确保UART_TCR中的RX_FIFO_TRIG_HALT设置正确且硬件连线无误。没有流控接收方缓冲区满时发送方数据必然丢失。5.3 低功耗策略进阶与系统级低功耗模式配合UART模块的睡眠模式可以很好地与MCU的系统级低功耗模式如Sleep, Stop, Standby配合。初始化配置UART使能其自身的睡眠模式和唤醒中断。进入系统低功耗前确保UART处于“可睡眠”状态TX空、RX空。然后让CPU执行WFI等待中断或类似指令进入低功耗模式。唤醒过程当UART的RX引脚收到起始位首先UART模块被唤醒然后其唤醒中断将整个系统CPU从低功耗模式中拉出。中断服务CPU执行UART唤醒中断服务程序在其中清除唤醒标志并通常会使能RHR中断准备接收即将到来的数据帧。数据接收数据开始涌入RX FIFO达到触发级别后产生RHR中断CPU在对应的ISR中读取并处理数据。返回休眠数据处理完毕后软件可以再次将UART和系统置于低功耗状态等待下一次唤醒。这种“模块睡眠 系统睡眠 事件唤醒”的机制是电池供电设备实现超长待机的关键技术。通过合理配置UART的唤醒条件和FIFO触发阈值可以最大限度地减少不必要的唤醒让设备在99%的时间处于“深度睡眠”仅在关键时刻“瞬间清醒”完成工作。