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

【经验分享】STM32CubeMX配置小记录——F7串口DMA收发

[复制链接]
STMCU小助手 发布时间:2021-12-12 21:44

之前没有写调试记录的习惯,导致前段时间刚弄过的一个东西,现在拿起来要么翻之前的代码,要么就再慢慢调,虽然知道自己肯定是可以战胜困难,但总是浪费很多时间,所以以后准备多写一些记录,方便自己用的时候查。嘻嘻

STM32CubeMX这个工具用习惯了还是很爽的,就是有些傻逼的地方是,他并不能给你弄到位,有的东西还是得自己调一下。

打开串口并使能中断后,如果要开启DMA收发的功能,只需要使能对应的通道就可以了。

生成代码的过程就不废话了。

在串口初始化里面调用这个函数来定义串口中断接受长度。

HAL_UART_Receive_IT(&huart1, (uint8_t *)aRx1Buffer, 1);

不要忘记在中断函数里面再次调用。

一个完整的发送周期如下,清除完成标志也可以放在下次发送的开始。

  1. void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)2 U7 y' d. [# b' N( i/ \& v
  2. {3 j. ~9 s9 Q  B) Q6 `: `  J4 N
  3.     static uint8_t sta = 0;
    % o' q# @; E; p. @! k. \
  4.     if(huart->Instance==USART1)//Èç¹ûÊÇ´®¿Ú1
    $ A0 `8 M  j) I$ \
  5.     {
    % Q7 i9 x+ f/ w: }3 s* }
  6. //        USART_RX1_BUF[Usart1_len]=aRx1Buffer[0];
    5 n! Z1 j& {5 t, R; a+ P6 z3 U
  7. //        Usart1_len++;  M; W  b" K, Q
  8. //        if(Usart1_len == 0x04)                             
      o" j# X' u1 J
  9. //    {) k0 }$ P% ~0 n
  10.         HAL_UART_Transmit_DMA(&huart1,(uint8_t*)aRx1Buffer,USART_RX1_LEN);
    3 q( ]) z+ ]# m/ d
  11.         while(1)
    0 ~9 J/ t3 s* v9 A& N- h4 P
  12.             {3 e2 k% a2 k& S; |% ?
  13.                 if(__HAL_DMA_GET_FLAG(&hdma_usart1_tx,DMA_FLAG_TCIF3_7))//µÈ´ýDMA2_Steam7´«ÊäÍê³É
    & z8 Y6 z7 a) t: X7 C; Q/ i
  14.                 {1 g9 ]+ j# ], y; Z& y
  15.                     __HAL_DMA_CLEAR_FLAG(&hdma_usart1_tx,DMA_FLAG_TCIF3_7);//Çå³ýDMA2_Steam7´«ÊäÍê³É±êÖ¾5 W4 N3 X! c/ H7 V2 ^
  16.                     HAL_UART_DMAStop(&huart1);      //´«ÊäÍê³ÉÒÔºó¹Ø±Õ´®¿ÚDMA
    $ f& C$ n3 R# D* G
  17.                     break;
    / j7 @+ M( o  J
  18.                 }
    * ]1 H8 H9 {) C! C& K0 d
  19.                             //    __HAL_DMA_GET_COUNTER(&hdma_usart1_tx);9 W6 @# ]% b. [$ h1 r( a% p
  20.                             }: t* _7 n- c- o! X
  21.         switch(sta)
    ; p, ], a4 S3 v- D; H* g, ^0 {9 C8 C; Z
  22.         {% o2 R  ^* ~% @% q# E7 {- ?
  23.             case 0:if(aRx1Buffer[0] == 0x55) sta = 1;break;5 W  m$ V2 ]+ {$ M0 a
  24.             case 1:if(aRx1Buffer[0] == 0xaa) mode = 1,sta = 2;else sta = 0;break;8 t( g3 g- H% X/ n) _! B
  25.             case 2:mode = 0;sta = 0;break;
    * R/ s$ P' t, Y+ n
  26.         }        
    ( Q, l% k! V; z1 Z2 u5 g
  27.         HAL_UART_Receive_IT(&huart1, (uint8_t *)aRx1Buffer, RX1BUFFERSIZE);   " h5 ^+ v3 O* e3 O$ |- x
  28. //        }            . X( P2 \: t$ L) F
  29.     }
    7 k5 L, f: S2 K, t( G& R
  30.     if(huart->Instance==USART2)//Èç¹ûÊÇ´®¿Ú2
    $ K& q5 h: H# G. E5 N
  31.     {% ]3 a1 @" A6 X9 c
  32.         HAL_UART_Transmit_DMA(&huart2,(uint8_t*)aRx2Buffer,USART_RX2_LEN);
    . ^, ?8 n; y' i* j
  33.         while(1)
    5 Y* C2 s# }. o. {
  34.             {
    & K3 h9 R  b& D1 u
  35.                 if(__HAL_DMA_GET_FLAG(&hdma_usart2_tx,DMA_FLAG_TCIF2_6))//µÈ´ýDMA2_Steam7´«ÊäÍê³É+ o- w; A; M, T  w9 V
  36.                 {4 P4 W7 P( ]7 U4 O
  37.                     __HAL_DMA_CLEAR_FLAG(&hdma_usart2_tx,DMA_FLAG_TCIF2_6);//Çå³ýDMA2_Steam7´«ÊäÍê³É±êÖ¾% C4 Z6 v9 d& y7 ^1 t2 L
  38.                     HAL_UART_DMAStop(&huart2);      //´«ÊäÍê³ÉÒÔºó¹Ø±Õ´®¿ÚDMA8 J: ~& G% R# L! _
  39.                     break; 8 x& E! I6 s& n% W; h" |7 y
  40.                 }! ^1 g2 L8 g7 J8 D( V: _
  41.                             //    __HAL_DMA_GET_COUNTER(&hdma_usart2_tx);2 d/ v; `/ x- N- ?3 ]9 [
  42.                             }    //·¢ËͽÓÊÕµ½µÄÊý¾Ý
    / W2 J9 ?5 I" P! A( ^& a
  43.         while(__HAL_UART_GET_FLAG(&huart2,UART_FLAG_TC)!=SET);        //µÈ´ý·¢ËͽáÊø$ U% @2 t% f' e* j  t7 |3 U7 B
  44.         HAL_UART_Receive_IT(&huart2, (uint8_t *)aRx2Buffer, RX2BUFFERSIZE);   
    / c9 K! t# U3 w) y6 M2 Q+ Y
  45.     }
    - \- B3 k5 p5 _  {, M
  46.     if(huart->Instance==USART3)//Èç¹ûÊÇ´®¿Ú3, O0 D  l$ p: K3 s/ q. h
  47.     {
    & m0 m" c: W$ @4 f  x% y3 s* Q
  48.         HAL_UART_Transmit_DMA(&huart3,(uint8_t*)aRx3Buffer,USART_RX3_LEN);% F( X2 i# _+ J# \" g; h% j
  49.         while(1)8 X1 d0 ?, c- U+ i+ B6 X& A
  50.             {- x; ~- Y/ `- X, i, D' I: _5 S( v) T
  51.                 if(__HAL_DMA_GET_FLAG(&hdma_usart3_tx,DMA_FLAG_TCIF3_7))//µÈ´ýDMA2_Steam7´«ÊäÍê³É0 z2 D/ F$ J3 H5 r! K
  52.                 {
      h5 E0 v% r( d" p/ V( A/ \( ~
  53.                     __HAL_DMA_CLEAR_FLAG(&hdma_usart3_tx,DMA_FLAG_TCIF3_7);//Çå³ýDMA2_Steam7´«ÊäÍê³É±êÖ¾! G0 s+ Q4 j6 Q. c
  54.                     HAL_UART_DMAStop(&huart3);      //´«ÊäÍê³ÉÒÔºó¹Ø±Õ´®¿ÚDMA
    & K7 f: K; _% j/ {
  55.                     break;   s8 \, s  b7 L( F) A& e; |
  56.                 }: A6 s5 s' k$ G3 g9 @8 d! I
  57.                             //    __HAL_DMA_GET_COUNTER(&hdma_usart1_tx);
    9 u% x" T' y1 w" {
  58.                             }    //·¢ËͽÓÊÕµ½µÄÊý¾Ý
    5 R/ _; X1 ^) x: ]' l/ p
  59.         while(__HAL_UART_GET_FLAG(&huart3,UART_FLAG_TC)!=SET);        //µÈ´ý·¢ËͽáÊø* X5 M6 ~( x4 Q6 H$ j# r- C
  60.         HAL_UART_Receive_IT(&huart3, (uint8_t *)aRx3Buffer, RX3BUFFERSIZE);   7 U5 o9 q5 N' [, u$ u' Z* X# G
  61.     }
    1 L! x- T' Z8 G+ M8 T& |" c' t
  62.     if(huart->Instance==UART4)//Èç¹ûÊÇ´®¿Ú47 g/ B) A6 \3 `3 a3 k5 e  w
  63.     {1 n9 V/ C' F. e
  64.         HAL_UART_Transmit_DMA(&huart4,(uint8_t*)aRx4Buffer,USART_RX4_LEN);: F# i: g. X# B, j8 I3 @0 p
  65.         while(1)
    9 ]/ p) h, n1 W# a  a
  66.             {
    1 z3 t, u, w* _4 _8 ^
  67.                 if(__HAL_DMA_GET_FLAG(&hdma_uart4_tx,DMA_FLAG_TCIF0_4))//µÈ´ýDMA2_Steam7´«ÊäÍê³É
    - [0 D2 u! P+ ~
  68.                 {
    0 Q, N* N( G" O3 E
  69.                     __HAL_DMA_CLEAR_FLAG(&hdma_uart4_tx,DMA_FLAG_TCIF0_4);//Çå³ýDMA2_Steam7´«ÊäÍê³É±êÖ¾2 J" n6 B2 q+ C8 i8 @
  70.                     HAL_UART_DMAStop(&huart4);      //´«ÊäÍê³ÉÒÔºó¹Ø±Õ´®¿ÚDMA
    1 ^' [. |* [& {9 y  F2 G$ l: O
  71.                     break; ( J; t7 r+ p. l2 p0 J, ?+ k
  72.                 }8 _- _' _- Z# I9 v
  73.                             //    __HAL_DMA_GET_COUNTER(&hdma_uart4_tx);
    ( b/ n9 E# B0 R( w, x
  74.                             }    //·¢ËͽÓÊÕµ½µÄÊý¾Ý5 j8 q3 [  n) `7 O3 v7 N
  75.         while(__HAL_UART_GET_FLAG(&huart4,UART_FLAG_TC)!=SET);        //µÈ´ý·¢ËͽáÊø* e5 F# a* r: c# R
  76.         HAL_UART_Receive_IT(&huart4, (uint8_t *)aRx4Buffer, RX4BUFFERSIZE);   $ U: `- c, O6 i5 S$ k
  77.     }( T: X, j0 \0 f) ?  v
  78. }# q: \0 _! t0 q0 ^5 ^4 D
复制代码
这个我是放在中断里实现串口自收自发的。
  1. void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
    2 F  U4 J* d0 |; \+ x
  2. 2 {
    * O. }  ~( c3 p$ |6 X2 C# m
  3. 3         uint32_t isrflags   = READ_REG(huart->Instance->ISR);//?????,???????SR# p3 z1 O' h- L: J
  4. 4         if((__HAL_UART_GET_FLAG(huart, UART_FLAG_PE))!=RESET)
    5 ?% D% v1 z( r  m/ n3 ~, y
  5. 5         {
    . h8 A' {7 B1 i6 W
  6. 6                         READ_REG(huart->Instance->RDR);//PE???,????DR0 s/ E: z' x' h) p4 V+ ^# E
  7. 7                         __HAL_UART_CLEAR_IT(huart, UART_CLEAR_PEF);//???
    6 o, r/ q' y: d5 E& ?6 Q( H
  8. 8         }
    % O' V3 u, r; L+ g( R9 k
  9. 9         if((__HAL_UART_GET_FLAG(huart, UART_FLAG_FE))!=RESET)1 m/ ]6 \' S  V% N
  10. 10         {
    3 ]. T! R# m" @2 S- F3 _2 x* o" ~
  11. 11                         READ_REG(huart->Instance->RDR);//FE???,????DR9 B: L- A) ?  r: s- A5 C1 X7 f. W
  12. 12                         __HAL_UART_CLEAR_IT(huart, UART_CLEAR_FEF);
    . Q0 h/ p9 f9 Q' g% @) k( X
  13. 13         }6 L4 q5 }- E3 k% I- H  Y# V
  14. 14         
    + E1 p: }: p& B% ]# g7 L% _
  15. 15         if((__HAL_UART_GET_FLAG(huart, UART_FLAG_NE))!=RESET)
    6 I7 a8 N: u: G5 q" X& |
  16. 16         {
    4 z; a. i9 G: W& \
  17. 17                         READ_REG(huart->Instance->RDR);//NE???,????DR
    * T/ D" P$ F( Z+ k6 a5 {
  18. 18                         __HAL_UART_CLEAR_IT(huart, UART_CLEAR_NEF);1 P$ h4 f+ [9 ?- a0 b8 f3 Y3 \
  19. 19         }        % w* Y) u  _& Z4 [$ {
  20. 20         
    ; l! g3 Q; j+ ~+ w" |- P& b5 H
  21. 21         if((__HAL_UART_GET_FLAG(huart, UART_FLAG_ORE))!=RESET)9 T2 q* B4 _( x
  22. 22         {
      w: {% L0 m* d+ |+ s( ]* T2 F
  23. 23                         READ_REG(huart->Instance->RDR);//ORE???,????CR/ s' N6 _% E. d! o( ^1 X( F
  24. 24                         __HAL_UART_CLEAR_IT(huart, UART_CLEAR_OREF);
    ) f! u6 S1 a) D
  25. 25         }        * u7 \) y/ H2 ]" t5 f# d. j, S# Q
  26. 26 }
复制代码

9 a( ^6 `* f4 R" ^! f
9 j  k  p  S% g

3 T5 Z: ?1 b# U9 k5 w) k
, O6 z5 R& F) M% ^* G" f
收藏 评论0 发布时间:2021-12-12 21:44

举报

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