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

【经验分享】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)
    ) O" J* `: }& k3 Z% R7 G7 h) }. A; O
  2. {! J5 d, x* f* ?: k5 j7 G3 V
  3.     static uint8_t sta = 0;
    ! _. m8 k# J+ C0 {
  4.     if(huart->Instance==USART1)//Èç¹ûÊÇ´®¿Ú1/ o3 e2 ^2 N' Y; ~7 r
  5.     {
    4 Q( }9 Z) w& M$ h" o. o
  6. //        USART_RX1_BUF[Usart1_len]=aRx1Buffer[0];
      J$ j" N7 ~) c8 O
  7. //        Usart1_len++;- l# C" A, H: c1 e9 Z  R0 J
  8. //        if(Usart1_len == 0x04)                             
    5 k: I; K) a" L: ?. P8 Z" I
  9. //    {9 h* t! |; {8 o/ t4 _
  10.         HAL_UART_Transmit_DMA(&huart1,(uint8_t*)aRx1Buffer,USART_RX1_LEN);8 d+ Q* m0 O; z: X6 U; i: b
  11.         while(1)* W( E. Z( c4 x9 y; _
  12.             {
    % M) u, r6 C, A, e! \% S. x
  13.                 if(__HAL_DMA_GET_FLAG(&hdma_usart1_tx,DMA_FLAG_TCIF3_7))//µÈ´ýDMA2_Steam7´«ÊäÍê³É6 B! ~# B  S$ p- B+ @3 T
  14.                 {1 k. [1 r. ]) p7 Z0 ^
  15.                     __HAL_DMA_CLEAR_FLAG(&hdma_usart1_tx,DMA_FLAG_TCIF3_7);//Çå³ýDMA2_Steam7´«ÊäÍê³É±êÖ¾
    ! x1 @  y2 t0 n2 c$ R; d
  16.                     HAL_UART_DMAStop(&huart1);      //´«ÊäÍê³ÉÒÔºó¹Ø±Õ´®¿ÚDMA3 X* x  U; b" p/ `" _
  17.                     break; , R' b& D& \, S7 |" J
  18.                 }3 A7 A6 y& x' g9 X5 U1 X
  19.                             //    __HAL_DMA_GET_COUNTER(&hdma_usart1_tx);
    2 u  Z4 J, x/ J& k! ~9 _) C
  20.                             }0 M- c# u! a6 p
  21.         switch(sta)
    ! J' B+ ^4 f+ Y' z* i
  22.         {( m: [, l% b* ]2 [: s
  23.             case 0:if(aRx1Buffer[0] == 0x55) sta = 1;break;
    % s9 d' R* F* k
  24.             case 1:if(aRx1Buffer[0] == 0xaa) mode = 1,sta = 2;else sta = 0;break;, {+ L; w7 R5 G8 V$ W
  25.             case 2:mode = 0;sta = 0;break;
    6 p6 V$ A8 }2 ^/ q4 r2 T: d. L  a  |
  26.         }        
    ) L3 ]2 T( p" d! _$ V; h+ y! h
  27.         HAL_UART_Receive_IT(&huart1, (uint8_t *)aRx1Buffer, RX1BUFFERSIZE);   
    , p" t9 _- p( r; F, i$ Z8 s, d3 c4 r
  28. //        }            , f" L* O6 ~1 _8 K
  29.     }0 R1 L1 h& m* g% b" E4 M
  30.     if(huart->Instance==USART2)//Èç¹ûÊÇ´®¿Ú2
    3 {* c9 |2 l" \# B( v
  31.     {9 t  ]* P; f, F& v4 k6 S7 E
  32.         HAL_UART_Transmit_DMA(&huart2,(uint8_t*)aRx2Buffer,USART_RX2_LEN);
    % `- X6 J/ o) ?2 _% K
  33.         while(1)
    ) k9 K0 b# q! W9 n. O2 h
  34.             {
    & H! K5 _; c3 Z$ O: A9 }& V7 d
  35.                 if(__HAL_DMA_GET_FLAG(&hdma_usart2_tx,DMA_FLAG_TCIF2_6))//µÈ´ýDMA2_Steam7´«ÊäÍê³É7 [+ q: z; T( h- O
  36.                 {
    4 c8 E/ ^  J: A+ r/ q; J* M% u: B
  37.                     __HAL_DMA_CLEAR_FLAG(&hdma_usart2_tx,DMA_FLAG_TCIF2_6);//Çå³ýDMA2_Steam7´«ÊäÍê³É±êÖ¾! P2 H2 W5 [; C, m' T
  38.                     HAL_UART_DMAStop(&huart2);      //´«ÊäÍê³ÉÒÔºó¹Ø±Õ´®¿ÚDMA
    : b+ h% \( A# Y# q9 l
  39.                     break;
    # r0 ]% s8 p2 j: X  [7 |/ Y1 L; Q
  40.                 }
    9 i# ?3 C) R# d$ y' B
  41.                             //    __HAL_DMA_GET_COUNTER(&hdma_usart2_tx);
    + j. u( ~/ p4 T) [" [% d
  42.                             }    //·¢ËͽÓÊÕµ½µÄÊý¾Ý
    ( n$ e, j+ a# w" Z/ y+ S
  43.         while(__HAL_UART_GET_FLAG(&huart2,UART_FLAG_TC)!=SET);        //µÈ´ý·¢ËͽáÊø
      \" o& {+ ]# O# k/ C
  44.         HAL_UART_Receive_IT(&huart2, (uint8_t *)aRx2Buffer, RX2BUFFERSIZE);   ) k; M+ I. H, ^
  45.     }
    ' j: j# p0 z- m6 |% Q
  46.     if(huart->Instance==USART3)//Èç¹ûÊÇ´®¿Ú3& u2 g! R6 V+ I, n
  47.     {2 f# m2 ]% D* i* @0 O' h
  48.         HAL_UART_Transmit_DMA(&huart3,(uint8_t*)aRx3Buffer,USART_RX3_LEN);9 n# w/ y( ~& [/ K
  49.         while(1): h* p  y# w5 R+ ~; E7 F/ `
  50.             {3 F3 w, Y1 j! J; q# E9 J) Y
  51.                 if(__HAL_DMA_GET_FLAG(&hdma_usart3_tx,DMA_FLAG_TCIF3_7))//µÈ´ýDMA2_Steam7´«ÊäÍê³É, B9 j0 @( W! }9 @2 I
  52.                 {! W) e" C4 @; x. b& H% u( U: @
  53.                     __HAL_DMA_CLEAR_FLAG(&hdma_usart3_tx,DMA_FLAG_TCIF3_7);//Çå³ýDMA2_Steam7´«ÊäÍê³É±êÖ¾
    " Y' N$ T( v: `3 k0 m  p8 T
  54.                     HAL_UART_DMAStop(&huart3);      //´«ÊäÍê³ÉÒÔºó¹Ø±Õ´®¿ÚDMA
    4 {! k: Q3 _: Z8 e% b
  55.                     break; 8 b' |0 \' m5 D3 E: K; L
  56.                 }& S7 a5 a# K- Y' S
  57.                             //    __HAL_DMA_GET_COUNTER(&hdma_usart1_tx);
    # H" g  F$ r/ x- U% q$ `+ l# R
  58.                             }    //·¢ËͽÓÊÕµ½µÄÊý¾Ý" E& e5 f$ Y3 m7 {# A$ @
  59.         while(__HAL_UART_GET_FLAG(&huart3,UART_FLAG_TC)!=SET);        //µÈ´ý·¢ËͽáÊø
    , P: v9 F, ?& ]. D0 S
  60.         HAL_UART_Receive_IT(&huart3, (uint8_t *)aRx3Buffer, RX3BUFFERSIZE);   
      M% ^# G9 O1 x  ~$ ~' v
  61.     }/ E" p% w( r8 G2 t
  62.     if(huart->Instance==UART4)//Èç¹ûÊÇ´®¿Ú4, N. X/ U0 {! M) ^' l% |  i$ Q
  63.     {
    2 h6 W5 X7 [1 v; w' s- i
  64.         HAL_UART_Transmit_DMA(&huart4,(uint8_t*)aRx4Buffer,USART_RX4_LEN);
    / j* K* U2 J: M% Y# u
  65.         while(1)
    3 j1 U9 A/ G$ I" m# g) X4 s1 @5 I* Z2 F
  66.             {, I) Y! }: C" O2 P  R4 X- K
  67.                 if(__HAL_DMA_GET_FLAG(&hdma_uart4_tx,DMA_FLAG_TCIF0_4))//µÈ´ýDMA2_Steam7´«ÊäÍê³É( ]6 T& A2 d+ G9 `# E% E; N
  68.                 {
    $ {$ n; E; H% Y( t! |  c
  69.                     __HAL_DMA_CLEAR_FLAG(&hdma_uart4_tx,DMA_FLAG_TCIF0_4);//Çå³ýDMA2_Steam7´«ÊäÍê³É±êÖ¾1 ?+ q8 B# ^# B7 X2 G
  70.                     HAL_UART_DMAStop(&huart4);      //´«ÊäÍê³ÉÒÔºó¹Ø±Õ´®¿ÚDMA
    % [8 r. P  _. ^2 I, c; {8 g8 D
  71.                     break;
    ' W4 Q: m- k1 ^( _$ B) F! C' n8 L) R$ T
  72.                 }
    , }, K6 c2 T, Z0 @
  73.                             //    __HAL_DMA_GET_COUNTER(&hdma_uart4_tx);
    3 x- r# m0 `; ]
  74.                             }    //·¢ËͽÓÊÕµ½µÄÊý¾Ý
    ( a( e( d2 R( s9 e( L5 C8 S; q0 A+ C
  75.         while(__HAL_UART_GET_FLAG(&huart4,UART_FLAG_TC)!=SET);        //µÈ´ý·¢ËͽáÊø. p; X/ g: i) A) |5 d
  76.         HAL_UART_Receive_IT(&huart4, (uint8_t *)aRx4Buffer, RX4BUFFERSIZE);   2 d/ Y3 h/ o6 R; ]- m$ ^- ~
  77.     }
    2 W$ ^- C' ]6 M/ P4 z* ]( x
  78. }
      Z" l; M+ ]1 e8 W( Y0 ]
复制代码
这个我是放在中断里实现串口自收自发的。
  1. void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
    7 s4 \+ i: l) X* d3 y
  2. 2 {2 F( |! Y; Z% E) J' A1 l6 x) p# O
  3. 3         uint32_t isrflags   = READ_REG(huart->Instance->ISR);//?????,???????SR& q: f' E0 K  V2 P
  4. 4         if((__HAL_UART_GET_FLAG(huart, UART_FLAG_PE))!=RESET)( }, y- M& l) W4 `/ \: Z9 K
  5. 5         {; L7 S; j. w0 _/ I: A1 W
  6. 6                         READ_REG(huart->Instance->RDR);//PE???,????DR
    . Z0 u; T7 I1 t* D& e
  7. 7                         __HAL_UART_CLEAR_IT(huart, UART_CLEAR_PEF);//???7 W' h# Y- B/ H+ z* m. z; U3 L  o2 P
  8. 8         }; T# e! s* r$ x; n
  9. 9         if((__HAL_UART_GET_FLAG(huart, UART_FLAG_FE))!=RESET)
    # X1 {; O% K9 o
  10. 10         {4 p$ k- G% J& ?/ I& k
  11. 11                         READ_REG(huart->Instance->RDR);//FE???,????DR9 i( @" m1 h( C9 v2 s& a/ U! q5 K$ M
  12. 12                         __HAL_UART_CLEAR_IT(huart, UART_CLEAR_FEF);
    / N; H: z: _. ^7 U4 N' h; J, Z8 o
  13. 13         }
    + }1 e9 [: |5 u3 [0 \4 b" Z
  14. 14         
    2 Z- c& }' }7 Z: x1 z  x# E9 \
  15. 15         if((__HAL_UART_GET_FLAG(huart, UART_FLAG_NE))!=RESET)' b" K- Q0 H% @
  16. 16         {0 Y9 u  b8 z/ w' a: N& V
  17. 17                         READ_REG(huart->Instance->RDR);//NE???,????DR
    3 H: r# a* k6 e; k8 U& Q$ b  z( a: n0 n
  18. 18                         __HAL_UART_CLEAR_IT(huart, UART_CLEAR_NEF);0 Q9 ~3 @& |6 t; i% B- ^
  19. 19         }        
      _+ R/ q' c% b- s" ^! D
  20. 20         
    0 d/ R+ P2 o' W* ]& v- Y
  21. 21         if((__HAL_UART_GET_FLAG(huart, UART_FLAG_ORE))!=RESET)
    ; `5 R1 `! q1 ^& @( w6 d/ I2 d
  22. 22         {4 O& ]- m8 R' }
  23. 23                         READ_REG(huart->Instance->RDR);//ORE???,????CR
    - H" z# M, M) i# G
  24. 24                         __HAL_UART_CLEAR_IT(huart, UART_CLEAR_OREF);) f" V/ r! u# L/ C" D6 U" a
  25. 25         }        
    % l( U6 x, _1 @' B
  26. 26 }
复制代码
3 C5 ]# N  h* d3 z4 E) d

, g4 x0 P' o& Y$ n5 q

0 \- v2 [) p( x3 r- i# Q& S2 B  G/ p
收藏 评论0 发布时间:2021-12-12 21:44

举报

0个回答

所属标签

相似技术帖

官网相关资源

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