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

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

[复制链接]
STMCU小助手 发布时间:2023-1-8 12:00
串口数据的接收可以用三种方式:9 C2 H6 z( \9 S; T# |0 {1 z, _$ ]
0 o: }* E# ~4 Q% {1 ]* N% q2 p
1、阻塞方式(接收数据很少用到)
5 R. @( s2 ~5 r  M4 ^& O  y( j9 B
! t8 ?1 ~5 {9 X- ^( l2、中断方式(用的比较多,但是在接收不定长协议数据时候,逻辑判断较复杂)
( G0 c* W, N# M, F* P8 T1 L
) T% E: Y1 W: g- A3、DMA IDLE方式(常用做接收不定长数据)4 Y9 V9 B0 n6 Y" }8 V: y
( M  c5 `$ ?/ n" k% q; r% T
用cubemx配置下串口驱动如下
% M( v8 _$ m( p, S2 U9 G! @+ v5 t0 b1 l% O. L! O) K
5f4834cdd1d048478b116a1e73f0865d.png 7 C, {/ s$ Q0 Q2 ]1 L; A1 Q
& o4 w; l3 k# F. M! `( k
0ed858769ddd4027924597d212fb7555.png
2 n" g8 g" d6 ], t: D- D* r- o" b. x+ ]: w9 m
0cda97d07ed045e586c6c85c856417ff.png
! W% Z' r8 o% n- U4 Y# ?& z/ J; Q. `- b/ M8 u9 y; }+ ^' d- g' T! }3 l
9de17471c88e46c4b053104db539a82c.png
* {" M/ O( Y- f: z4 K* ~7 w7 _' m
& o1 o# d( \3 C2 Z+ g) u$ ?6 A" y/ _ 接收数据用到的结构体
8 t: L9 M9 I8 U" q
  1. #define uart_buf_size    256
    4 C6 c$ o; }9 w7 k$ ]1 j( [, i, x% a
  2. typedef union{
    + l9 _# ^  i  y2 h  r
  3.         struct{
    ' C0 H9 \2 L, G1 A# f; l
  4.                 uint8_t buf[uart_buf_size];
    ( E2 o$ v* E/ w- b6 N6 q$ ~
  5.                 uint8_t timeout;
    9 e& M1 W1 k. M& I- {. _
  6.                 uint16_t len;8 d4 Q% H& `+ z  Z* R' M
  7.         }bf;8 }. H* b& V$ J" h0 g
  8.         uint8_t data[uart_buf_size+3];
    ; Q/ _( x* N# w8 k
  9. }uart_struct_t;
复制代码

. [% F1 f* g7 u& l 使能串口空闲中断+ S- d  d- j9 }9 o2 [2 Q
6 Q( V4 [, B8 \: D# i( w  Y
99c0dedd3bb4410aa17e33ee6ebcf212.png
8 J; O$ O( k" e9 U5 z
7 T( K9 }7 @2 ?" A7 i9 U! Y
  1. __HAL_UART_ENABLE_IT(&huart1,UART_IT_IDLE);
    ( A7 T2 |+ v6 u
  2. HAL_UART_Receive_DMA(&huart1,(uint8_t *)&uart_info.bf.buf[0],uart_buf_size);
    7 `, f3 a+ o' j; Y
  3. __HAL_UART_CLEAR_IDLEFLAG(&huart1);
复制代码
$ ?" s8 c1 c& g! R: a2 o+ Q4 r
重定义printf需要在头文件中加入stdio.h,同时也添加下string.h好使用memxxx函数
: \. O' u  V! J/ B7 Y
  1. int fputc(int ch, FILE *f)1 W3 H0 L% p3 W' w
  2. {
    + E, X4 c0 N- ]8 k: i! g5 y8 Z
  3.         while(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_TC) != SET);
    2 Z6 w3 s6 J3 B# k% _8 e
  4.         HAL_UART_Transmit(&huart1,(uint8_t *)&ch,1,100);/ G- \- C( C  ]+ G$ o" f) F
  5.         return ch;
    1 K3 |% t9 O) i1 g0 T# @) b2 W* L
  6. }
复制代码
, A9 l& J- f% v
中断中进行数据的处理  X3 k1 k6 N6 _
  1. void USART1_IRQHandler(void)
    / h! `, {3 X; n4 R
  2. {
    1 N  [8 o  v1 V2 w$ ]: y3 u
  3.   /* USER CODE BEGIN USART1_IRQn 0 */1 g' D3 ^+ z- `. n# J6 l
  4.         if(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE) == SET)
    6 E$ ]5 s& v) w' w$ p
  5.         {: B5 ^( _* E# A4 u* Y: ^
  6.                 __HAL_UART_CLEAR_IDLEFLAG(&huart1);8 Y+ @8 \+ z$ S( G3 \- C$ [- V
  7.                 HAL_UART_DMAStop(&huart1);
    - z' @% p* ^( A% S) ^
  8.                 if(uart_info.bf.timeout == 0). B, n5 ?7 d7 h& f5 R
  9.                 {
      x; F0 C' e1 }, W, w9 v
  10.                         uart_info.bf.timeout = 1;  w1 j0 W4 a! D; c! P6 t; u
  11.                         uart_info.bf.len = uart_buf_size - __HAL_DMA_GET_COUNTER(&hdma_usart1_rx);$ U9 _3 p' r- ]  d2 h, _2 H0 P
  12.                         
    $ O* J6 C2 W6 N0 k; m* H1 B
  13.                         HAL_UART_Transmit(&huart1,(uint8_t *)&uart_info.bf.buf[0],uart_info.bf.len,100);- B) }* {. j$ J, b5 E* y1 P* V
  14.                 }
      o9 {% b  ~2 v- q6 C1 f
  15.                 uart_info.bf.timeout = 0;& U) P2 @' {  D3 F; C
  16.                 memset(uart_info.bf.buf,0,uart_buf_size);, H/ F- `4 O2 `8 J7 K$ H4 {
  17.                 HAL_UART_Receive_DMA(&huart1,(uint8_t *)&uart_info.bf.buf[0],uart_buf_size);
    - s  c) ~" a+ C$ T* r; L2 R
  18.         }
    6 I" Z3 G! ]$ {) I* M" i3 p5 @
  19.   /* USER CODE END USART1_IRQn 0 */
    1 o' Q# g9 C& {' r/ _
  20.   HAL_UART_IRQHandler(&huart1);
    . g( d, o5 d% h0 n4 m/ O9 @. o/ ~
  21.   /* USER CODE BEGIN USART1_IRQn 1 */
    ; t* n2 y/ _' `, K& q& t- V
  22. - ~! ~+ y2 b2 h8 d! j
  23.   /* USER CODE END USART1_IRQn 1 */
    ) ~# V1 s; s7 M3 o: {2 [/ N2 e

  24. : M5 u: e# J% d- z0 ^4 s: C
复制代码
+ Z/ ]* k. _8 j. X9 \; w
以上代码是将接收到的数据原样返回+ ~9 ^! ]+ t# T' ~( P$ V: s
————————————————
6 q) E8 S8 z- v版权声明:jiangxinzhumeng4 ]4 `& j+ w9 f# S9 F6 }+ W. k: V

6 ]1 o1 q5 {8 i% `; C
赞 收藏 评论0 发布时间:2023-1-8 12:00

举报

0个回答

所属标签

相似技术帖

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