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

【经验分享】UART IDLE 中断使用-接收不定长串口数据

[复制链接]
STMCU小助手 发布时间:2022-2-15 22:07
前言
2 s. R  _- d- H+ L在串口通信应用中,我们常使用接受和发送中断,相信大家都不陌生。这里有个非常有用的中断可能被大家所忽略,即总线IDLE 中断。当一帧数据传输结束之后,总线会维持高电平状态,此时,就可以触发 MCU 的 IDLE 中断。在本文中,将介绍使用该中断来进行不定长串口数据接收的办法。通过该中断,可以省却很多用于检测数据传输是否完成的判断动作。" Z0 @7 W3 M; E7 V2 N
实验环境
2 g/ j. B7 g  S' e/ o. \+ i   STM32F411RE-NUCLEO* ^% T6 U3 r9 T% E
   STM32CubeMX
" ?5 _- \! O1 s3 Q9 n0 b" d7 A5 d2 n4 b5 Y" v
总线状态分析# U0 }, ~/ A' A- X
下图是发送 0xAA 0x55 的所抓取到的波形。从图中我们可以看到在发送该帧之前和之后,数据线处于 IDLE 的状态。在该帧中,字节与字节之间,没有 IDLE 状态出现,即不会出现 IDLE 误触发的情况。
2 K* K) J' t& {* x* L! U8 K# Q4 A; z7 v: X- N
G_YB)_J~CWYDHOKQS]P0.png 2 v; e. N, c; u4 A) |/ ^, j; G
/ ]  @+ w9 u) G0 J3 J
不定长数据接收
4 ^9 I7 A: g3 i; p本次制作的工程是基于 HAL 库。在原生的 HAL 库中,并没有集成 IDLE 中断的处理。所以,在本文我们介绍的方法中,需要修改一些库文件来实现。
) j% M3 x. T  w0 {6 K
  O" M$ S) ?, M* T; q, I6 P- Z使用 STM32CubeMX 生成实验工程
$ O* d4 r; N4 j5 l, R' ?工程的配置如下图:  p4 p4 ^  c# y* `
1. 系统始终配置为 100MHz8 A4 @. W8 U0 l, A* l' o4 v
2. 配置 USART2 为 Asynchrones,管脚配置为 PA2,PA3。& T& _; {' _5 ]  X9 c2 w! Z& t+ v
3. USART2 参数:9600Bits/s, 8bits, None,1Stop; e7 _  D9 I/ ^, e5 O
- B* n7 v, p9 N
{NA4%H92Q97)J{D5LUGEWAE.png
: l& u/ I: A$ c8 r, p- m  k+ j6 q% x, Y& V! R
为了方便打印接收到的相关信息,需要对生成的工程做如下修改来映射 print 函数。9 \6 O. b2 H5 [  ]
main.c-声明/ E' ?; w' `) m2 |
  1. #ifdef __GNUC__  l# b0 \3 o- k1 u; X- \" \
  2. /* With GCC, small printf (option LD Linker->Libraries->Small printf
    - f# o- m9 F! ~' y
  3. set to 'Yes') calls __io_putchar() */
    * o/ |( x) p& H8 x" C  ]
  4. #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)1 Q6 L1 L; w1 s/ a
  5. #else
    - Q- @1 q9 t. G* ^5 B- f
  6. #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)5 v, I4 p) P) ^! n6 |) M
  7. #endif /* __GNUC__ */
复制代码

8 ?! A1 ?, i: \0 y9 X- q- h0 v0 X  X: F
main.c-Code& ?9 n" |3 t9 |
  1. /**1 U' X* n" [, o  z, q, `5 [

  2. ; R1 l0 r4 b3 B5 U
  3. * @brief Retargets the C library printf function to the USART." L% z6 g1 P5 j8 K8 S7 y7 W
  4. * @param None/ w7 ^5 Q3 a8 }6 o* f
  5. * @retval None0 s; G" K6 t) b/ U/ w: W
  6.   */
    1 X, `5 @  t; B' ~8 ^
  7.   PUTCHAR_PROTOTYPE0 }  ~  U8 F) Y" |; l
  8.   {" @( A; a, K; ?5 y* V4 s
  9.   /* Place your implementation of fputc here */
    5 k. ^- t0 m  z* B/ q  Z  h8 l- H
  10.   /* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */$ X/ C- v$ ]) X% I
  11.   HAL_UART_Transmit(&huart2, (uint8_t *)&ch, 1, 0xFFFF);5 g7 `# h% }7 O: f+ k; _+ o! Y
  12.   return ch;7 ?" [3 w9 g3 J: x5 z
  13.   }
复制代码
0 C! c7 o( h9 d1 O! r% v' n& e
  修改工程代码6 P1 X5 j$ J* V8 p9 V/ t0 B$ r
  增加接收 Buffer

! }8 B. D2 k0 \+ u  main.c& K5 }/ T9 c: R  u5 a" o
  1.   //Modification 0
    0 B2 B! j) N( i7 i* y: W
  2.   //Store the revceived bytes number
    % b$ p& F( C6 W& q. D
  3.   uint32_t Rev_Size = 0;
    + I  U. c- R( N9 ~5 y
  4.   //Receive buffer
    # U. O# Q1 y9 w- I. n1 n; x% J
  5.   uint8_t UART_RX_Buf[15];
复制代码
# r& p; r  M7 D- Q
  stm32f4xx_hal_uart.c7 Z- I4 A8 M0 w0 \
  1.   //Modification 0
    ! E' V- a" `% L9 H" D8 \; n
  2.   extern uint32_t Rev_Size;
复制代码
/ ^) x7 _6 w5 d' r0 G' x1 b
  在接收函数中使能 IDLE 中断( L' W" E0 z2 L1 [1 B
stm32f4xx_hal_uart.c -> HAL_UART_IRQHandler ()函数) |/ G& _9 H  ^
  1. //Modification 25 q  G8 ~8 G& Z7 h
  2. if(((isrflags & USART_SR_IDLE) != RESET) && ((cr1its & USART_CR1_IDLEIE) != RESET))
    5 B$ o# f- V' K& S1 a8 M& J5 m
  3. {' r/ j; ]0 S$ p6 D1 B/ O+ f
  4. //Record the received bytes number7 t; G6 p, k( y  {( q4 n
  5. Rev_Size = huart->RxXferSize - huart->hdmarx->Instance->NDTR;# A% r1 `' j) }1 _; M
  6. //clear the IDLE flag9 L; g2 A0 }0 ~3 n/ \% n; T( Y# k
  7. __HAL_UART_CLEAR_IDLEFLAG(huart);
    * c9 z" D1 [  _  r/ z6 z- V8 M3 n
  8. //Abord the received process
    4 i3 r/ `3 ~2 i' Y1 u- d3 s* [$ s
  9. HAL_UART_AbortReceive_IT(huart);
    " l* B- g, \- U2 k
  10. return;
    $ B3 `# @) b6 u) H' X9 w, A
  11. }
复制代码

9 b. B3 k  W% u& Q& j" f

" _0 f% {- b6 g0 V6 }. ~3 `接收完成处理(IDLE 产生,一帧数据传输完成)
: B9 ?& ]- T* w1 B: Y  s) xstm32f4xx_hal_uart.c -> HAL_UART_AbortReceive_IT ()函数
- R6 n8 d% H/ m
  1. <div>//Modification 3</div><div>CLEAR_BIT(huart->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE| USART_CR1_IDLEIE));</div><div>// CLEAR_BIT(huart->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE));</div>
复制代码
9 Y) `2 k" K" B* X- ^# A: w

( ^" ]& z8 A# q& ?- g6 Kmain.c, h  ^4 [8 e- O5 x7 B  [& v
  1. <div><div>//Modification 4</div><div>void HAL_UART_AbortReceiveCpltCallback (UART_HandleTypeDef *huart)</div><div>{</div><div> //Print received Bytes</div><div>printf("\n\r[IDLE]Received %d Bytes:",Rev_Size);</div></div><div><div>for(uint16_t i = 0; i < Rev_Size; i++)</div><div>{</div><div>printf(" 0x%02X", UART_RX_Buf[i]);</div><div>}</div><div>//Re-start receiving</div><div>HAL_UART_Receive_DMA(&huart2, UART_RX_Buf, 15);</div><div> /* NOTE : This function should not be modified, when the callback is needed,</div><div> the HAL_UART_AbortTransmitCpltCallback can be implemented in the user file.</div><div> */</div><div>}</div></div>
复制代码

4 b* r- V5 M) d4 B  ^8 V; ]
$ ?% q( y$ V. a9 x! Q# T: ?  N( j6 N6 q( F4 k' ~
使能接收' f5 p- [. l' x% g2 W
main.c
, {( h, U# C3 I$ ]5 j( O
  1. <div>//Modification 5. ‘15’ is the total number to be received. Make sure it can cover the</div><div>longest frame.</div><div> HAL_UART_Receive_DMA(&huart2, UART_RX_Buf, 15);</div>
复制代码

4 ?: ]1 N$ K1 r; R0 \) j$ K- `4 u: u
9 U5 v: g! w0 R
实验结果
- r8 O& _: {, X- a% P8 B使用串口调试串口,通过 STLINK 的虚拟串口发送数据,MCU 会返回接收多少个字节的数据,并将接收到的数据打印出来。% z0 q# W0 r: G1 n$ s' j
下图是发送 0xAA 0x55 的实验结果。( G0 h) U. ~) l, P# K( y6 e7 \7 R
5 {/ C& W, m3 A
4 ]8 g; C5 d3 F" q" ]1 a( \0 c" q% s
24I%WL`B_XX29`0L0N}JQ]E.png
% L9 `% D8 g' m4 }4 \2 J( F6 a2 u
. J/ s, {; d0 I$ b小结
* m+ F( b) ], o! ?IDLE 作为指示总线空闲状态的中断,合理的使用能够很大程度的节省代码程序设计工作量。这里只是做个简单示范,抛砖引
5 G6 e' w$ X( m7 l" W玉,实际应用中希望大家可以灵活使用满足所需。
: c. A* B. C" r% Y+ R! T" O5 {$ c* `! l
2 H0 X- {: I) g4 f

+ Q2 q& f  p" i) {0 J1 B
收藏 1 评论0 发布时间:2022-2-15 22:07

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版