一、问题发现 在项目中我想通过阻塞的方式接收一段来自串口的数据,于是使用了HAL_UART_Receive函数,但跑起来发现一直超时接收不到。网上使劲搜但没搜到啥有用的结果,那只能自己捣鼓了。一开始怀疑是硬件的问题,于是用示波器直接连到对应的rx脚上,发现数据正常;于是我又尝试使用中断接收的方式,发现也能接收。那么,基本可以确定是HAL_UART_Receive这个函数本身有问题了。5 ]8 W/ }# @1 g; } 2 I7 m+ v) ?9 P K2 O 二、问题追踪 进入debug,并打开使用的USART的寄存器监视(我使用的USART1),发现RXEN一直都是0,ORE一直都是1(这两个都是ISR寄存器中的标志),也就是说,这个函数中没有清除ORE标志的动作,导致串口在收到第一个数据后,再没机会去接收第二个数据;这时候再看HAL_UART_Receive,不论在接受前,还是在接收循环体内,都没看到OREF的清除代码6 |, b5 H' s2 S$ | h6 O " M$ z# H( b u8 T 循环接受中未看到OREF的清除 三、问题解决! s% S! l0 b/ v' M% i 把USART的ISR(链接文章中为SR)寄存器看一下,再通过上面的解释,问题就可以解决了,只要在HAL_UART_Receive的循环体内添这么一句话# p0 h' X( W) }: J0 m 6 C. }5 y# c+ c R2 a8 n8 u2 x/ @ 现在终于可以正常阻塞接收了!/ @4 i! r/ N0 s3 N7 t/ U 最后,本着不动库函数的原则(防止cube重新生成后忘了修改),建议在某个地方重写这个函数并引用 % ]. ?% `" T8 j4 V5 h ————————————————$ S2 K4 y# a. o3 W0 p6 x9 z- O 版权声明:balibala / h; k3 u, \+ E, U |
【STM32MP135-DK】裸机移植shell
NUCLEO-U545RE-Q评测】3. 串口基本收发测试
NUCLEO-U545RE-Q评测】4. 串口实用收发测试
基于STM32模拟UART串口通信
【STM32H503评测】+ coremark跑分移植测试
基于STM32H563演示UART+DMA经验分享
STM32的通用同步异步收发器USART模块
STMCube UART与ADC配置
STM32™ 自举程序中使用的 USART 协议
开启Cache后UART无法发送新数据