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

【经验分享】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)
    ( z+ ~* x& o9 x* f$ u
  2. {
    * p0 w* V( q( a: q0 w
  3.     static uint8_t sta = 0;* d1 E7 _# ]" t- v5 B
  4.     if(huart->Instance==USART1)//Èç¹ûÊÇ´®¿Ú1! ?' f+ Q5 C$ ~
  5.     {. D; D/ a5 ^' @9 U1 N- w
  6. //        USART_RX1_BUF[Usart1_len]=aRx1Buffer[0];
    # T# r) z5 q; r  H: A- A
  7. //        Usart1_len++;" f/ u) W( _; M7 c
  8. //        if(Usart1_len == 0x04)                             9 z! J9 A) H! t% _) D4 ?  f6 Z
  9. //    {+ C0 F% S& R& C) X4 p) h2 N1 f
  10.         HAL_UART_Transmit_DMA(&huart1,(uint8_t*)aRx1Buffer,USART_RX1_LEN);
    8 n0 w( P4 R& [& b; r" Q) `
  11.         while(1)
    2 g" p* P0 q, h6 m: j. t
  12.             {( ]/ p2 q7 S9 ]; ]& s( c' M* ]2 \
  13.                 if(__HAL_DMA_GET_FLAG(&hdma_usart1_tx,DMA_FLAG_TCIF3_7))//µÈ´ýDMA2_Steam7´«ÊäÍê³É, P5 O4 J" @" b
  14.                 {( O9 C/ R* \7 s/ G
  15.                     __HAL_DMA_CLEAR_FLAG(&hdma_usart1_tx,DMA_FLAG_TCIF3_7);//Çå³ýDMA2_Steam7´«ÊäÍê³É±êÖ¾
    9 o) ]$ H1 V1 @5 e
  16.                     HAL_UART_DMAStop(&huart1);      //´«ÊäÍê³ÉÒÔºó¹Ø±Õ´®¿ÚDMA
    / C6 _- W+ p* l' h+ D5 n# o
  17.                     break;
    6 u, @/ J- a: r: ?. p3 y* K
  18.                 }
    . K' I# C: H# h
  19.                             //    __HAL_DMA_GET_COUNTER(&hdma_usart1_tx);' K6 W. Q% q$ p8 Y/ v1 s0 k
  20.                             }
    4 h! q9 |" ~5 o
  21.         switch(sta)8 g0 u6 ]# J0 Z* \
  22.         {7 o( v; X0 ^2 p+ ~' r5 w7 t
  23.             case 0:if(aRx1Buffer[0] == 0x55) sta = 1;break;
    3 w& M$ ^9 U3 I8 P8 u
  24.             case 1:if(aRx1Buffer[0] == 0xaa) mode = 1,sta = 2;else sta = 0;break;
    % {7 E2 {, X3 y* \7 [4 M
  25.             case 2:mode = 0;sta = 0;break;+ X* \1 K! S/ s' c* e
  26.         }        ) a5 R  s. y1 E0 m7 d  F+ c" D$ q
  27.         HAL_UART_Receive_IT(&huart1, (uint8_t *)aRx1Buffer, RX1BUFFERSIZE);   ! \" u) [8 q  ~8 S6 R1 }
  28. //        }            ( \, L- k9 I6 `7 l( J/ @4 ]
  29.     }
    9 X: J# ^5 a3 [
  30.     if(huart->Instance==USART2)//Èç¹ûÊÇ´®¿Ú2
    5 m, f# N( \4 d
  31.     {0 _* E# d/ B; K8 f
  32.         HAL_UART_Transmit_DMA(&huart2,(uint8_t*)aRx2Buffer,USART_RX2_LEN);. k. h. o  q- @8 Z* ~% s# w/ R
  33.         while(1)
    & V8 p2 Y8 S$ n$ N
  34.             {6 Q5 i2 J4 s5 a
  35.                 if(__HAL_DMA_GET_FLAG(&hdma_usart2_tx,DMA_FLAG_TCIF2_6))//µÈ´ýDMA2_Steam7´«ÊäÍê³É
    9 N9 t6 |# @" x$ a% M' F
  36.                 {0 Q6 {' c' z. \, I( g
  37.                     __HAL_DMA_CLEAR_FLAG(&hdma_usart2_tx,DMA_FLAG_TCIF2_6);//Çå³ýDMA2_Steam7´«ÊäÍê³É±êÖ¾
    4 U' l1 J4 s1 w. x* E8 g
  38.                     HAL_UART_DMAStop(&huart2);      //´«ÊäÍê³ÉÒÔºó¹Ø±Õ´®¿ÚDMA
    : k8 _  p( d. |6 ?2 P# E2 [
  39.                     break;
    ; h' m; J# J/ d8 {/ R
  40.                 }' R" o2 y! e! ~7 ]
  41.                             //    __HAL_DMA_GET_COUNTER(&hdma_usart2_tx);; k$ n& L  V" h4 Y; `
  42.                             }    //·¢ËͽÓÊÕµ½µÄÊý¾Ý- |( N0 o! g" w4 C# Z# w* K
  43.         while(__HAL_UART_GET_FLAG(&huart2,UART_FLAG_TC)!=SET);        //µÈ´ý·¢ËͽáÊø( ]# d6 i4 \: d) l+ q0 o: V
  44.         HAL_UART_Receive_IT(&huart2, (uint8_t *)aRx2Buffer, RX2BUFFERSIZE);   + E* K3 m+ t/ _3 F
  45.     }
    $ z' K7 N2 W5 W* x; ?' ~
  46.     if(huart->Instance==USART3)//Èç¹ûÊÇ´®¿Ú3
    ( Z$ P9 {8 A  a. n
  47.     {
    5 D4 F( N8 Q* `( ^5 f) n6 c
  48.         HAL_UART_Transmit_DMA(&huart3,(uint8_t*)aRx3Buffer,USART_RX3_LEN);# c, C# Q& U6 U
  49.         while(1)! f! Y- `. Z$ @  ?
  50.             {4 {  J. o7 w% b
  51.                 if(__HAL_DMA_GET_FLAG(&hdma_usart3_tx,DMA_FLAG_TCIF3_7))//µÈ´ýDMA2_Steam7´«ÊäÍê³É
    2 e& Z% ?- v. O
  52.                 {
    ( R, C5 S' e/ h3 V1 I7 j* k- n2 x
  53.                     __HAL_DMA_CLEAR_FLAG(&hdma_usart3_tx,DMA_FLAG_TCIF3_7);//Çå³ýDMA2_Steam7´«ÊäÍê³É±êÖ¾
    ( Q2 Y# ~. k5 l# i' Q8 Q) }
  54.                     HAL_UART_DMAStop(&huart3);      //´«ÊäÍê³ÉÒÔºó¹Ø±Õ´®¿ÚDMA7 {3 N0 \! q6 z5 O! z6 D
  55.                     break; . m, a+ }. X9 l* r5 _' t
  56.                 }
    3 d7 U9 s5 b- V" u8 ~/ T
  57.                             //    __HAL_DMA_GET_COUNTER(&hdma_usart1_tx);* P1 K3 I0 P/ T$ x3 `
  58.                             }    //·¢ËͽÓÊÕµ½µÄÊý¾Ý4 C* {) e- e3 C$ O
  59.         while(__HAL_UART_GET_FLAG(&huart3,UART_FLAG_TC)!=SET);        //µÈ´ý·¢ËͽáÊø0 c$ g! |$ i1 S6 R9 n. P1 z1 T  z
  60.         HAL_UART_Receive_IT(&huart3, (uint8_t *)aRx3Buffer, RX3BUFFERSIZE);   7 h+ S$ l4 K8 ?0 C5 ~. l3 ?; x9 J
  61.     }3 c& k) ~3 R8 H- i( a+ p
  62.     if(huart->Instance==UART4)//Èç¹ûÊÇ´®¿Ú4
    6 t$ H" d8 `4 X! W. G8 k
  63.     {8 t; d/ e8 L9 d  K0 H
  64.         HAL_UART_Transmit_DMA(&huart4,(uint8_t*)aRx4Buffer,USART_RX4_LEN);
    7 b4 j3 D8 o4 s) M3 d9 ^7 w8 ~
  65.         while(1)
    2 F. K& z1 O1 X$ R
  66.             {/ y: I* X* F) O1 i( _% Z9 K
  67.                 if(__HAL_DMA_GET_FLAG(&hdma_uart4_tx,DMA_FLAG_TCIF0_4))//µÈ´ýDMA2_Steam7´«ÊäÍê³É
    ; ^3 u$ p, _( _
  68.                 {0 X+ y6 T* K# w& H. Y  z
  69.                     __HAL_DMA_CLEAR_FLAG(&hdma_uart4_tx,DMA_FLAG_TCIF0_4);//Çå³ýDMA2_Steam7´«ÊäÍê³É±êÖ¾
    ! U+ T4 X5 r2 s8 I, f. _' I& q
  70.                     HAL_UART_DMAStop(&huart4);      //´«ÊäÍê³ÉÒÔºó¹Ø±Õ´®¿ÚDMA
    / o3 H! r3 l( e4 K) W/ y
  71.                     break;
    , F4 ~, k$ Q1 `! e- v
  72.                 }
    / ^+ l  z/ Y! K- f
  73.                             //    __HAL_DMA_GET_COUNTER(&hdma_uart4_tx);
    1 p6 `6 u/ o4 f3 R/ e% w/ F
  74.                             }    //·¢ËͽÓÊÕµ½µÄÊý¾Ý! |/ y/ Y3 v+ `/ R
  75.         while(__HAL_UART_GET_FLAG(&huart4,UART_FLAG_TC)!=SET);        //µÈ´ý·¢ËͽáÊø
    % D; U; J3 o9 b1 {
  76.         HAL_UART_Receive_IT(&huart4, (uint8_t *)aRx4Buffer, RX4BUFFERSIZE);   
    ) o- K5 k5 _' d/ A8 p4 l
  77.     }5 u0 ~& V0 z. D) z# A& `
  78. }
    ( L/ F% h, B$ W% F
复制代码
这个我是放在中断里实现串口自收自发的。
  1. void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)- x: A6 Z  [" Y" I- ]5 X- s
  2. 2 {* S; z# F) ~1 a  U) j
  3. 3         uint32_t isrflags   = READ_REG(huart->Instance->ISR);//?????,???????SR
    % ]+ R6 R- e, F( P6 m
  4. 4         if((__HAL_UART_GET_FLAG(huart, UART_FLAG_PE))!=RESET)' J$ q7 Q$ q5 v5 o$ L/ W# `8 d
  5. 5         {: k$ S) m0 G& {# p* @; F6 P/ K
  6. 6                         READ_REG(huart->Instance->RDR);//PE???,????DR( n6 V2 ~9 Q2 a6 ^
  7. 7                         __HAL_UART_CLEAR_IT(huart, UART_CLEAR_PEF);//???
    2 X7 ^5 `/ u) t0 ]5 J; w3 }7 J
  8. 8         }
    # x- d/ \4 ^' O/ j
  9. 9         if((__HAL_UART_GET_FLAG(huart, UART_FLAG_FE))!=RESET). Y' K, J* M/ h( K3 d. s
  10. 10         {
    ! u( }# }# _5 K0 \# W
  11. 11                         READ_REG(huart->Instance->RDR);//FE???,????DR
    4 G* K+ R1 X9 G5 x5 V. \
  12. 12                         __HAL_UART_CLEAR_IT(huart, UART_CLEAR_FEF);
    % Y$ G9 W+ T' k: f* J
  13. 13         }
    - u6 k- ]- f) c2 d
  14. 14         ) W1 Y4 H5 g' {( d' S
  15. 15         if((__HAL_UART_GET_FLAG(huart, UART_FLAG_NE))!=RESET)
    3 d. o! e/ g4 B
  16. 16         {6 ~1 o: p* u) @5 K' `: }' R# V+ N0 w
  17. 17                         READ_REG(huart->Instance->RDR);//NE???,????DR
    : Z* V' C, L5 t
  18. 18                         __HAL_UART_CLEAR_IT(huart, UART_CLEAR_NEF);
    * b( s7 b  e; `$ ?
  19. 19         }        6 @2 S* J: A0 ]1 O( N
  20. 20         0 S$ k0 |/ A6 i' h& `: [% x
  21. 21         if((__HAL_UART_GET_FLAG(huart, UART_FLAG_ORE))!=RESET)& h* O  o* v( l2 }- ?: V
  22. 22         {  ]6 S2 l. n9 E$ u7 Z" g. C& F
  23. 23                         READ_REG(huart->Instance->RDR);//ORE???,????CR
    ; P9 U0 R! ]! ?% ^5 I. n# J0 l
  24. 24                         __HAL_UART_CLEAR_IT(huart, UART_CLEAR_OREF);
    % N- |, q" e4 z' {9 w
  25. 25         }        6 _' e" W7 T1 A/ {
  26. 26 }
复制代码
' h/ h! k* D5 G. D' g
+ G! O' `0 \6 \/ w
# V: T  G# g" N6 {1 E! j) h; Q0 S
% S; b5 B% ?, |6 y! q2 M6 a  z
收藏 评论0 发布时间:2021-12-12 21:44

举报

0个回答

所属标签

相似技术帖

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