STM32学习-串口

STM32学习-串口
一、数据通信基础概念1. 按数据通信方式分类数据通信可以先从“数据是怎么传过去的”来理解。类型说明串行通信数据逐位按顺序依次传输并行通信数据的各个位通过多条线同时传输串口属于串行通信接口。它一次传输一位数据硬件连线相对简单因此在嵌入式系统中非常常见。2. 按数据传输方向分类类型说明典型特点单工通信数据只能沿一个方向传输只能发或只能收半双工通信数据可以沿两个方向传输但需要分时进行同一时刻只能一个方向全双工通信数据可以同时进行双向传输可以同时发送和接收常见的 UART 通信通常是异步全双工通信也就是发送线和接收线相互独立。3. 按数据同步方式分类类型说明同步通信通信双方共用同一时钟信号异步通信没有独立时钟信号通过起始位、停止位等信息完成同步USART/UART 常用的是异步通信方式。异步通信没有额外的时钟线因此通信双方必须提前约定好波特率、数据位、停止位、校验位等参数。4. 比特率与波特率比特率表示每秒传送的比特数单位是bit/s。波特率表示每秒传送的码元数单位是Baud。两者关系为比特率 波特率 * log2(M)其中M表示每个码元可承载的信息量。对于二进制系统波特率在数值上通常等于比特率。常见串行通信接口对比接口同步方式通信方向UART异步全双工1-Wire异步半双工IIC同步半双工SPI同步全双工二、串口与 RS-2321. 什么是串口串口即串行通信接口是按位发送和接收数据的接口。常见标准包括 RS-232、RS-422、RS-485 等。RS-232 常见接口形式是 DB9 接口通信时主要关注信号作用TXD发送数据RXD接收数据GND信号地实际连接时两个设备之间通常需要交叉连接设备 A TXD - 设备 B RXD 设备 A RXD - 设备 B TXD 设备 A GND - 设备 B GND2. RS-232 电平与 CMOS/TTL 电平RS-232 的电平标准与单片机 IO 使用的 CMOS/TTL 电平不同。电平类型逻辑 1逻辑 0RS-232-15V 到 -3V3V 到 15VCMOS 3.3V3.3V0VTTL 5V5V0V结论CMOS/TTL 电平不能与 RS-232 电平直接通信必须通过电平转换芯片。常见转换方案场景常用芯片MCU 与 RS-232 设备通信MAX3232、SP3232 等STM32 与电脑 USB 口通信CH340C 等 USB 转串口芯片3. RS-232 异步通信协议RS-232 异步通信的一帧数据通常包括字段说明起始位必须占 1 位保持逻辑 0 电平有效数据位可选 5、6、7、8、9 位低位 LSB 在前高位 MSB 在后校验位可选 1 位也可以没有停止位必须有可选 0.5、1、1.5、2 位保持逻辑 1 电平串口通信配置时发送端和接收端必须保持参数一致否则会出现乱码或无法通信。三、STM32 的 USART1. USART 与 UARTUSART 全称为 Universal Synchronous Asynchronous Receiver Transmitter即通用同步异步收发器。UART 全称为 Universal Asynchronous Receiver Transmitter即通用异步收发器。在 STM32 开发中USART/UART 都可以与外部设备进行全双工异步通信。虽然 USART 支持同步和异步模式但实际学习和项目中更常用的是异步通信。2. STM32 USART 主要特征STM32 的 USART 常见特征包括支持全双工异步通信支持单线半双工通信发送器和接收器可以单独使能可配置使用 DMA 的多缓冲器通信提供多个带标志位的中断源学习 USART 时除了会使用 HAL 库还应该结合芯片参考手册中的 USART 章节理解寄存器、框图和标志位。3. USART 数据发送与接收思路从功能结构上看USART 主要完成两件事发送CPU 或 DMA 将数据写入发送相关寄存器USART 按配置好的格式和波特率发送出去。接收USART 检测到外部输入的数据帧后将数据放入接收相关寄存器并通过标志位或中断通知 CPU。常用标志位包括标志位含义TC发送完成标志可用于判断是否可以继续发送RXNE接收数据寄存器非空标志可用于判断是否收到数据4. 波特率设置USART 的波特率由串口时钟和波特率寄存器共同决定。不同 STM32 系列的公式略有差异。STM32F1波特率公式baud fck / (16 * USARTDIV)其中fck是串口时钟。例如 USART1 通常来自PCLK2其他串口通常来自PCLK1。F1 系列中波特率寄存器BRR的配置方式为USARTDIV整数部分写入BRR[15:4]USARTDIV小数部分写入BRR[3:0]5. USART 关键寄存器以 F1 系列为例常见寄存器包括寄存器作用CR1控制 USART 使能、数据位、校验、中断、发送和接收等CR2配置停止位等参数CR3配置半双工等扩展功能DR数据寄存器写入用于发送读取用于接收SR状态寄存器可查看 TC、RXNE 等状态标志典型配置项CR1位 13使能 USARTCR1位 12配置数据位CR1位 10配置校验控制CR1位 5使能接收缓冲区非空中断CR1位 3使能发送CR1位 2使能接收CR2配置停止位CR3配置是否使用半双工模式虽然使用 HAL 库时不需要直接操作所有寄存器但理解这些寄存器有助于排查串口不工作、乱码、中断不触发等问题。四、HAL 库外设初始化 MSP 回调机制HAL 库中外设初始化一般分为两层HAL_PPP_Init() - HAL_PPP_MspInit()其中PPP表示具体外设例如 UART、SPI、I2C 等。HAL_PPP_Init()主要配置外设自身的工作参数而HAL_PPP_MspInit()用于完成与硬件平台相关的底层初始化。以 USART 为例HAL_UART_MspInit()通常需要配置GPIO 引脚GPIO 复用功能外设时钟NVIC 中断优先级中断使能MSP 回调函数通常由用户根据硬件连接进行重新定义。五、HAL 库中断回调机制HAL 库中断处理通常遵循如下调用链中断服务函数 - HAL_PPP_IRQHandler() - HAL_PPP_xxxCallback()以串口为例USARTx_IRQHandler()或UARTx_IRQHandler()是实际的中断服务函数入口。HAL_UART_IRQHandler()负责处理 HAL 内部的中断状态。HAL_UART_xxxCallback()是用户编写具体业务逻辑的位置。这种机制的好处是底层中断判断交给 HAL 库处理用户只需要在对应回调函数中处理接收完成、发送完成、错误等事件。六、USART/UART 异步通信配置步骤使用 HAL 库配置 USART/UART 异步通信时可以按以下流程理解1. 配置串口工作参数调用HAL_UART_Init();需要配置的典型参数包括波特率数据位停止位校验位工作模式发送、接收或收发硬件流控过采样方式2. 完成串口底层初始化调用或重写HAL_UART_MspInit();主要完成 GPIO、NVIC、CLOCK 等硬件相关配置。3. 开启串口异步接收中断调用HAL_UART_Receive_IT();该函数用于启动中断方式接收。开启后当串口接收到指定长度的数据HAL 库会进入对应回调函数。4. 设置中断优先级并使能中断常用函数HAL_NVIC_SetPriority(); HAL_NVIC_EnableIRQ();如果没有正确配置 NVIC即使 USART 外设产生中断CPU 也可能不会进入中断服务函数。5. 编写中断服务函数常见形式void USARTx_IRQHandler(void) { HAL_UART_IRQHandler(huartx); }这里的USARTx和huartx需要替换为实际使用的串口编号和句柄。6. 串口数据发送发送数据可以通过寄存器或 HAL 函数完成。使用 HAL 库时常用HAL_UART_Transmit();相关 HAL 函数可以重点掌握函数作用HAL_UART_Init初始化 UART 参数HAL_UART_Receive_IT开启中断方式接收HAL_UART_Transmit阻塞方式发送数据七、IO 引脚复用功能1. 什么是 IO 复用STM32 的 IO 引脚既可以由 GPIO 外设控制也可以由其他外设控制。类型说明普通 GPIOIO 端口的输入或输出由 GPIO 外设控制复用功能IO 端口的输入或输出由非 GPIO 外设控制串口的 TX、RX 引脚就属于典型的 IO 复用场景。比如某个引脚不再作为普通 GPIO 输出高低电平而是连接到 USART 外设由 USART 控制该引脚发送和接收数据。2. STM32F1 的 IO 引脚复用F1 系列中需要注意以下几点某个 IO 支持哪些复用功能需要查看芯片数据手册的引脚定义。同一时间一个 IO 只能用作一种复用功能。如果不同外设抢占同一个 IO 的复用功能就会产生冲突。遇到复用功能冲突时可以考虑使用重映射功能。3. STM32F4/F7/H7 的 IO 引脚复用为了解决 F1 系列中 IO 复用功能冲突较多的问题F4 及后续系列加入了复用器机制。复用器特点每个 IO 引脚都有一个复用器。复用器提供 16 路复用功能输入即AF0到AF15。每次只允许一个外设的复用功能连接到 IO 引脚。通过GPIOx_AFRL和GPIOx_AFRH寄存器配置复用功能。需要注意复位完成后所有 IO 默认连接到系统复用功能AF0。IO 引脚与AF0到AF15的具体对应关系必须查阅对应芯片的数据手册。使用串口前不仅要配置 TX/RX 引脚模式还要配置正确的 AF 编号。