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

【经验分享】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)7 ^+ K5 I# B0 J! I' F
  2. {
    : Z3 ?0 Q! ?4 N. }1 y! `0 ^/ C
  3.     static uint8_t sta = 0;6 v0 V- t) f- y2 G) I  @
  4.     if(huart->Instance==USART1)//Èç¹ûÊÇ´®¿Ú1
    + X5 z# v+ g( U9 U8 k0 H
  5.     {
    0 d6 s( w% B" M: C% ^3 t; M
  6. //        USART_RX1_BUF[Usart1_len]=aRx1Buffer[0];* J  V1 w! g- |. f1 I$ b7 s
  7. //        Usart1_len++;5 A% c  E( u- S! n; k
  8. //        if(Usart1_len == 0x04)                             
    . ^6 n. O$ `7 D/ b
  9. //    {; B4 F% i! U: {6 h7 M- {9 v
  10.         HAL_UART_Transmit_DMA(&huart1,(uint8_t*)aRx1Buffer,USART_RX1_LEN);
    , J5 K7 Z  G1 r! ^0 t6 s2 P6 r
  11.         while(1), Z2 ^! D4 L2 u! {8 i
  12.             {3 _# ^3 w7 S% J) d2 P* Z6 a& x
  13.                 if(__HAL_DMA_GET_FLAG(&hdma_usart1_tx,DMA_FLAG_TCIF3_7))//µÈ´ýDMA2_Steam7´«ÊäÍê³É9 T6 P6 D& L+ w; I* X% ~7 l& y
  14.                 {8 X5 \- m7 W2 l! f- A7 K
  15.                     __HAL_DMA_CLEAR_FLAG(&hdma_usart1_tx,DMA_FLAG_TCIF3_7);//Çå³ýDMA2_Steam7´«ÊäÍê³É±êÖ¾
    0 {1 O& N$ {# R" B2 y9 K. e# }
  16.                     HAL_UART_DMAStop(&huart1);      //´«ÊäÍê³ÉÒÔºó¹Ø±Õ´®¿ÚDMA/ C- h0 Y5 i4 r' [3 g
  17.                     break; 1 d, V" N! L5 R1 X/ C
  18.                 }& L8 }4 t, M4 F* }3 G; I
  19.                             //    __HAL_DMA_GET_COUNTER(&hdma_usart1_tx);. Z  j& s7 o+ h1 w$ Z" P
  20.                             }
    3 K, f/ }6 Y2 a9 m5 ?) L
  21.         switch(sta)$ j+ j8 l6 }1 H
  22.         {
    2 F7 }2 C. B/ }+ F% T) o/ F
  23.             case 0:if(aRx1Buffer[0] == 0x55) sta = 1;break;3 G* Z8 L% H" M3 ?1 N
  24.             case 1:if(aRx1Buffer[0] == 0xaa) mode = 1,sta = 2;else sta = 0;break;
    ( P4 Z& F8 t- _% A
  25.             case 2:mode = 0;sta = 0;break;5 J6 r# a% [+ E3 h' c0 y) ~
  26.         }        3 E6 ~. c& W7 X  H
  27.         HAL_UART_Receive_IT(&huart1, (uint8_t *)aRx1Buffer, RX1BUFFERSIZE);   
    * H+ I- a3 ~( v* J& z9 j) u: `1 Y
  28. //        }            4 Z) L: R/ b/ m$ Y
  29.     }
    ( D/ g" y2 s7 _: y6 j5 W
  30.     if(huart->Instance==USART2)//Èç¹ûÊÇ´®¿Ú21 T: ^7 k& u# n2 J9 k
  31.     {
    8 x# G; N4 q3 a6 B0 @3 p
  32.         HAL_UART_Transmit_DMA(&huart2,(uint8_t*)aRx2Buffer,USART_RX2_LEN);1 I( d$ E; G2 c) q
  33.         while(1)
    6 |2 M8 g, t( D$ Z' ^. B
  34.             {
    % d# b3 o; Q! V' `
  35.                 if(__HAL_DMA_GET_FLAG(&hdma_usart2_tx,DMA_FLAG_TCIF2_6))//µÈ´ýDMA2_Steam7´«ÊäÍê³É1 l- W* O/ H  S
  36.                 {7 ^# j7 ^8 s6 Y' Z* W3 I
  37.                     __HAL_DMA_CLEAR_FLAG(&hdma_usart2_tx,DMA_FLAG_TCIF2_6);//Çå³ýDMA2_Steam7´«ÊäÍê³É±êÖ¾8 k8 l, d! Q# L+ F' I  I/ `5 |
  38.                     HAL_UART_DMAStop(&huart2);      //´«ÊäÍê³ÉÒÔºó¹Ø±Õ´®¿ÚDMA
    8 G: u- i$ l$ y$ i9 ]2 H
  39.                     break;
    ( C8 C# {+ `  F: J' J' A
  40.                 }
    ) C, R: ?, U0 _6 P: z
  41.                             //    __HAL_DMA_GET_COUNTER(&hdma_usart2_tx);
      P. r$ l6 k, @& k
  42.                             }    //·¢ËͽÓÊÕµ½µÄÊý¾Ý! @+ r  E$ L2 ~2 R8 v% l
  43.         while(__HAL_UART_GET_FLAG(&huart2,UART_FLAG_TC)!=SET);        //µÈ´ý·¢ËͽáÊø
    5 K* \  @& g) j+ E
  44.         HAL_UART_Receive_IT(&huart2, (uint8_t *)aRx2Buffer, RX2BUFFERSIZE);   3 M5 k$ _  a+ F- h0 n
  45.     }
    . }" W  J& p: E% G# z; B
  46.     if(huart->Instance==USART3)//Èç¹ûÊÇ´®¿Ú3
    ' F% n9 ]7 ?2 H* @
  47.     {
    6 S# _$ f4 Y" n3 t! _
  48.         HAL_UART_Transmit_DMA(&huart3,(uint8_t*)aRx3Buffer,USART_RX3_LEN);5 c3 R! c, s2 D' L, E( N: ~" j0 Y/ ?
  49.         while(1)
    ( ?6 I6 V: h0 }) n2 w
  50.             {
    + S: a1 R2 ]+ W0 b; Z
  51.                 if(__HAL_DMA_GET_FLAG(&hdma_usart3_tx,DMA_FLAG_TCIF3_7))//µÈ´ýDMA2_Steam7´«ÊäÍê³É8 X* h. A" Z2 p6 M$ k
  52.                 {- k7 _7 F. j+ d  X; J1 Z' l
  53.                     __HAL_DMA_CLEAR_FLAG(&hdma_usart3_tx,DMA_FLAG_TCIF3_7);//Çå³ýDMA2_Steam7´«ÊäÍê³É±êÖ¾
    9 d& N3 Z9 [# [7 Z
  54.                     HAL_UART_DMAStop(&huart3);      //´«ÊäÍê³ÉÒÔºó¹Ø±Õ´®¿ÚDMA" s# U4 z6 m3 p& E  s
  55.                     break; ; x  ~* G; F* y8 y: ]% `4 b) ^
  56.                 }
    ( d  P+ L0 S7 W5 Q3 \
  57.                             //    __HAL_DMA_GET_COUNTER(&hdma_usart1_tx);5 t: D/ L9 V' M! u4 H+ j
  58.                             }    //·¢ËͽÓÊÕµ½µÄÊý¾Ý
    6 H; }4 w* \( T: ^! H9 r) W% W! c
  59.         while(__HAL_UART_GET_FLAG(&huart3,UART_FLAG_TC)!=SET);        //µÈ´ý·¢ËͽáÊø
    % N4 ]% t; C0 w, s. Q
  60.         HAL_UART_Receive_IT(&huart3, (uint8_t *)aRx3Buffer, RX3BUFFERSIZE);   , n7 }* N* f) f) g
  61.     }
      j9 o9 E3 Q. [# r  R
  62.     if(huart->Instance==UART4)//Èç¹ûÊÇ´®¿Ú4
    $ K( l% j5 o  e7 d
  63.     {
    8 {- z* g8 J( J! r9 X
  64.         HAL_UART_Transmit_DMA(&huart4,(uint8_t*)aRx4Buffer,USART_RX4_LEN);
    # x6 v! r3 \% v5 f' u' J
  65.         while(1)3 U6 r; u5 r( \2 P" X
  66.             {
    - Y; ], g# _* X* E
  67.                 if(__HAL_DMA_GET_FLAG(&hdma_uart4_tx,DMA_FLAG_TCIF0_4))//µÈ´ýDMA2_Steam7´«ÊäÍê³É
    , u8 P  E6 v, j' e8 ]2 a
  68.                 {9 r7 @( W! u/ K8 F
  69.                     __HAL_DMA_CLEAR_FLAG(&hdma_uart4_tx,DMA_FLAG_TCIF0_4);//Çå³ýDMA2_Steam7´«ÊäÍê³É±êÖ¾8 e2 A$ o7 L; i: `4 A4 h; f7 ?
  70.                     HAL_UART_DMAStop(&huart4);      //´«ÊäÍê³ÉÒÔºó¹Ø±Õ´®¿ÚDMA
    / j( x6 b$ r' y6 [% K' z
  71.                     break; 1 L/ \4 Z# f+ e0 Q; d& z; ^& n# d. b
  72.                 }
    ( L& h7 R0 G1 A, k$ J: z0 u
  73.                             //    __HAL_DMA_GET_COUNTER(&hdma_uart4_tx);/ j2 i3 l3 S# @1 \+ |- Q( \- H- p( ^9 _
  74.                             }    //·¢ËͽÓÊÕµ½µÄÊý¾Ý& P$ [# I  s( r" D  c: u
  75.         while(__HAL_UART_GET_FLAG(&huart4,UART_FLAG_TC)!=SET);        //µÈ´ý·¢ËͽáÊø
    $ |0 r& u( a! O' Q2 `% o& D  L
  76.         HAL_UART_Receive_IT(&huart4, (uint8_t *)aRx4Buffer, RX4BUFFERSIZE);   7 M! I1 ?* e& ~' e( v; {5 s
  77.     }. k, Y, F% }5 x4 v; h
  78. }
    4 u2 x8 w( R# \+ i
复制代码
这个我是放在中断里实现串口自收自发的。
  1. void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)% B% s5 }2 b+ n2 Z( C
  2. 2 {& i1 u& {$ h% Z  L  ~& q2 A
  3. 3         uint32_t isrflags   = READ_REG(huart->Instance->ISR);//?????,???????SR# P. k, t, M) Q* {4 G7 H
  4. 4         if((__HAL_UART_GET_FLAG(huart, UART_FLAG_PE))!=RESET)
    4 D$ M4 A4 \! G" I- d
  5. 5         {9 ^' s2 n$ Z- s! s2 i
  6. 6                         READ_REG(huart->Instance->RDR);//PE???,????DR9 I* j( `( u, d% c! b* B
  7. 7                         __HAL_UART_CLEAR_IT(huart, UART_CLEAR_PEF);//???- R; p( C7 }$ f6 p
  8. 8         }
    $ B1 g; p& w1 x5 |: ?4 ]
  9. 9         if((__HAL_UART_GET_FLAG(huart, UART_FLAG_FE))!=RESET)
    & s. x( r: R3 h. Y; ?) q& H$ v
  10. 10         {
    7 m+ h# H2 d( C2 j4 I2 b
  11. 11                         READ_REG(huart->Instance->RDR);//FE???,????DR
    7 \6 n4 P# h% J. ~8 Z' |
  12. 12                         __HAL_UART_CLEAR_IT(huart, UART_CLEAR_FEF);
      c7 x3 C5 q( P* `
  13. 13         }
      I  C5 I4 I; j1 [$ {9 F
  14. 14         
    * w7 q8 h' T8 A( c. T
  15. 15         if((__HAL_UART_GET_FLAG(huart, UART_FLAG_NE))!=RESET)
    ; t$ w1 X4 i7 {1 J& l( O' k9 U0 G
  16. 16         {6 p' r0 A& S7 I
  17. 17                         READ_REG(huart->Instance->RDR);//NE???,????DR
    5 k1 t. b- c3 n- ?
  18. 18                         __HAL_UART_CLEAR_IT(huart, UART_CLEAR_NEF);! @- z% G$ U" h) d; Q/ I' @
  19. 19         }        0 }& W7 `1 C: ^8 ]7 B& s% Z5 x/ [+ D
  20. 20         , A( S4 j$ |) I! Z4 p
  21. 21         if((__HAL_UART_GET_FLAG(huart, UART_FLAG_ORE))!=RESET)  O) j# O+ d$ I" z
  22. 22         {0 w/ @" N, {% E* ^/ Z
  23. 23                         READ_REG(huart->Instance->RDR);//ORE???,????CR
    # S0 Z1 h( A- K( C$ P0 e1 P! V
  24. 24                         __HAL_UART_CLEAR_IT(huart, UART_CLEAR_OREF);
    5 D# c. x: r; G! m8 [: ~
  25. 25         }        9 ^8 W2 r6 ~4 N+ Y+ H* ^- t& U
  26. 26 }
复制代码

3 L( \' P8 ?3 D# Y
8 s/ _# [: p3 g

! H6 g, }3 A8 Y+ H$ Z; Z" ^! m' U; G2 x! c- q3 U% g
赞 收藏 评论0 发布时间:2021-12-12 21:44

举报

0个回答

所属标签

相似技术帖

官网相关资源

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