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

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

[复制链接]
STMCU-管管 发布时间:2021-8-27 11:03
前言
( j- Y5 k, t' _7 X8 H- H5 S, M4 m, m$ ^# l
在串口通信过程中,我们常常用到接受和发送中断,相信大家都不陌生。这里还有另一个非常有用的中断可能被大家所忽略,即总线空闲状态IDLE中断。当一帧数据传输结束之后,总线会维持高电平空闲,此时会触发MCU的IDLE中断。在本文中,将介绍使用该中断来进行不定长串口数据接收的办法。通过该中断,可以省却用于检测数据传输是否完成的判断操作。9 p8 H% ~- B, k

. a' ~2 I! b% \8 A: s7 D实验环境
2 ]( h9 Y. k: E2 [! X3 S·        STM32F411RE-NUCLEO3 V: ~/ Y; w% d6 _7 k
·        STM32CubeMX) f; e" u0 `; }7 [3 y9 C/ F

, G; S: u/ n2 J' l* ~总线状态分析
9 L; `$ P: p' o3 L9 C4 @8 {2 t, O( W
下图是发送0xAA 0x55的所抓取到的波形。从图中我们可以看到在发送该帧之前和之后,总线时钟处于IDLE状态。在该帧中,字节与字节之间,没有IDLE状态出现,即不会出现IDLE误触发的情况。6 A" z- c. c9 n  V! `
12.png
9 y0 l2 W0 X( z% ~$ H1 v  X
不定长数据接收0 G6 `" Y9 E1 G( o5 u( _
2 {! S+ U1 M. K! Q" L  L
本次制作的工程是基于HAL库的。在原生的HAL库中,并没有集成IDLE中断的处理。所以,在本文我们介绍的方法中,需要修改一些库文件来实现。7 D( }, h3 S* L

; w# R  f# V  h- C使用 STM32CubeMX 生成实验工程- R+ p4 [0 `* t% C4 B% }
1 a8 `* K! Y" T9 s4 I. V4 ?
工程的配置如下图:
8 ]' B; P$ `# ^, K( c  i" Q; b# \( T
1. 系统始终配置为100MHz
9 Q; t# H5 x$ C4 v2. 配置USART2为Asynchrones,管脚配置为PA2,PA3。
8 J  o& J9 N& T, m+ @1 O3. USART2参数:9600Bits/s, 8bits, None,1Stop$ }( c/ I# k- N3 \1 [3 T' r
13.png
7 O! i: M: ?$ u3 D1 c) E2 O  s
为了方便打印接收到的相关信息,需要对生成的工程做如下修改来映射print函数。* ~$ H" U$ T0 T+ L9 A- c

) _( y# i( R9 I' }/ `4 ymain.c-声明
: ~4 R( Z% J. ?# C  [& g
14.png

7 r6 O; H5 L0 h7 }6 Amain.c-Code
$ I) S- N/ w* h2 q4 a: }" \  f
15.png

$ N9 u9 }0 ]+ a1 M9 |$ F8 r0 v4 u修改工程代码' j" k, g% i/ i8 g- G. P( \* H5 s; A
, |" Z4 F4 U8 v- {- q  }( j
增加接收Buffer
( D( I; c, C) ^% r: G$ H7 Kmain.c
% x2 J/ N# C7 _! K7 ?
16.png
' u: }6 \1 w$ X
stm32f4xx_hal_uart.c
( [; a7 V% h. m
17.png

: `. i! I  T7 S1 y  y9 U在接收函数中使能IDLE中断
+ U8 D. O. E; K' e8 p- ?6 Z+ T) t" U1 X0 `
stm32f4xx_hal_uart.c -> HAL_UART_Receive_DMA()函数: O. d1 }, X* _3 A% Q+ L
18.png
. b3 ]  q, \  h' s: l
处理IDLE中断/ ?, Z7 t2 @+ q$ o! E3 `( M

! Q& B' f/ I$ C1 G5 v+ ?stm32f4xx_hal_uart.c -> HAL_UART_IRQHandler ()函数; Z- L# r& a. q
19.png
2 m! t4 R9 c6 t7 T: k$ H
接收完成处理(IDLE产生,一帧数据传输完成)
# m+ }& H( Y( Q2 |1 [+ D" T& k) x1 |/ d' T( Q1 X5 u
stm32f4xx_hal_uart.c -> HAL_UART_AbortReceive_IT ()函数2 p, e9 z9 Z8 m9 p* E
20.png

( I, X% v* w3 P/ Z( Smain.c
* y0 Z( Q2 ^# V; X
21.png
" u/ ^% D% [0 M. ~1 x
使能接收9 X: A: A* z! ]' b
main.c
1 `: d. i, s" y  l2 I1 d0 \' _
22.png

" t' }3 D0 |1 J% L' y实验结果+ |) b0 s7 [& [# H
- @7 |; \- Q' W( I

) h6 r9 Z* g  E' n3 [. t使用串口调试,通过STLINK的虚拟串口发送数据,MCU会返回接收多少个字节的数据,并将接收到的数据打印出来。下图是发送0xAA 0x55的实验结果。
" K1 ]; ~* {& R4 m. k  Z
23.png
2 h& g7 N+ Q. Y
小结
" J6 H' l/ d) W% H% ~
# E. a. g+ B- F合理使用串口总线空闲状态中断,在接收那些数据量不确定的场合会非常方便,同时也能很好地优化代码设计。+ A0 c5 _$ M* J, d  y; Z. G
赞 收藏 1 评论0 发布时间:2021-8-27 11:03

举报

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