CC13x2/CC26x2 UART深度解析:从异步通信原理到寄存器级实战配置 1. 项目概述在嵌入式开发的世界里UART串口通信就像一位沉默寡言但极其可靠的老朋友。无论你是调试代码、打印日志还是连接传感器、驱动模块几乎都离不开它。它不像SPI、I2C那样需要时钟线同步仅凭一根TX线、一根RX线再加上一个共地就能在两个设备间建立起稳定的数据通道。这种“约定大于配置”的异步通信方式赋予了它无与伦比的简单性和鲁棒性。今天我们不谈那些泛泛而谈的理论而是深入到德州仪器TICC13x2/CC26x2系列无线MCU的UART模块内部看看这颗面向物联网和低功耗无线应用的芯片是如何将这一经典协议玩出花样的。从可编程的32级FIFO到与µDMA微直接内存访问控制器的高效联动再到灵活的硬件流控我们将手把手拆解其配置逻辑、实战中的避坑指南以及如何利用这些高级特性来构建更稳定、更高效的嵌入式系统。无论你是刚接触嵌入式的新手还是正在为项目寻找优化方案的老鸟相信这篇从原理到寄存器级实操的深度解析都能给你带来实实在在的收获。2. UART核心原理与CC13x2/CC26x2模块特性2.1 异步串行通信的本质要理解UART首先要抛开“同步时钟”这个概念。你可以把它想象成两个人用摩斯电码通信他们事先约定好敲击的节奏波特率但手里并没有一块共享的秒表。发送方在开始发送每个字节前会先发送一个明确的“开始”信号起始位逻辑0告诉接收方“注意我要说话了”。紧接着数据位通常是8位LSB先行被依次送出。为了保证数据的可靠性可能会附加一个校验位奇偶校验。最后以一个或多个“结束”信号停止位逻辑1收尾标志着这个字节传输完毕线路恢复到空闲的高电平状态。这个过程中接收方的全部工作就是“监听”和“比对”。它持续监测RX线路一旦检测到从高到低的跳变起始位内部的波特率计数器就开始工作。它会在每个比特位的中间时刻通常是第8、24、40...个时钟周期取决于波特率分频对线路电平进行采样以此来判断是0还是1。这种机制要求收发双方的波特率误差必须控制在一定范围内通常5%否则采样点就会漂移导致数据错乱。这也是为什么精准的波特率发生器如此重要。2.2 CC13x2/CC26x2 UART模块的硬核特性TI的CC13x2/CC26x2系列MCU作为SimpleLink™平台的核心其UART模块绝非简单的“16550兼容”外设。它经过了深度优化以满足物联网设备对低功耗、高可靠性和处理效率的严苛要求。我们来看看它有哪些看家本领高性能波特率生成器支持最高3 Mbps的通信速率。这不仅仅是标称值其关键在于22位的波特率分频器16位整数 6位小数。小数分频器的存在使得模块能够基于固定的系统时钟如24MHz、48MHz精确地产生几乎所有标准和非标准波特率从低速的300bps到高速的3Mbps都能将误差降到最低从根本上保证了通信的稳定性。深度缓冲与智能中断模块配备了独立的32x8位发送FIFO和32x12位接收FIFO。这里的“12位”很关键高8位是数据低4位专门用来存储该字节对应的状态信息帧错误、奇偶校验错误、溢出错误、线路中断。这意味着当你从FIFO中读取一个数据时可以同时获取它的“健康状态”无需额外查询寄存器极大地简化了错误处理流程。FIFO的触发水位可编程为1/8、1/4、1/2、3/4、7/8满或空你可以根据数据流的特点在中断频率和响应延迟之间做出最佳权衡。与µDMA的深度集成这是提升系统效率的大杀器。UART模块可以直接向µDMA控制器发出传输请求。对于接收当FIFO中有数据时会发出单次请求当数据量达到设定的触发水位时会发出突发请求。发送端同理。µDMA可以在无需CPU干预的情况下将接收FIFO中的数据批量搬运到指定的内存区域或者将内存中的待发送数据批量填入发送FIFO。这不仅把CPU从频繁的字节搬运中断中解放出来降低了功耗还使得CPU可以专注于应用逻辑甚至在深度睡眠模式下由DMA配合UART完成数据接收和存储实现真正的超低功耗数据采集。完备的硬件流控与调制解调器支持模块完整支持RTS请求发送和CTS清除发送硬件流控信号。通过正确配置可以防止因接收方缓冲区满而导致的数据丢失。此外通过配置UART0的CTS和RTS引脚功能可以在DTE数据终端设备如电脑和DCE数据通信设备如调制解调器模式间切换这为连接传统调制解调器或某些需要特定流控方向的设备提供了便利。灵活的错误检测与中断系统除了基本的溢出、帧错误、奇偶错误、线路中断检测外还提供了接收超时中断。当RX FIFO非空但超过32个位周期没有收到新数据时会触发此中断。这在处理可变长度数据包时非常有用可以作为一个“数据包接收完成”的辅助判断标志。注意模块复位后FIFO默认是禁用的此时相当于一个单字节的缓冲寄存器。如果你需要利用FIFO来降低中断频率或配合DMA务必在初始化流程中通过设置UART:LCRH寄存器的FEN位来启用FIFO。3. 从理论到实践CC13x2/CC26x2 UART配置详解理解了模块特性我们进入实战环节。配置一个UART外设就像组装一台精密仪器步骤和顺序至关重要。一个错误的配置顺序可能导致UART无法工作或产生不可预知的行为。3.1 配置前的准备工作时钟与引脚复用在CC13x2/CC26x2中UART模块位于一个独立的电源域。因此第一步是“上电”和“给时钟”。使能电源域和时钟通过PRCM电源与时钟管理模块的相关寄存器进行操作。通常我们会使用TI提供的DriverLib库函数来简化这一过程// 使能UART0模块的时钟运行、睡眠、深度睡眠模式 PRCMPeripheralRunEnable(PRCM_PERIPH_UART0); PRCMPeripheralSleepEnable(PRCM_PERIPH_UART0); PRCMPeripheralDeepSleepEnable(PRCM_PERIPH_UART0); // 加载时钟设置 PRCMLoadSet();这些函数确保了UART模块在MCU的不同功耗模式下都能获得所需的时钟源。配置GPIO引脚复用这是最容易出错的一步。CC13x2/CC26x2的引脚功能高度灵活需要通过IOC输入输出控制器模块将具体的DIO数字IO引脚配置为UART功能。// 将某个引脚例如DIO2配置为UART0_RX IOCPinTypeUart(UART0_BASE, IOID_2, UART_RX); // 将某个引脚例如DIO3配置为UART0_TX IOCPinTypeUart(UART0_BASE, IOID_3, UART_TX); // 如果需要硬件流控还需配置RTS和CTS引脚 IOCPinTypeUart(UART0_BASE, IOID_4, UART_RTS); IOCPinTypeUart(UART0_BASE, IOID_5, UART_CTS);关键点必须在使能UART模块之前完成IOC配置数据手册中特别警告如果顺序颠倒在IOC配置完成前就使能了UART输入引脚上的毛刺或不确定电平可能会被UART误认为是起始位导致其状态机混乱。3.2 波特率计算整数与小数的艺术波特率配置是UART通信的基石。CC13x2/CC26x2的波特率发生器公式为BRD UART_Ref_Clk / (16 * Baud_Rate)其中BRD是一个22位的数值包含16位整数部分IBRD.DIVINT和6位小数部分FBRD.DIVFRAC。假设系统给UART的时钟PERDMACLK是24 MHz我们需要配置经典的115200波特率。计算总的分频系数BRD 24,000,000 / (16 * 115,200) 13.02083333...提取整数部分IBRD 13(0xD)计算小数部分这是最容易算错的地方。公式是DIVFRAC integer(BRDF * 64 0.5)。小数部分BRDF 0.02083333...BRDF * 64 1.33333...加上0.5进行四舍五入1.33333 0.5 1.83333取整后得到DIVFRAC 1。所以最终需要写入的寄存器值为UART:IBRD 13,UART:FBRD 1。为什么需要小数分频如果只有整数分频对于24MHz时钟和115200波特率最接近的整数分频值是13此时实际波特率为24,000,000 / (16 * 13) ≈ 115384.6误差约为0.16%。虽然这个误差在可接受范围内但对于某些对时序极其敏感或需要更高波特率的应用误差会累积。而有了6位小数分频精度1/64我们可以将误差降到几乎为0这对于需要长时间、大数据量、高可靠性通信的场景至关重要。3.3 核心配置流程与寄存器操作序列有了波特率参数我们就可以按照严格的顺序来配置UART模块了。这个顺序是硬件设计决定的不能随意更改。禁用UART在修改任何关键配置波特率、数据格式前必须先禁用UART模块。这是通过清除UART:CTL寄存器的UARTEN位实现的。即使UART正在收发完成当前字符的传输后它也会停止。// 假设 UART0_BASE 是UART0模块的基地址 HWREG(UART0_BASE UART_O_CTL) ~(UART_CTL_UARTEN);写入波特率除数先写整数部分IBRD再写小数部分FBRD。HWREG(UART0_BASE UART_O_IBRD) 13; // 写入整数部分 HWREG(UART0_BASE UART_O_FBRD) 1; // 写入小数部分设置线路控制参数配置UART:LCRH寄存器。这个寄存器控制数据位长度、停止位、奇偶校验和FIFO使能。关键一步写入LCRH寄存器的操作会触发一个内部锁存将之前写入的IBRD和FBRD值以及LCRH自身的新配置一起更新到UART的工作逻辑中。因此对波特率的修改必须在对LCRH的写操作之前完成。// 配置为8位数据1位停止位无奇偶校验禁用FIFO字符模式 // UART_LCRH_WLEN_8 定义数据位为8 // 其他位为0表示1停止位无校验FIFO禁用 uint32_t lcrhValue UART_LCRH_WLEN_8; HWREG(UART0_BASE UART_O_LCRH) lcrhValue;如果需要启用FIFO则在此处设置UART_LCRH_FEN位。使能UART最后重新使能UART模块。HWREG(UART0_BASE UART_O_CTL) | UART_CTL_UARTEN;如果需要同时使能发送和接收默认就是使能的可以同时设置UART_CTL_TXE和UART_CTL_RXE位但通常UARTEN置位后TXE和RXE默认就是1。完整的初始化函数示例基于寄存器操作void UART0_Init(uint32_t baudRate) { // 1. 禁用UART HWREG(UART0_BASE UART_O_CTL) ~(UART_CTL_UARTEN); // 2. 计算并设置波特率 (假设时钟为24MHz) uint32_t brd 24000000 / (16 * baudRate); // 整数部分 uint32_t fbrd (uint32_t)(((float)(24000000 % (16 * baudRate)) * 64) / (16 * baudRate) 0.5); // 小数部分 HWREG(UART0_BASE UART_O_IBRD) brd; HWREG(UART0_BASE UART_O_FBRD) fbrd; // 3. 设置线路参数8N1, 使能FIFO HWREG(UART0_BASE UART_O_LCRH) (UART_LCRH_WLEN_8 | UART_LCRH_FEN); // 4. 使能UART同时使能TX和RX HWREG(UART0_BASE UART_O_CTL) | (UART_CTL_UARTEN | UART_CTL_TXE | UART_CTL_RXE); }4. 高级功能应用与实战技巧基础配置只能让UART跑起来。要发挥CC13x2/CC26x2 UART的全部潜力尤其是在复杂的嵌入式系统中必须掌握其高级功能。4.1 FIFO与中断的协同优化FIFO的引入核心目的是减少CPU处理中断的频率。但如何设置中断触发水位是一门平衡的艺术。接收场景假设你通过UART接收一串不定长的传感器数据包每个包以换行符\n结束。如果你将RX FIFO触发水位设为1/8即4字节那么每收到4个字节就会产生一次中断。对于短包这没问题。但对于长包会产生大量中断增加CPU负载。更优的策略是将触发水位设为1/216字节或3/424字节并在中断服务程序ISR中一次性读取FIFO中的所有数据通过查询UART:FR寄存器的RXFE位直到FIFO为空。同时务必启用接收超时中断。这样即使最后一个数据包的长度小于触发水位在数据停止到达超过32个位时间后超时中断也会触发确保你能及时处理完FIFO中残留的数据。发送场景发送FIFO的触发水位表示“FIFO空到什么程度时产生中断”。例如设置为1/216字节空时当TX FIFO中的数据被发送出去剩余空间大于等于16字节时就会产生发送中断提示你可以填充新的数据了。在需要连续发送大量数据的场合如通过串口发送文件你可以先在主循环或任务中填充一部分数据到FIFO然后使能发送中断。当FIFO有空闲时中断触发在ISR中继续填充数据直到所有数据发送完毕。这种方式比轮询UART:FR寄存器的TXFF位发送FIFO满要高效得多。配置中断触发水位的代码片段// 设置接收FIFO中断触发点为1/2满发送FIFO中断触发点为1/2空 HWREG(UART0_BASE UART_O_IFLS) (UART_IFLS_RX1_2 | UART_IFLS_TX1_2); // 使能接收中断和接收超时中断 HWREG(UART0_BASE UART_O_IMSC) | (UART_IMSC_RXIM | UART_IMSC_RTIM); // 在中断服务例程(ISR)中 void UART0_IRQHandler(void) { uint32_t mis HWREG(UART0_BASE UART_O_MIS); // 读取屏蔽后的中断状态 if (mis UART_MIS_RXMIS) { // 接收中断FIFO达到触发水位 while (!(HWREG(UART0_BASE UART_O_FR) UART_FR_RXFE)) { // 读取数据同时也会读取错误位如果FIFO使能 uint32_t data HWREG(UART0_BASE UART_O_DR); uint8_t rxByte data 0xFF; // 提取数据字节 uint8_t errors (data 8) 0xF; // 提取错误标志位 // ... 处理数据和处理错误 ... } // 清除接收中断 HWREG(UART0_BASE UART_O_ICR) UART_ICR_RXIC; } if (mis UART_MIS_RTMIS) { // 接收超时中断可能是一个数据包结束 // 同样读取FIFO中剩余的所有数据 while (!(HWREG(UART0_BASE UART_O_FR) UART_FR_RXFE)) { uint32_t data HWREG(UART0_BASE UART_O_DR); // ... 处理数据 ... } // 清除接收超时中断 HWREG(UART0_BASE UART_O_ICR) UART_ICR_RTIC; } // ... 处理其他类型中断 ... }4.2 利用µDMA实现零CPU开销数据搬运当需要处理高速或大数据量的串口数据时DMA是解放CPU的终极方案。CC13x2/CC26x2的µDMA与UART配合非常紧密。配置思路使能UART的DMA功能通过设置UART:DMACTL寄存器的RXDMAE和/或TXDMAE位。配置µDMA通道你需要为UART RX和TX分别配置一个DMA通道。配置内容包括源地址/目的地址对于RX源地址是UART数据寄存器(UART:DR)目的地址是你定义的内存缓冲区。对于TX则相反。传输模式通常使用“Ping-Pong”模式或“自动请求”模式。Ping-Pong模式使用两个缓冲区当一个缓冲区正在被DMA填充时CPU可以处理另一个已满的缓冲区实现无缝数据流。传输大小设置每次突发传输的数据量这个值最好与UART FIFO的触发水位相匹配。仲裁大小决定DMA在一次服务请求中传输多少数据单元如字节。连接触发源将DMA通道的触发源设置为UART对应的DMA请求信号如UART0_RX_DMASREQ。一个简化的RX DMA配置概念// 1. 使能UART的接收DMA HWREG(UART0_BASE UART_O_DMACTL) | UART_DMACTL_RXDMAE; // 2. 配置µDMA通道此处使用TI DriverLib简化示例 // 假设使用通道0作为UART0 RX DMA通道 UDMA_ChannelAssign(UDMA_CH0_UART0_RX); // 分配通道 // 设置通道控制参数源地址不变外设目的地址递增传输字节使用Ping-Pong模式等 // ... 详细的DMA通道配置代码 ... UDMA_ChannelEnable(UDMA_CH0_UART0_RX); // 使能通道 // 3. 当DMA完成传输例如填满了一个Ping缓冲区后会产生DMA完成中断。 // 在DMA完成中断中切换缓冲区重新配置DMA并处理已满缓冲区中的数据。重要提示启用DMA后通常应禁用对应的UART中断如RXIM因为数据搬运已由DMA接管无需CPU通过中断来读取UART:DR。但错误中断如溢出、帧错误可能仍需使能以便CPU及时处理通信异常。4.3 硬件流控RTS/CTS配置要点在高速或不可预测延迟的通信中硬件流控是防止数据丢失的保险绳。CC13x2/CC26x2的硬件流控逻辑清晰CTSEN(CTS使能)当此位置1UART的发送器会在发送每个字符前检查UART_CTS输入引脚的电平。只有当CTS为低有效时才会发送数据。如果CTS为高发送会暂停直到CTS变低。这用于防止接收方缓冲区溢出。RTSEN(RTS使能)当此位置1UART会根据自身接收FIFO的状态自动控制UART_RTS输出引脚。当接收FIFO有空间例如未达到某个水位时RTS输出低电平有效告诉对方“我可以接收”当FIFO快满时RTS输出高电平无效告诉对方“暂停发送”。配置硬件流控// 使能CTS和RTS硬件流控 HWREG(UART0_BASE UART_O_CTL) | (UART_CTL_CTSEN | UART_CTL_RTSEN);接线方式设备A的RTS输出接设备B的CTS输入设备B的RTS输出接设备A的CTS输入。这样就形成了一个双向的流量控制环。常见误区很多人以为使能了RTS/CTS就万事大吉。但请注意流控生效的前提是对方设备也支持并正确配置了硬件流控。如果对方是简单的USB转串口适配器或不支持流控的设备错误的接线或配置反而会导致通信完全阻塞。5. 调试、问题排查与经验实录即使按照手册一步步配置在实际项目中你还是会遇到各种稀奇古怪的问题。下面是我在多年使用CC13x2/CC26x2 UART过程中积累的一些“血泪”经验和排查思路。5.1 通信完全无反应收不到也发不出这是最常见的问题。请按照以下清单逐项排查物理连接这是最基础也最容易被忽视的。确认TX接RXRX接TXGND共地。用万用表测量TX/RX线是否有电压空闲时应为高电平。如果使用USB转串口工具确认其驱动已安装端口号正确。时钟与电源域确认你已调用PRCMPeripheralRunEnable等函数使能了UART的时钟。一个快速验证的方法是尝试读取UART的某个寄存器如UART:FR如果能读到非零值复位值说明时钟可能没问题如果全是0很可能时钟没给上。引脚复用配置重复三遍先配IO再使能UART检查IOCPinTypeUart函数的参数是否正确特别是UART_RX和UART_TX枚举值是否与你的硬件设计匹配。有时开发板的丝印标注的“UART0_TX”可能对应的是芯片的另一个DIO务必核对原理图。波特率这是错误的重灾区。首先确认通信双方MCU和上位机/另一设备的波特率设置完全一致。其次检查你的波特率计算代码是否正确特别是小数部分。一个有效的调试方法是使用示波器测量TX引脚输出的波形。发送一个字节0x55二进制01010101在115200波特率下每个位的时间约8.68us。用示波器测量起始位后第一个下降沿代表第一个数据位0到第二个下降沿代表第二个数据位1之间的时间它应该等于一个位时间的2倍约17.36us。如果测量结果偏差很大说明波特率设置错误。UART使能位确认在完成所有配置后UART:CTL寄存器的UARTEN位已被置1。5.2 能发送但不能接收或接收数据乱码电平问题CC13x2/CC26x2的GPIO是3.3V电平。如果你连接的设备是5V TTL电平直接连接可能会损坏MCU或导致通信不稳定。务必使用电平转换芯片或确认对方设备兼容3.3V输入。停止位/校验位不匹配这是导致乱码的常见原因。如果发送方设置是8N18数据位无校验1停止位而接收方设置为8E1偶校验或2个停止位那么接收方会因为校验失败或帧错误而丢弃数据或者将停止位误判为数据位。确保双方的UART:LCRH寄存器中关于数据位长度(WLEN)、停止位(STP2)、奇偶校验(PEN,EPS,SPS)的设置完全一致。FIFO与中断配置如果你启用了FIFO但没正确配置中断或DMA数据可能静静地躺在RX FIFO里而你的轮询代码因为只检查UART:FR的RXFE位判断单个字节发现FIFO非空但读取UART:DR时却读不到数据不对读取UART:DR会自动从FIFO弹出数据。更可能的情况是你启用了接收中断但中断服务程序没有正确读取数据并清除中断标志导致中断只触发一次后就不再触发后续数据堆积在FIFO中直到溢出。务必在中断中读取数据直到RXFE置位并正确清除对应的中断标志UART:ICR。溢出错误如果接收方处理速度跟不上发送方RX FIFO满了之后新数据就会丢失并置位溢出错误标志(UART:RSR的OE位或UART:DR读出的错误位)。一旦发生溢出错误标志会一直保持直到你通过写UART:ECR寄存器与UART:RSR同地址来清除它。在初始化时或错误处理中记得清除这些错误标志。5.3 使用DMA时的典型问题DMA不启动首先检查UART:DMACTL的RXDMAE/TXDMAE是否已使能。其次检查µDMA通道是否已正确分配并启用。最容易被忽略的是DMA传输完成后的重新配置。在Ping-Pong模式或单次模式下一次传输完成后DMA通道会自动禁用。你必须在DMA完成中断中重新设置传输参数如源/目的地址、数据量并再次使能通道否则DMA只会工作一次。数据错位或丢失检查DMA的传输数据宽度是否与UART数据宽度匹配。UART数据寄存器是8位的所以DMA的传输宽度也应设置为8位字节。如果设置为32位DMA会一次读取4个字节但UART FIFO可能还没攒够4个字节导致数据错乱。DMA与CPU访问冲突确保DMA的目的地址缓冲区是字节对齐的并且CPU和DMA不会同时访问同一块内存区域除非使用原子操作或互斥机制。特别是在使用Ping-Pong缓冲区时设计清晰的状态机来管理缓冲区的所有权哪个缓冲区属于DMA正在填充哪个缓冲区属于CPU正在处理至关重要。5.4 低功耗应用下的注意事项CC13x2/CC26x2常用于电池供电设备。UART模块本身在空闲时功耗很低但需要注意未使用的引脚如果UART功能只用了TX/RX没有用RTS/CTS最好将对应的GPIO引脚配置为通用输入输出并设置为已知状态如上拉或下拉避免浮空输入引起漏电流。睡眠模式下的唤醒UART的RX引脚可以配置为IO唤醒源。当设备处于低功耗睡眠模式时如果RX线上出现起始位下降沿可以触发中断将MCU唤醒。这需要正确配置IOC和电源管理相关设置。DMA与低功耗在深度睡眠模式下CPU和大部分外设时钟都关闭了但µDMA和UART可以在特定条件下继续工作。你可以配置DMA将UART接收到的数据直接搬运到内存甚至是保留内存并在搬运完成或达到一定数量后产生中断唤醒CPU。这是实现极低功耗串口数据监听的关键技术。具体配置涉及电源域、时钟源和DMA的唤醒配置需要仔细阅读芯片的电源管理章节。6. 寄存器精讲与实战配置表手册中的寄存器描述虽然详尽但过于碎片化。这里我将核心寄存器中的关键位字段结合常见配置场景整理成一张速查表方便你在编程时快速参考。寄存器名 (偏移地址)关键位字段功能描述常用配置值/说明UART:IBRD (0x24)DIVINT[15:0]波特率分频器整数部分根据BRD UART_Ref_Clk / (16 * Baud)计算UART:FBRD (0x28)DIVFRAC[5:0]波特率分频器小数部分根据DIVFRAC int(BRDF * 64 0.5)计算UART:LCRH (0x2C)WLEN[6:5]数据位长度0b00:5位,0b01:6位,0b10:7位,0b11:8位FEN[4]FIFO使能1启用FIFO推荐 0禁用字符模式STP2[3]停止位数量01个停止位 12个停止位EPS[2]偶校验选择0奇校验 1偶校验需PEN1PEN[1]奇偶校验使能0无校验 1启用校验BRK[0]发送线路中断1强制TX线为低电平Break信号发送完当前字符后生效。正常通信时保持为0。UART:CTL (0x30)UARTEN[0]UART总使能1使能模块。修改LCRH、IBRD、FBRD前需先清零。TXE[8]发送使能1使能发送默认RXE[9]接收使能1使能接收默认RTSEN[14]RTS硬件流控使能1使能RTS流控CTSEN[15]CTS硬件流控使能1使能CTS流控LBE[7]回环模式使能1启用内部回环TX接RX用于自测试。正常通信时为0。UART:IFLS (0x34)RXSEL[5:3]RX FIFO中断触发水位0b000: 1/8,0b001: 1/4,0b010:1/2,0b011: 3/4,0b100: 7/8TXSEL[2:0]TX FIFO中断触发水位0b000: 1/8空,0b001: 1/4空,0b010:1/2空,0b011: 3/4空,0b100: 7/8空UART:IMSC (0x38)RXIM[4]接收中断屏蔽1允许接收中断触发CPU中断TXIM[5]发送中断屏蔽1允许发送中断触发CPU中断RTIM[6]接收超时中断屏蔽1强烈建议使能用于检测数据包结束FEIM[7],PEIM[8],BEIM[9],OEIM[10]各类错误中断屏蔽根据需求使能用于错误处理UART:FR (0x18)RXFE[4]RX FIFO空1空 0非空。轮询接收时检查此位。TXFF[5]TX FIFO满1满 0非满。轮询发送时检查此位。BUSY[3]UART忙1正在发送包括FIFO和移位寄存器中。可用于判断发送是否完全结束。UART:DMACTL (0x48)RXDMAE[0]接收DMA使能1使能UART接收DMA请求TXDMAE[1]发送DMA使能1使能UART发送DMA请求DMAONERR[2]出错时禁用DMA1当发生任何接收错误时自动禁用接收DMA请求。可用于防止错误数据被DMA搬运。配置顺序黄金法则禁用UART (UARTEN0)。写波特率整数部分 (IBRD)。写波特率小数部分 (FBRD)。写线路控制寄存器 (LCRH)。此步会锁存IBRD/FBRD的新值。配置FIFO中断水位 (IFLS)。配置中断屏蔽 (IMSC) 或DMA控制 (DMACTL)。使能UART (UARTEN1)。最后分享一个我调试UART时最爱用的小技巧编写一个简单的回环测试函数。在初始化完成后启用内部回环模式(LBE1)然后发送一串已知的数据如0xAA, 0x55, 0x01, 0x02...紧接着读取接收到的数据。如果发送和接收的数据完全一致说明UART模块的TX/RX通路、波特率生成、数据格式配置基本正确。这能快速隔离硬件连接问题将故障定位到软件配置或外部设备。