|
一、问题发现: j/ N2 U7 H( _% U6 A/ {7 Y 在项目中我想通过阻塞的方式接收一段来自串口的数据,于是使用了HAL_UART_Receive函数,但跑起来发现一直超时接收不到。网上使劲搜但没搜到啥有用的结果,那只能自己捣鼓了。一开始怀疑是硬件的问题,于是用示波器直接连到对应的rx脚上,发现数据正常;于是我又尝试使用中断接收的方式,发现也能接收。那么,基本可以确定是HAL_UART_Receive这个函数本身有问题了。* V! B- b$ f9 h1 p9 F 4 b$ O+ `. @* k" O
: N, `! c" H6 }2 h 二、问题追踪 进入debug,并打开使用的USART的寄存器监视(我使用的USART1),发现RXEN一直都是0,ORE一直都是1(这两个都是ISR寄存器中的标志),也就是说,这个函数中没有清除ORE标志的动作,导致串口在收到第一个数据后,再没机会去接收第二个数据;这时候再看HAL_UART_Receive,不论在接受前,还是在接收循环体内,都没看到OREF的清除代码
循环接受中未看到OREF的清除. m. N/ a% G5 S6 o ~( d2 f ]* E 8 S( F' N; i( E" y 三、问题解决 把USART的ISR(链接文章中为SR)寄存器看一下,再通过上面的解释,问题就可以解决了,只要在HAL_UART_Receive的循环体内添这么一句话 ?: E. g# \) b+ T f - ~6 G7 J7 k0 G1 l5 v p- e
现在终于可以正常阻塞接收了!: q- t7 X! [# M8 Q2 [ - i* r' I# L; J8 B/ l
0 ?) y' G# {4 o* U4 e# u 最后,本着不动库函数的原则(防止cube重新生成后忘了修改),建议在某个地方重写这个函数并引用 ) J7 D3 X1 g- x) K ———————————————— 版权声明:balibala ' A( x3 n8 q7 s7 z! t2 ` |
经验分享 | USART接收的数据怎么错位啦?
经验分享 | 基于STM32H7 UART 空闲事件及DMA传输示例
经验分享 | STM32G4 UART+TIMER+DMA应用示例
经验分享 | STM32H563 UART+DMA 2D功能演示
经验分享 | 基于STM32H563演示UART+DMA功能
【STM32U3评测】实现双通道串口通信系统
STM32G系列RS485自动收发控制以及自适应波特率实战
【STM32H7S78-DK评测】CoreMark移植和优化--兼记printf重定向实现方法及常见问题
【STM32MP135-DK】裸机移植shell
NUCLEO-U545RE-Q评测】3. 串口基本收发测试
微信公众号
手机版