LAT1361
Local Application Tips
LAT1361 Rev 1.0 Jan. 2024
STM32 USART 能否支持 9 位数据格式话题
关键字:USART9bit 数据格式,
1、问题描述
有客户反馈,他最近在做一个项目用到 STM32L051 这款单片机。平常的 USART 串口传输
8 位数据,但是他的项目需要用串口传 9 位数据。当设置为 8 位数据时,串口响应中断
常。但是,当设置为 9 数据时,串口就不产生中断了。USART2 ISR 寄存器 RXNE 位被置
1RDR 寄存器接收到了数据,就是不产生中断,数据也读不出来。请问是不是 HAL 库函数哪
里出了 bug?另外,客户还补充说,使用 STM32CubeMX 进行配置并创建的工程代码。
2、问题分析
客户表达的意思就是说,他使用 8 位数据格式进行 USART 通信时一切 OKUART 中断也
正常,说明人家对这个模块的使用还是熟悉的。但使用 9 位数据格式时发生异常了。大致意思是
说使用 9 位数据格式后数据貌似也收到了RXNE 也置位了,就是基本的中断没法产生。落脚点
就是怀疑 ST 的相关 HAL 库函数是不是有 Bug
说实话,本人之前也没有使用 USART 9 位数据格式做过工程或验证测试。现在客户的重
点是怀疑库的 Bug 问题。先打开相应库函数,扫了几眼并未能看出代码有什么不妥的地方。然
后,打开手册,看看 L05X 系列芯片的 USART 到底支不支 9 位数据格式的传输。
LAT1361
LAT1361 - Rev 1.0 page 2/8
经核对手册,STM32 片的 USART 都是支持 9 位数据格式的,包括低功 LPUART
3、问题验证
既然这样,手册明确了芯片的 USART 支持 9 位数据格式。赶紧找一块跟客户同一个系列的
开发板 32L053DISCOVERY 做针对性的测试验证。
因为客户使用的是 USART2,所以我开始也是使用 STM32L051 USART2 进行测试,巧
的是,测试结果似乎不如人意,接收都成问题。结合方才阅读各个系列的手册得知,STM32
列的 USART 都支持 9bit 数据格式。刚好手边有块 STM32G4 列的板,任意选了个片上的
USART 进行测试,也是采用中断方式进行收发。这次很顺利,收发正常。这个验证可以初步
定我们的相关库代码是没问题的,因为 HAL 库针对公共功能的代码是一样的。然后我再回过来
基于 32L0538DISCOVERY 开发板进行验证,发现原来是这块开发板上的 USART2 所使用
GPIO 已作他用,有两个跳线焊盘没有连接,所以并没有实际连接到排针上,所以使用前检查一
下电路图很重要。这次我干脆就用其兄弟 USART1 来进行测试,这次非常顺利。同时也比较了
USART1 USART2 的特性,这个地方二者没有差别。断定问题出在客户的配置或应用代
上,我们的库没有问题
之后,我将基于 STM32CubeMX 的配置和测试代码提供给客户进行参考、验证。