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

stm32串口DMA空闲中断接收不定长数据

[复制链接]
STMCU小助手 发布时间:2023-1-8 12:00
串口数据的接收可以用三种方式:
' v+ F- n9 p$ @$ G
7 v, m3 Q: u. h4 v4 w
1、阻塞方式(接收数据很少用到)
' D4 W; T3 k4 j, |( C) u
/ D# ^1 v, A+ j, Q, o2 t4 g0 ~2、中断方式(用的比较多,但是在接收不定长协议数据时候,逻辑判断较复杂)# b, S. z$ d$ K4 [
1 a7 I- m, }" t3 e* C- e
3、DMA IDLE方式(常用做接收不定长数据)
6 i( V9 Y) R- ^4 d7 G; i

  s$ B. A; y0 K9 H用cubemx配置下串口驱动如下" K# g4 O% ?; C
3 q1 s3 H0 P8 y" S9 U
5f4834cdd1d048478b116a1e73f0865d.png
8 d* x# G8 a( g5 z+ E& z
  I( H8 r% L7 j* O* u6 [5 Y0 B
0ed858769ddd4027924597d212fb7555.png $ h8 m7 s* j/ Y0 x& \

3 t, ?& V' o7 V( G
0cda97d07ed045e586c6c85c856417ff.png
5 E7 O& p& h7 O$ f; L! x5 G6 h2 M0 M+ H/ D0 i8 A
9de17471c88e46c4b053104db539a82c.png / B: X4 |% C3 I8 z( H" N' |
* V. H$ ]7 z3 h5 F5 L$ ^  \
接收数据用到的结构体
. _- {% w% W+ @' J5 B
  1. #define uart_buf_size    256. w8 k+ l& ?( Q7 T  J
  2. typedef union{
    * g2 p0 F% t% N1 H* ~
  3.         struct{- ~/ b8 ?0 J; @6 C. F6 H
  4.                 uint8_t buf[uart_buf_size];8 q; G5 j. h" \5 `
  5.                 uint8_t timeout;
    # L$ Y% r5 E1 A$ m5 H  q0 ~
  6.                 uint16_t len;* i* v; @6 E/ `( @- T6 J
  7.         }bf;
    7 [1 s# j* H% Z0 u
  8.         uint8_t data[uart_buf_size+3];
    " [: t& m) w( G4 }! `0 ^
  9. }uart_struct_t;
复制代码
8 z$ C/ T5 C8 s6 r& m( M" @4 W
使能串口空闲中断/ Y) D1 j, Q& B
; Y+ [( \: z/ G% Q1 }& N% X* e
99c0dedd3bb4410aa17e33ee6ebcf212.png
5 o$ W5 f" P5 c# M6 y3 g$ e+ h8 l1 u  H3 H* C. {7 X0 S
  1. __HAL_UART_ENABLE_IT(&huart1,UART_IT_IDLE);
    6 X! Y; ]+ q5 d: A6 w. h
  2. HAL_UART_Receive_DMA(&huart1,(uint8_t *)&uart_info.bf.buf[0],uart_buf_size);
    ) J  l% _/ d5 W
  3. __HAL_UART_CLEAR_IDLEFLAG(&huart1);
复制代码

3 ^4 p0 s+ s) _/ | 重定义printf需要在头文件中加入stdio.h,同时也添加下string.h好使用memxxx函数
+ q7 }) I1 a5 b! ?! p# I, R
  1. int fputc(int ch, FILE *f)
    3 m) c' a- u% e- h* n% c6 G5 ?
  2. {
    2 I$ {& F$ `, C: q
  3.         while(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_TC) != SET);
    $ y1 u7 v2 h/ G: D! s6 W; i5 u
  4.         HAL_UART_Transmit(&huart1,(uint8_t *)&ch,1,100);2 [  n) R% F, a# F; x
  5.         return ch;% {9 d8 L7 v1 [- a
  6. }
复制代码

, {# L1 u# C8 C) f1 i中断中进行数据的处理
/ ~8 d- i: Y6 ^
  1. void USART1_IRQHandler(void)$ E8 @; w+ X( n/ [4 }3 ~
  2. {# {6 b9 w4 k# s5 ^- N
  3.   /* USER CODE BEGIN USART1_IRQn 0 */
    ; H. M+ B5 D5 `2 ^( n4 ~
  4.         if(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE) == SET)
    ' S+ m4 b+ A& }# J
  5.         {
    " |% T# u! B6 v/ G
  6.                 __HAL_UART_CLEAR_IDLEFLAG(&huart1);* h/ E0 A- L# p+ }
  7.                 HAL_UART_DMAStop(&huart1);
    ) o+ A1 T, v6 w- r9 e
  8.                 if(uart_info.bf.timeout == 0)
    # g; H" C: [% Q( A
  9.                 {
    7 f. U8 D: A% E9 t0 w7 i7 n
  10.                         uart_info.bf.timeout = 1;
    4 W" P. n; ~* T/ w6 M2 Y2 v9 q, w- [
  11.                         uart_info.bf.len = uart_buf_size - __HAL_DMA_GET_COUNTER(&hdma_usart1_rx);" ]- C- a& P$ J* A7 C
  12.                         4 l8 ^1 D" `+ m& J) V0 n
  13.                         HAL_UART_Transmit(&huart1,(uint8_t *)&uart_info.bf.buf[0],uart_info.bf.len,100);
    6 A/ p& H2 A2 h; F( l. z
  14.                 }+ k: I: z$ P$ o$ D' u7 S
  15.                 uart_info.bf.timeout = 0;
    & a6 E$ F! w9 l7 y- }& c
  16.                 memset(uart_info.bf.buf,0,uart_buf_size);( ^3 W- l; V/ G/ {1 y: N2 Q
  17.                 HAL_UART_Receive_DMA(&huart1,(uint8_t *)&uart_info.bf.buf[0],uart_buf_size);$ H! i8 n0 ]8 m; w8 w. G
  18.         }# p) G) t4 f( ~
  19.   /* USER CODE END USART1_IRQn 0 */) V' t0 p, G. V6 Q4 a
  20.   HAL_UART_IRQHandler(&huart1);4 t( m4 y9 ~+ z% K
  21.   /* USER CODE BEGIN USART1_IRQn 1 */
    , e2 ~7 }0 }( k7 p. ?& h, k

  22. 9 u' i- V  v  ?7 S3 \3 ^
  23.   /* USER CODE END USART1_IRQn 1 */
    6 L* K4 v5 G! v* J: J
  24. . K7 K. z5 c( z! o$ s
复制代码

& m& G1 L- F! g7 z' y以上代码是将接收到的数据原样返回
! _, g) C# A# M; D& M: \————————————————
1 q, c  j& C  B/ t- W版权声明:jiangxinzhumeng; `: ~; T& L7 v* D8 u. G0 u9 `
& z, K! G7 T! C7 q7 c
收藏 评论0 发布时间:2023-1-8 12:00

举报

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