STM32HAL——USART系列

本文详细介绍了STM32的USART硬件控制(RTS/CTS)、中断控制以及HAL库中的DMA传输。重点讲解了DMA控制器的工作阶段、配置及在STM32F1和F4中的差异,并提供了CubeMX配置示例。还提到了实验记录和如何修改相关函数以适应不同需求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

UART

硬件控制(RTS/CTS)

RTS (Require ToSend,发送请求)为输出信号,用于指示本设备准备好可接收数据,低电平有效,低电平说明本设备可以接收数据。

CTS (Clear ToSend,发送允许)为输入信号,用于判断是否可以向对方发送数据,低电平有效,低电平说明本设备可以向对方发送数据。

两者可在 HAL 中选择是否启用。(由硬件接口判断,并且注意在串口监视软件中设置相应的 Hardware Control )由于是硬件接口,无需修改软件层面。

中断控制

涉及 USART 的中断事件表

Interrupt Event Event Flag Enable Control Bit
TransmitData Register Empty TXE TXEIE
Clear To Send (CTS) flag CTS CTSIE
Transmission Complete TC TCIE
Received Data Ready to be Read RXNE RXNEIE
Overrun Error Detected ORE RXNEIE
Idle LineDetected IDLE IDLEIE
Parity Error PE PEIE
BreakFlag LBD LBDIE
Noise Flag, Overrun error and Framing Error in multi buffer communication NF or ORE or FE EIE

以上任意一个中断事件发生,都会进入 USARTX_IRQHandler 函数。这里需要用户自己判断标志位(具体可以参考 HAL 库做法)并处理相应中断,然后清除标志位

HAL

HAL 库实现 UART_HandleTypeDef 作为一个 UART 实例。

总的传诵方式分为三种:DMA、IT、阻塞传输。

阻塞传输:

HAL_UART_TransmitHAL_UART_Receive是阻塞传输。两个函数都会传入一个Size,为接受/发送数据的长度。待传送字符串传递完后执行下一行代码。

阻塞传输注意超时设置,这个会由于硬件关系而有不同,数量级在千级别。

中断传输:

HAL_UART_Transmit_ITHAL_UART_Receive_IT是非阻塞传输。 HAL 开启中断传送,并将 UART 设置位忙碌状态(供其余函数查询是否传输完毕)。

中断传输会调用回调函数。HAL_UART_TxCpltCallback 、<

### STM32 HAL 库中的USART中断与FIFO使用 #### USART 中断处理机制 在STM32微控制器系列中,通过HAL库可以方便地配置和管理USART通信接口。对于USART接收操作而言,`HAL_UART_Receive()` 函数允许开发者指定一个超时参数来控制等待数据的时间长度[^1]。 当采用中断驱动的方式进行UART/USART的数据收发时,通常会涉及到多个事件触发条件: - **RXNE (Read Data Register Not Empty)**:表示有新数据到达并存储到了读寄存器内; - **TC (Transmission Complete)**:表明所有待发送的数据已经成功发出; - **IDLE**:检测到线路处于空闲状态一段时间后触发此中断信号;这特别适用于多包连续传输场景下区分不同消息边界的情况[^3]。 针对IDLE线程的具体行为描述指出,在接收到最后一字节后的特定时间内如果没有新的字符到来,则会产生该类型的中断通知应用程序层已结束当前帧的接收过程。 #### FIFO模式下的优化策略 为了提高效率以及更好地支持大数据量交换需求,部分型号如H743提供了硬件级别的FIFO缓冲区支持,并且可以通过设置相应的位域来自定义其工作特性(比如使能DMA请求)。然而需要注意的是,并不是所有的MCU都具备这样的高级功能模块[^2]。 如果目标平台确实拥有上述资源的话,那么就可以考虑利用这些特性进一步简化编程逻辑——例如不再需要频繁轮询查询状态标志位的变化情况而是交由底层自动完成相应动作;同时也能有效减少CPU占用率从而释放更多计算能力给其他任务去执行[^4]。 下面给出一段基于安富莱方案修改而成的例子用于展示如何结合IT方式实现带FIFO特性的异步串行通讯服务程序框架结构: ```c // 定义全局变量保存要发送的数据队列指针 extern uint8_t tx_fifo[]; uint16_t fifo_length; void UART_Init(void){ /* 初始化USART外设 */ // 设置为中断模式传送 __HAL_UART_ENABLE_IT(&huart, UART_IT_RXNE); } void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){ static uint8_t rx_data; if(huart->Instance==USARTx){ // 处理接收到的一字节数据 // 如果是预期的最后一字节则关闭接收中断防止溢出 if(/*判断条件*/){ __HAL_UART_DISABLE_IT(huart,UART_IT_RXNE); // 可选开启IDLE中断监听后续可能存在的额外信息片段 __HAL_UART_ENABLE_IT(huart,UART_IT_IDLE); } // 清除已完成标志准备下次调用 HAL_UART_Receive_IT(huart,&rx_data,1); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值