STM32 HAL 串口中断接收模式出错的原因

本文探讨了使用STM32 HAL库时串口采用中断模式出现的死锁现象,并分析了其可能的原因。文章提到,在串口发送过程中再次发送数据可能导致死锁,并给出了与__HAL_LOCK相关的解决方案及串口溢出中断(ORE)的处理方法。

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

用STM32 HAL库,串口使用中断模式,发现程序有时候会进去死锁状态,原因应该是串口在发送过程中,这时候数据又被发送过去了,然后就很容易会死锁了。

上网找了相关的资料,见链接:

https://blog.youkuaiyun.com/mickey35/article/details/74255041

作者分析了原因,是__HAL_LOCK的原因,这里点个赞。

作者又写了另外一种情况下串口死锁的解决方法,具体可见:

https://blog.youkuaiyun.com/mickey35/article/details/78529637

串口溢出中断(ORE)。继续点个赞。


### 如何在 STM32 中禁用 UART/USART 中断接收 为了在 STM32 中禁用 UART 或 USART 的中断接收功能,可以通过 HAL 库提供的 API 函数来实现。具体来说,可以使用 `HAL_UART_DeInit` 来完全重置 UART 外设,或者更精细地控制通过清除特定的中断使能位。 #### 使用 HAL 库禁用 UART 接收中断 如果仅需停止接收中断而不影响其他设置,则应直接操作寄存器中的相应标志位: ```c // 停止 USART1 接收中断 __HAL_UART_DISABLE_IT(&huart1, UART_IT_RXNE); ``` 上述代码片段展示了如何利用宏定义的方式关闭指定 UART 实例(这里是 huart1 对象关联的 USART1)上的 RXNE (Receive Not Empty) 中断事件[^1]。 对于更加彻底的操作,比如当不再需要任何与该 UART 相关的功能时,可以选择初始化整个外设回到默认状态: ```c if(HAL_OK != HAL_UART_DeInit(&huart1)){ // 误处理逻辑... } ``` 这段程序会将硬件资源释放并把所有配置参数恢复成出厂设定值,从而间接达到了取消监听的目的。 另外需要注意的是,在某些情况下可能还需要调整 DMA 设置以防止潜在冲突,特别是当之前启用了基于 DMA 的自动数据传输机制之后[^3]。 #### 手动修改寄存器方式 如果不采用 HAL 库而希望通过直接访问底层寄存器的方式来达到相同效果,那么可以根据具体的 MCU 型号查阅官方手册了解对应 CR1 寄存器内的 RE(Receiver Enable) 和 RIE(Receive Interrupt Enable) 两位的作用,并编写如下形式的汇编指令或C语言语句对其进行清零操作: ```c // 关闭 USART1 的接收使能和接收中断使能 USART1->CR1 &= ~(USART_CR1_RE | USART_CR1_RIE); ``` 这种方法更为底层但也增加了出错的风险,因此建议优先考虑使用更高层次抽象所提供的工具和服务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值