STM32F1 USART寄存器详解:从CR1/CR2/CR3到DR/SR的硬件通信机制
UART是一种基础但关键的异步串行通信接口,其行为由底层寄存器精确控制。理解USART寄存器体系,本质是掌握一种状态机驱动的硬件交互范式——通过配置控制寄存器(如CR1使能位UE、字长位M、中断使能RXNEIE)设定工作模式,借助状态寄存器(SR)实时感知RXNE接收就绪或TC发送完成事件,并经由数据寄存器(DR)实现安全的数据搬运。这种寄存器级操控能力,直接决定嵌入式系统在低功耗、高可靠及实时响
1. USART寄存器体系解析:从硬件视角理解F1系列串口通信机制
在STM32F1系列微控制器中,USART(Universal Synchronous/Asynchronous Receiver/Transmitter)并非一个黑盒外设,而是一套由多个功能寄存器协同构成的、具有明确状态机特性的硬件模块。其行为逻辑完全由寄存器位的配置决定,而非抽象的API调用。理解这些寄存器的物理意义与相互关系,是实现稳定、高效、可调试串口通信的底层前提。本节将脱离HAL库的封装层,深入到STM32F103xx参考手册(RM0008)第25章所定义的寄存器映射空间,逐一对控制、数据与状态三大类寄存器进行工程化解读。所有分析均基于标准工作模式——异步全双工、8位数据、无校验、1位停止位(8-N-1),这是嵌入式系统中最常用、最可靠的配置组合。
1.1 控制寄存器1(USART_CR1):核心功能使能与基础模式设定
USART_CR1 是整个USART模块的“总开关”与“模式定义器”,其32位中的关键位直接决定了外设能否工作以及以何种方式工作。该寄存器的配置必须在时钟使能之后、其他寄存器初始化之前完成,否则任何后续操作均无效。
-
位13(UE - USART Enable) :这是绝对的使能位。当
UE = 0时,整个USART模块处于完全复位状态,所有内部逻辑、移位寄存器、状态标志均被清零并停止工作,功耗降至最低。只有当UE = 1时,模块才开始消耗电流,并响应后续的配置与数据操作。 工程目的 :提供一种软件可控的、彻底关闭外设的手段,用于低功耗设计或故障安全机制。 为什么必须置1 :若此位置0,无论其他寄存器如何配置,USART都将无法发送或接收任何数据,所有状态位恒为0,读写DR寄存器亦无意义。 -
位12(M - Word Length) :数据字长选择位。
M = 0表示8位数据帧,M = 1表示9位数据帧。F1系列的USART支持5至9位的可变字长,但硬件仅实现了8位和9位两种模式。 工程目的 :匹配通信协议要求。绝大多数标准协议(如Modbus ASCII/RTU、AT指令集、自定义二进制协议)均采用8位数据,因其与uint8_t类型天然对齐,内存操作高效,且避免了9位模式下需要额外处理MSB(通常用作地址/命令标识)的复杂性。 为什么选择0 :选择8位不仅简化了软件处理逻辑,更重要的是,它确保了USART_DR寄存器的低8位(DR[7:0])即为有效数据,无需进行位域提取。若误设为9位,则DR[8:0]均为有效,但高位常被闲置,徒增处理开销。 -
位10(PCE - Parity Control Enable)与位9(PS - Parity Selection) :校验控制位。
PCE = 0禁用校验,PCE = 1启用校验;PS = 0为偶校验,PS = 1为奇校验。 工程目的 :在噪声较大的工业现场或长距离通信中,增加一层简单的错误检测能力。 为什么选择PCE=0:在现代嵌入式系统中,校验位的价值已大幅降低。一方面,UART物理层本身不具备重传机制,单靠一位校验无法纠正错误,只能发现约50%的单比特错误;另一方面,应用层协议(如CRC16/CRC32)或更高层的TCP/IP协议栈已提供了更强大、更可靠的检错与纠错能力。禁用校验可节省1位传输时间,提升有效带宽,并消除因校验位计算与验证引入的微小延迟。因此,在F1系列的典型应用中,PCE与PS均保持复位值(0),即无校验模式。 -
位5(RXNEIE - RX Not Empty Interrupt Enable) :接收缓冲区非空中断使能位。
RXNEIE = 1时,当USART_SR寄存器中的RXNE(Read Data Register Not Empty)位被硬件置1,将触发USART中断请求。 工程目的 :实现事件驱动的接收处理,避免轮询造成的CPU资源浪费。 为什么必须置1 :在中断模式下,这是接收数据的唯一触发信号。当外部数据通过RX引脚到达,经采样、同步、移位后,最终被存入接收数据寄存器(RDR),此时硬件自动将RXNE置1。若RXNEIE为0,该事件将被忽略,CPU无法得知有新数据到达,导致数据丢失(接收缓冲区溢出)。该位与RXNE标志共同构成了接收中断的完整条件。 -
位3(TXEIE - TX Empty Interrupt Enable)与位7(TCIE - Transmission Complete Interrupt Enable) :发送相关中断使能位。
TXEIE = 1使能发送缓冲区空(TXE)中断;TCIE = 1使能发送完成(TC)中断。 工程目的 :分别用于管理发送流程的不同阶段。TXE表示发送数据寄存器(TDR)为空,可以写入下一个字节,适用于连续发送多字节数据流;TC表示整个发送过程结束(TDR与移位寄存器均为空),适用于发送单字节或需在发送完毕后执行特定动作(如切换RS485方向引脚)的场景。 为什么本节仅关注RXNEIE:在基础教学与多数简单应用中,接收中断是刚需,而发送中断则根据具体需求选用。TXEIE常用于DMA发送或高吞吐量场景,TCIE则用于精确控制发送时序。本节聚焦于最核心的接收路径,故TXEIE与TCIE暂不置位。 -
位2(RE - Receiver Enable)与位3(TE - Transmitter Enable) :接收与发送使能位。
RE = 1使能接收逻辑,TE = 1使能发送逻辑。 工程目的 :独立控制收发通道的物理使能。 为什么两者均需置1 :全双工通信要求收发通道同时工作。若RE = 0,RX引脚将被置于高阻态,无法采样外部信号;若TE = 0,TX引脚将被拉至默认电平(通常为高),无法驱动发送。二者缺一不可,共同构成了物理层的“通路”。
综上, USART_CR1 的典型配置值为 0x200C (二进制 0010 0000 0000 1100 ),其中 UE=1 , M=0 , PCE=0 , RXNEIE=1 , TE=1 , RE=1 。此配置确立了USART的基本运行框架:一个被使能的、以8-N-1格式工作的、具备接收中断能力的全双工通道。
1.2 控制寄存器2(USART_CR2):帧格式与同步特性配置
USART_CR2 主要负责定义数据帧的结构细节与同步模式,其配置直接影响到通信双方对信号时序的理解。
-
位13与位12(STOP[1:0] - STOP bits) :停止位长度选择位。
STOP[1:0] = 00表示1位停止位,01为0.5位,10为2位,11为1.5位。 工程目的 :为接收端提供一个明确的帧边界标识,确保采样点能稳定落在停止位的中间区域,从而提高抗干扰能力。 为什么选择00:1位停止位是RS-232及绝大多数UART协议的事实标准。它在保证足够帧间间隔的同时,最大化了数据传输效率。0.5位停止位仅适用于高速同步通信的特殊场景;2位停止位曾用于早期电传打字机,现代应用中已基本淘汰;1.5位则是一种折中方案,但在F1系列中,其实际行为与2位停止位一致。因此,STOP = 00是兼容性、效率与可靠性的最佳平衡点。 -
位11(LINEN - LIN mode enable)与位10(CLKEN - Clock enable) :LIN总线模式与同步时钟使能位。
LINEN = 1启用LIN协议的特定功能(如自动同步、从节点唤醒);CLKEN = 1为同步模式提供外部时钟输出。 工程目的 :支持特定的通信协议或主从架构。 为什么本节不涉及 :本节讨论的是标准异步UART通信,上述功能与异步模式无关,其对应位应保持复位值(0)。 -
位9(CPOL - Clock polarity)与位8(CPHA - Clock phase) :时钟极性与相位位。这两个位仅在同步模式(
USART_CR1的CLKEN = 1)下有效,用于定义同步时钟信号的采样边沿。 工程目的 :与外部同步设备(如SPI从设备)进行时序匹配。 为什么本节不涉及 :异步通信不依赖外部时钟,故CPOL与CPHA在此场景下无意义,保持为0即可。
因此, USART_CR2 的典型配置值为 0x0000 ,仅需确保 STOP = 00 ,其余位均维持默认的禁用状态。该寄存器的配置简洁明了,其核心作用就是固化了“1位停止位”这一关键帧结构参数。
1.3 控制寄存器3(USART_CR3):高级功能与特殊模式控制
USART_CR3 包含了一系列增强型功能,但在标准异步全双工应用中,其使用频率远低于前两个控制寄存器。
-
位3(HDSEL - Half-Duplex Selection) :半双工模式选择位。
HDSEL = 1将USART配置为半双工模式,此时TX与RX共用同一引脚(通常为TX引脚),并通过内部硬件自动控制方向。 工程目的 :节省GPIO资源,适用于RS-485等需要总线仲裁的场景。 为什么选择HDSEL = 0:本节目标是全双工通信,需要独立的TX与RX引脚。若错误地置位HDSEL,则RX引脚将失效,所有接收操作均无法进行。因此,该位必须为0,以确保TX与RX通道物理隔离、互不干扰。 -
位2(SCEN - SmartCard mode enable)与位1(DMAR - DMA request enable) :智能卡模式与DMA请求使能位。
SCEN = 1启用ISO/IEC 7816-3智能卡协议;DMAR = 1使能接收DMA请求。 工程目的 :支持特定的行业协议或实现零CPU干预的数据搬运。 为什么本节不涉及 :智能卡模式需要特殊的波特率发生器与字符结构;DMA虽能极大提升性能,但其配置涉及DMA_CCR、DMA_CNDTR等多个寄存器,属于进阶主题。在寄存器级入门阶段,应先掌握中断模式这一最通用、最易调试的机制。 -
位0(RTSE - RTS enable)与位11(CTSE - CTS enable) :硬件流控使能位。
RTSE = 1使能RTS(Request To Send)信号输出;CTSE = 1使能CTS(Clear To Send)信号输入。 工程目的 :在发送方缓冲区即将满载时,通过RTS信号通知接收方暂停发送,防止数据丢失。 为什么本节不涉及 :硬件流控增加了PCB布线的复杂性(需额外连接RTS/CTS线),且在大多数MCU-to-PC或MCU-to-MCU的点对点通信中并非必需。软件流控(XON/XOFF)或应用层协议的流量控制更为灵活。因此,这些位同样保持为0。
综上, USART_CR3 的典型配置值为 0x0000 。在标准应用中,该寄存器几乎无需修改,其存在主要是为了向后兼容与支持高级特性。工程师只需牢记 HDSEL = 0 这一关键约束,即可确保全双工模式的正确建立。
1.4 数据寄存器(USART_DR):数据交换的唯一通道
USART_DR 是一个32位的双功能寄存器,其物理地址相同,但根据读/写操作的不同,访问的是内部不同的子寄存器:写操作访问发送数据寄存器(TDR),读操作访问接收数据寄存器(RDR)。这种设计是典型的“统一地址、分时复用”思想,极大地简化了编程模型。
-
位宽与有效性 :
USART_DR的低9位(DR[8:0])为有效数据位。其实际使用的位数完全取决于USART_CR1中M位的设置。当M = 0(8位模式)时,仅DR[7:0]有效,DR[8]被忽略;当M = 1(9位模式)时,DR[8:0]全部有效。 工程目的 :提供一个与数据字长相匹配的、宽度可变的数据接口。 为什么必须严格匹配 :若在8位模式下向DR[8]写入数据,该位将被硬件丢弃,不会出现在发送波形中;反之,若在9位模式下只写入DR[7:0],则DR[8]将被填充为0或1(取决于PS位),导致接收端解析错误。因此,软件必须根据CR1.M的配置,精确地向DR的相应位域写入数据。 -
读写时序与数据流 :向
DR写入数据,并非立即将其发送出去。数据首先被锁存到发送数据寄存器(TDR)中,随后在移位寄存器(TSR)空闲时,由硬件自动将其从TDR转移到TSR,并开始串行移位输出。同理,接收到的数据首先进入接收移位寄存器(RSR),待一帧接收完毕,再由硬件将其从RSR转移到接收数据寄存器(RDR),此时USART_SR.RXNE被置1。 工程目的 :解耦CPU操作与物理层时序,允许CPU在发送/接收过程中执行其他任务。 为什么不能连续写入 :若在TDR尚未被清空(即USART_SR.TXE = 0)时再次向DR写入,新数据将覆盖旧数据,造成发送丢失。因此,正确的发送流程是:检查TXE标志,待其为1时再写入下一个字节。 -
数据一致性保障 :由于
DR寄存器在读写时访问的是不同物理存储单元,因此不存在读-修改-写(RMW)冲突。向DR写入数据不会影响RDR的内容,从DR读取数据也不会影响TDR的内容。这保证了收发操作的完全独立性与原子性。
USART_DR 是整个USART外设与CPU交互的“咽喉要道”。所有数据的进出,都必须经由它。理解其双功能、位宽可变、以及与 CR1.M 的强绑定关系,是编写正确、健壮串口驱动代码的基础。
1.5 状态寄存器(USART_SR):实时监控与事件触发的核心
USART_SR 是一个只读寄存器,其每一位都反映了USART硬件当前的某个特定状态。它是软件感知硬件行为、做出决策的唯一信息源,其重要性不亚于控制寄存器。
-
位5(RXNE - Read Data Register Not Empty) :接收数据寄存器非空标志。当硬件将一帧完整的数据从RSR转移到RDR后,
RXNE被硬件自动置1。 工程目的 :指示有新数据可供CPU读取。 为什么它是接收中断的基石 :RXNE是USART_CR1.RXNEIE所监控的唯一事件。当中断使能且RXNE = 1时,CPU会跳转至USART中断服务程序(ISR)。在ISR中,首要任务就是读取USART_DR,此举会自动清除RXNE标志。若未及时读取,RXNE将保持为1,导致中断持续触发(如果中断未被清除),或在下一次数据到达时被覆盖(如果RXNE是覆写型标志,F1系列实为覆写型,即新数据到达会强制RXNE = 1,无论前一个是否已被读取)。因此,“读DR即清RXNE”是中断处理的关键规则。 -
位6(TC - Transmission Complete) :发送完成标志。当TDR与TSR均为空,且最后一比特的停止位已被发送完毕时,
TC被硬件置1。 工程目的 :指示整个发送过程的终结。 为什么它比TXE更“终极” :TXE仅表示TDR为空,可以写入新数据,但TSR中可能仍有数据正在移位;而TC则意味着从TDR写入的第一个字节,到刚刚写入的最后一个字节,其所有的起始位、数据位、校验位、停止位均已完整地离开TX引脚。因此,TC是执行发送后动作(如关闭发射器、切换RS485方向)的最安全时机。 -
位7(TXE - Transmit Data Register Empty) :发送数据寄存器空标志。当TDR被硬件清空(即数据已从TDR转移到TSR)后,
TXE被置1。 工程目的 :指示可以向DR写入下一个字节。 为什么它是轮询发送的基础 :在无中断、无DMA的简单发送中,CPU通过循环查询TXE标志,等待其为1,然后写入数据。这是一种最原始但也最可靠的发送方式,适用于对实时性要求不高或中断资源紧张的场合。 -
位4(ORE - Overrun Error)与位3(NE - Noise Error)与位2(FE - Framing Error) :溢出错误、噪声错误与帧错误标志。这些是重要的错误检测位。
ORE = 1表示在RXNE = 1(即RDR中有数据)的情况下,新的数据又到达并试图覆盖RDR,导致数据丢失;NE = 1表示在采样过程中检测到过多的噪声干扰;FE = 1表示接收到的停止位不是预期的高电平(通常是由于波特率不匹配或线路干扰)。 工程目的 :提供通信质量的诊断信息。 为什么必须在读DR后检查 :根据参考手册,读取USART_DR的操作会同时清除RXNE、ORE、NE、FE等多个标志。因此,若要捕获错误,必须在读取DR之前,先读取USART_SR并检查这些位。一个健壮的接收ISR伪代码如下:c if (USART_SR & USART_SR_RXNE) { uint16_t status = USART_SR; // 先读状态寄存器 uint16_t data = USART_DR; // 再读数据寄存器,清除RXNE及错误标志 if (status & USART_SR_ORE) { /* 处理溢出错误 */ } if (status & USART_SR_NE) { /* 处理噪声错误 */ } if (status & USART_SR_FE) { /* 处理帧错误 */ } /* 正常处理data */ }
USART_SR 不是一个静态的“状态快照”,而是一个动态的、事件驱动的“信息总线”。它既是中断的源头,也是轮询的依据;既是正常流程的指示灯,也是故障诊断的仪表盘。对 SR 寄存器的每一次读取,都应被视为一次关键的决策点。
2. 寄存器协同工作原理:从时序图看数据流
理解单个寄存器的功能只是第一步,真正的工程能力体现在对它们之间协同关系的把握上。下面结合STM32F103xx参考手册中的USART框图与时序图,剖析一个完整的8-N-1数据帧在硬件内部的流转路径。
2.1 接收数据流:从引脚到CPU
整个接收过程是一个典型的“三级流水线”:
1. 第一级:接收移位寄存器(RSR) 。外部信号从RX引脚进入,经过内部的数字滤波器(去抖动)后,被送入RSR。RSR是一个串行移位寄存器,它按照设定的波特率,逐位采样、同步,并将接收到的比特流按顺序移入。对于8-N-1帧,RSR需要准确捕获10个比特:1个起始位(低)、8个数据位、1个停止位(高)。
2. 第二级:接收数据寄存器(RDR) 。当RSR完成一帧(10位)的接收,并确认其格式正确(无 FE )后,硬件会将这10位数据中的有效数据部分(8位)并行地、原子性地复制到RDR中。 关键点 :这个复制动作是硬件自动完成的,且是“推”操作。一旦复制完成, USART_SR.RXNE 即被置1。
3. 第三级:CPU读取 。CPU通过执行 ldr r0, [r1, #0x04] (假设 r1 指向USART基地址)指令,从 USART_DR 地址读取数据。该读操作会触发硬件将RDR中的8位数据送到数据总线上,并 同时 将 RXNE 清零。此时,RDR即为空,等待下一次硬件复制。
这个流程清晰地解释了为何 RXNE 是接收中断的唯一可靠标志:它精确地标志着“有效数据已准备好,且位于CPU可立即访问的位置”。任何试图绕过 RXNE 而直接轮询RX引脚电平的做法,都是对硬件设计的误解,必将导致不可预测的错误。
2.2 发送数据流:从CPU到引脚
发送过程则是“三级流水线”的反向:
1. 第一级:CPU写入 。CPU执行 str r0, [r1, #0x04] 指令,将8位数据写入 USART_DR 。该写操作会将数据并行地、原子性地锁存到TDR中。
2. 第二级:发送数据寄存器(TDR) 。TDR是一个并行加载的寄存器。当 TXE 为1时,表示TDR当前为空,可以接受新数据。一旦数据被写入TDR, TXE 即被硬件清零。
3. 第三级:发送移位寄存器(TSR) 。当TSR为空闲时,硬件会自动将TDR中的8位数据并行地复制到TSR中。随后,TSR开始工作:它首先在TX引脚上输出一个起始位(低),然后依次将8位数据(LSB在前)移出,并在最后添加一个停止位(高)。当TSR中的所有比特(10位)都被移出后, TC 被置1;同时,如果此时TDR也为空,则 TXE 被置1。
这个流程揭示了 TXE 与 TC 的本质区别: TXE 是“输入准备就绪”信号,告诉CPU“你可以给我下一个字节了”;而 TC 是“输出彻底完成”信号,告诉CPU“我刚才让你给我的那个字节,已经完完全全地发出去了”。在实现一个可靠的字符串发送函数时,若需等待整个字符串发送完毕,应等待 TC ;若需实现高效的连续发送,则应在每次写入后等待 TXE 。
2.3 波特率与时钟树:寄存器配置的物理基础
所有上述寄存器的时序行为,最终都依赖于一个精确的波特率发生器(BRR)。 USART_BRR 寄存器的值,是由APB2(对于USART1)或APB1(对于USART2/3)总线时钟( PCLK2 或 PCLK1 )与目标波特率共同决定的。其计算公式为: DIV = (PCLK / (16 * BaudRate)) BRR = DIV_Mantissa + (DIV_Fraction << 4)
例如,当 PCLK2 = 72MHz ,目标波特率为115200时, DIV = 72000000 / (16 * 115200) ≈ 39.0625 ,因此 DIV_Mantissa = 39 , DIV_Fraction = 1 (因为 0.0625 * 16 = 1 ),最终 BRR = 0x0027 。
工程启示 :波特率误差是串口通信失败的最常见原因之一。 DIV_Fraction 的取整会引入误差,该误差必须小于±3%才能保证通信可靠。因此,在选择时钟源与波特率时,必须进行严格的误差计算。这也是为什么在F1系列中, USART1 (挂载在APB2上,最高72MHz)比 USART2/3 (挂载在APB1上,最高36MHz)能支持更高的精确波特率。
3. 工程实践:基于寄存器的最小化初始化与中断处理
理论终须落地。以下是一个精简、可移植的、基于寄存器操作的USART初始化与中断处理示例,完全符合前述所有原理分析。
3.1 初始化代码(以USART1为例)
// 1. 使能GPIOA和USART1的时钟
RCC->APB2ENR |= RCC_APB2ENR_IOPAEN | RCC_APB2ENR_USART1EN;
// 2. 配置PA9(TX)为复用推挽输出,PA10(RX)为浮空输入
GPIOA->CRH &= ~(GPIO_CRH_CNF9 | GPIO_CRH_MODE9 | GPIO_CRH_CNF10 | GPIO_CRH_MODE10);
GPIOA->CRH |= GPIO_CRH_MODE9_1 | GPIO_CRH_CNF9_1; // PA9: AF PP, 50MHz
GPIOA->CRH |= GPIO_CRH_CNF10_0; // PA10: Input Floating
// 3. 配置USART1的波特率 (72MHz APB2, 115200)
USART1->BRR = 0x0027; // Mantissa=39, Fraction=1
// 4. 配置USART_CR2: 1位停止位
USART1->CR2 = 0x0000;
// 5. 配置USART_CR3: 禁用半双工等
USART1->CR3 = 0x0000;
// 6. 配置USART_CR1: 8-N-1, 使能RX/TX, 使能RX中断
USART1->CR1 = USART_CR1_UE | USART_CR1_RE | USART_CR1_TE | USART_CR1_RXNEIE;
// 7. 使能USART1中断,并设置优先级(假设使用NVIC)
NVIC_EnableIRQ(USART1_IRQn);
NVIC_SetPriority(USART1_IRQn, 2);
// 8. 全局中断使能
__enable_irq();
3.2 中断服务程序(ISR)
void USART1_IRQHandler(void) {
volatile uint16_t status = USART1->SR;
volatile uint16_t data;
// 检查是否为接收中断
if (status & USART_SR_RXNE) {
data = USART1->DR; // 读DR以清除RXNE
// 在此处添加你的接收数据处理逻辑
// 例如:ring_buffer_push(&rx_buffer, (uint8_t)data);
}
// 检查是否为发送完成中断(如果使能了TCIE)
if (status & USART_SR_TC) {
// 发送完成,可执行后续操作
// 例如:gpio_set(PA8); // 关闭RS485发送使能
}
// 注意:无需手动清除中断标志,硬件已自动完成
}
3.3 调试与排错经验
在实际项目中,我曾多次遇到因寄存器配置疏忽导致的诡异问题:
- 现象 :串口能发送,但无法接收。 排查 :首先检查 CR1.RE 是否为1,其次用示波器确认PA10引脚是否有信号输入,最后检查 NVIC 中断是否被正确使能。最常见的原因是 RE 位忘记置1。
- 现象 :接收数据乱码,但波特率计算无误。 排查 :重点检查 CR1.PCE 。若 PCE = 1 而对方为无校验,接收端会将第9位(校验位)误认为是数据位的MSB,导致所有字节高位置1。
- 现象 :发送第一个字节正常,后续字节丢失。 排查 :检查 CR1.TXEIE 是否被意外置1,导致发送中断抢占了主程序,而中断服务程序中没有正确处理 TXE 标志,造成死循环。
这些经验表明,对寄存器每一位的敬畏之心,是成为一名合格嵌入式工程师的起点。每一个bit,都是硬件工程师与软件工程师之间的一份契约,不容丝毫马虎。
4. 总结:寄存器视角下的通信本质
USART寄存器体系并非一堆孤立的配置项,而是一个精密的、状态驱动的有限状态机(FSM)。 CR1/CR2/CR3 是它的“状态转换表”,定义了在何种条件下,模块应进入何种工作模式; DR 是它的“数据端口”,是状态机与外界交换信息的唯一接口; SR 是它的“状态指示器”,实时反馈当前所处的状态。理解这一点,便能超越“配置几个寄存器”的初级思维,上升到“设计一个状态机”的工程高度。
在F1系列的开发中,我们不必拘泥于HAL库的便利,也不必畏惧于寄存器的复杂。只要牢牢抓住“使能(UE/RE/TE)”、“模式(M/PCE/STOP)”、“中断(RXNEIE)”、“数据(DR)”、“状态(SR)”这五大核心概念,并深刻理解它们之间的因果链条,便能在任何一款基于Cortex-M3内核的MCU上,自信地驾驭串口通信这一最基础、也最重要的外设。毕竟,所有高级的抽象,最终都要回归到对这些朴素寄存器的精准操控之上。
openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。
更多推荐

所有评论(0)