你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

工程师笔记 | 使用UART IDLE中断接收不定长数据

[复制链接]
STMCU-管管 发布时间:2021-8-27 11:03
前言0 y- P1 x4 N2 }
9 ]; x$ I2 O# Z: y! B% N
在串口通信过程中,我们常常用到接受和发送中断,相信大家都不陌生。这里还有另一个非常有用的中断可能被大家所忽略,即总线空闲状态IDLE中断。当一帧数据传输结束之后,总线会维持高电平空闲,此时会触发MCU的IDLE中断。在本文中,将介绍使用该中断来进行不定长串口数据接收的办法。通过该中断,可以省却用于检测数据传输是否完成的判断操作。# n+ `- f4 v! C& u5 p
, d* i! o6 [6 S* C
实验环境5 {' z4 ^) F, o7 }- w& U
·        STM32F411RE-NUCLEO$ Q+ B% \5 V$ @* N" C2 f
·        STM32CubeMX1 v# h' j* d6 I" L) X
. u) |$ i2 y! l$ h8 m: r. U! [
总线状态分析
  o1 z5 T' Y5 p& [, U& N0 g. W; m6 e2 [( {: Q% O7 B+ M
下图是发送0xAA 0x55的所抓取到的波形。从图中我们可以看到在发送该帧之前和之后,总线时钟处于IDLE状态。在该帧中,字节与字节之间,没有IDLE状态出现,即不会出现IDLE误触发的情况。; r5 Y8 d4 w* s/ i: `
12.png

9 p0 @3 z  K. t6 }! s( |不定长数据接收; I0 }0 k4 Z7 m. ^$ _/ _
) J0 Z( g; B, k6 z& O
本次制作的工程是基于HAL库的。在原生的HAL库中,并没有集成IDLE中断的处理。所以,在本文我们介绍的方法中,需要修改一些库文件来实现。
4 F9 [/ O$ m: Z6 g8 `" u: I/ Z3 ]1 R' h# h( Y
使用 STM32CubeMX 生成实验工程& G+ @( u% r4 E8 H# Y4 Q! d/ r
& ?! ?( b7 z) y( l+ y
工程的配置如下图:) G. p" z# _- [  C+ O1 s
2 d( s* K2 X+ s& Q. r) l# `  f
1. 系统始终配置为100MHz' U, T  k2 \- X6 N% Q
2. 配置USART2为Asynchrones,管脚配置为PA2,PA3。3 ?* J1 N3 V0 q; h0 ~( _- ]2 b' h
3. USART2参数:9600Bits/s, 8bits, None,1Stop
$ S- e' O8 \' q7 u( p; M  E
13.png
. |8 O- G) ?% N; A
为了方便打印接收到的相关信息,需要对生成的工程做如下修改来映射print函数。
2 m. i- ^9 y! d! b$ ~

! ?% `: U( F# u+ Emain.c-声明. a" y7 H% E+ T- C2 }
14.png

/ C. @7 d0 ~* B# m! Imain.c-Code% |, a- o/ t0 a0 {8 M" c9 p
15.png

; X% z- a6 Y  ?% y) [修改工程代码+ U4 N2 c  y) b( z! d
: R" Z, s1 M4 l& d5 S
增加接收Buffer- ?7 R0 @: p' {: x
main.c- a% c0 ?0 g3 K; s) t
16.png
* `9 I: w5 {9 R/ I; @" a1 [
stm32f4xx_hal_uart.c
# H- P& O% j2 z" X; P- Z1 _' Y
17.png
( D7 n/ Y1 u: E; h0 l
在接收函数中使能IDLE中断
( ~" K- W; p: w4 ]
( F8 K2 T) j3 C% dstm32f4xx_hal_uart.c -> HAL_UART_Receive_DMA()函数
# m/ I0 `9 O% i
18.png
- d" P9 {& T3 Q4 L
处理IDLE中断( {3 n6 }/ I2 N; L7 w
& E. F8 }$ V# i
stm32f4xx_hal_uart.c -> HAL_UART_IRQHandler ()函数
1 ^/ H& b" q% `
19.png
: U1 d6 Y4 G7 G
接收完成处理(IDLE产生,一帧数据传输完成)9 F5 w- J4 H5 @( V

1 e& d( }% M- \4 O8 l. \stm32f4xx_hal_uart.c -> HAL_UART_AbortReceive_IT ()函数
: g+ c$ E9 Y) F9 V3 |3 G
20.png
! v1 R' O; Y# O- x; N, Q6 @
main.c
9 ?2 J1 ]9 q  H1 L8 \
21.png
+ i- c( ^: P4 d6 _
使能接收4 W2 M% }+ N8 L4 s
main.c
3 K: W3 f! t! H, O1 i
22.png
  `# `: a- O3 X3 `: [
实验结果
* ~  b5 {7 G9 V
2 j2 B8 F- G; f) e  a8 R

1 d& I" s9 y1 r! K1 S使用串口调试,通过STLINK的虚拟串口发送数据,MCU会返回接收多少个字节的数据,并将接收到的数据打印出来。下图是发送0xAA 0x55的实验结果。
- W0 `* H. R7 }  A: _- e" h' H' Y) `8 [3 j
23.png
( T5 M6 u  G" ^' }. M5 R2 U
小结) w% F" ]+ L, k" _7 Q

3 N$ v( E; X' i/ G合理使用串口总线空闲状态中断,在接收那些数据量不确定的场合会非常方便,同时也能很好地优化代码设计。  s) E3 U8 j; a/ W+ K" i
赞 收藏 1 评论0 发布时间:2021-8-27 11:03

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版