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

【经验分享】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)) p- R6 O; X. c
  2. {& q2 [$ x. ~9 p1 x
  3.     static uint8_t sta = 0;: c: E5 O4 Z' A2 H0 o
  4.     if(huart->Instance==USART1)//Èç¹ûÊÇ´®¿Ú1& d& w5 F- a3 `& Q4 b% c% u1 R
  5.     {7 s# x: r& q7 x7 v
  6. //        USART_RX1_BUF[Usart1_len]=aRx1Buffer[0];# o/ Y! b. b9 X$ k: O+ ]9 [; v. c
  7. //        Usart1_len++;) m  j  r( c( _# i; R/ j
  8. //        if(Usart1_len == 0x04)                             % t$ W) L+ a& |0 g' `" O6 C3 Y5 u1 \
  9. //    {/ N! C* U+ ~% U; T: F% S1 D
  10.         HAL_UART_Transmit_DMA(&huart1,(uint8_t*)aRx1Buffer,USART_RX1_LEN);. G- U% G# P1 \
  11.         while(1)8 }3 y' a4 J3 m6 L( I. J& Q8 q
  12.             {
    . k) [% X2 \* Z9 t/ M
  13.                 if(__HAL_DMA_GET_FLAG(&hdma_usart1_tx,DMA_FLAG_TCIF3_7))//µÈ´ýDMA2_Steam7´«ÊäÍê³É
    ! b9 f$ ^/ q) {* N. y6 D
  14.                 {7 x6 i* p; S0 B( U0 T
  15.                     __HAL_DMA_CLEAR_FLAG(&hdma_usart1_tx,DMA_FLAG_TCIF3_7);//Çå³ýDMA2_Steam7´«ÊäÍê³É±êÖ¾; X6 |; E! N+ Y8 E3 E# y" S
  16.                     HAL_UART_DMAStop(&huart1);      //´«ÊäÍê³ÉÒÔºó¹Ø±Õ´®¿ÚDMA& j" H* e/ m4 V% `/ g
  17.                     break; & D+ e$ M/ D6 _' B# w* T* u* r
  18.                 }
      }: Z. {8 E; l% x8 L) O
  19.                             //    __HAL_DMA_GET_COUNTER(&hdma_usart1_tx);! ?* k# ?! Z+ b; `
  20.                             }
    4 |- f- x# a: G; D- b9 j" }3 k
  21.         switch(sta)
    , T; F$ P7 H# A* T
  22.         {
    ; K; u, F6 }  N! _+ j+ n5 O
  23.             case 0:if(aRx1Buffer[0] == 0x55) sta = 1;break;+ x' F; i( m% l* ?9 E6 W. x" ?) ^
  24.             case 1:if(aRx1Buffer[0] == 0xaa) mode = 1,sta = 2;else sta = 0;break;
    5 x( r# B; J$ K, L1 C9 W7 p
  25.             case 2:mode = 0;sta = 0;break;
      x# s  H  X, t) i* {+ D1 ]
  26.         }        9 i# O$ W; T' {) T
  27.         HAL_UART_Receive_IT(&huart1, (uint8_t *)aRx1Buffer, RX1BUFFERSIZE);   + G' B7 m! D+ ]) |, h
  28. //        }            
    9 L& t. |, `" \) C8 t: R0 V1 J" {, E
  29.     }
    0 v1 n2 l9 d$ L
  30.     if(huart->Instance==USART2)//Èç¹ûÊÇ´®¿Ú2
    - l0 @' A) U8 z1 T* u# f0 G. K
  31.     {
    1 ?; ~0 X( R& n0 P2 `
  32.         HAL_UART_Transmit_DMA(&huart2,(uint8_t*)aRx2Buffer,USART_RX2_LEN);$ n. O- K! h+ _3 Z  w2 W
  33.         while(1)
    4 I2 z+ o( a$ f( X. E
  34.             {+ u$ ~, C2 ?% X8 @$ W
  35.                 if(__HAL_DMA_GET_FLAG(&hdma_usart2_tx,DMA_FLAG_TCIF2_6))//µÈ´ýDMA2_Steam7´«ÊäÍê³É
    $ X) M0 ?& c8 Z. ]# D
  36.                 {
    , b" Z3 f" |- ?5 \: {7 e* Y
  37.                     __HAL_DMA_CLEAR_FLAG(&hdma_usart2_tx,DMA_FLAG_TCIF2_6);//Çå³ýDMA2_Steam7´«ÊäÍê³É±êÖ¾
    / L# l% t+ E; g* f) @) G5 d7 p( K: z
  38.                     HAL_UART_DMAStop(&huart2);      //´«ÊäÍê³ÉÒÔºó¹Ø±Õ´®¿ÚDMA
    . {5 h( h. ]  J9 }
  39.                     break;
    9 P. u3 m/ k) S; t
  40.                 }
    ( J: s$ T2 k2 i" `" F+ ^
  41.                             //    __HAL_DMA_GET_COUNTER(&hdma_usart2_tx);
    . Z3 C2 ?3 p7 Y2 j
  42.                             }    //·¢ËͽÓÊÕµ½µÄÊý¾Ý6 n$ x9 B7 L0 v: Q4 ?/ p
  43.         while(__HAL_UART_GET_FLAG(&huart2,UART_FLAG_TC)!=SET);        //µÈ´ý·¢ËͽáÊø
    ) O$ U( l6 P$ d6 K: }( ]
  44.         HAL_UART_Receive_IT(&huart2, (uint8_t *)aRx2Buffer, RX2BUFFERSIZE);   
    . |7 I6 Z! Z+ d( x, }' H: G
  45.     }9 ?; e5 e$ f7 o/ M# \' z( U1 g
  46.     if(huart->Instance==USART3)//Èç¹ûÊÇ´®¿Ú3
    ( f* r1 T& O7 z
  47.     {
    2 B+ O; W; l, j2 v
  48.         HAL_UART_Transmit_DMA(&huart3,(uint8_t*)aRx3Buffer,USART_RX3_LEN);
    % f5 n6 W1 Z' f& v: F6 f# B& U
  49.         while(1)
    4 K9 F. S0 F5 W; G- L$ H- {
  50.             {
    + q4 ~) ?( I# H/ S
  51.                 if(__HAL_DMA_GET_FLAG(&hdma_usart3_tx,DMA_FLAG_TCIF3_7))//µÈ´ýDMA2_Steam7´«ÊäÍê³É! L+ Q1 P% i2 F7 P6 S
  52.                 {# S" I: t1 J1 h& S+ s  r# `& r$ N  c
  53.                     __HAL_DMA_CLEAR_FLAG(&hdma_usart3_tx,DMA_FLAG_TCIF3_7);//Çå³ýDMA2_Steam7´«ÊäÍê³É±êÖ¾1 S! `$ U& P3 L
  54.                     HAL_UART_DMAStop(&huart3);      //´«ÊäÍê³ÉÒÔºó¹Ø±Õ´®¿ÚDMA
      B& r/ {! x- f* y7 u2 f
  55.                     break; 6 `4 |6 k2 u* ~: U& N
  56.                 }
    ' g4 }5 u% n7 j, \' H
  57.                             //    __HAL_DMA_GET_COUNTER(&hdma_usart1_tx);/ q, i) y/ j1 k5 T8 s- f
  58.                             }    //·¢ËͽÓÊÕµ½µÄÊý¾Ý- X2 K, c: f1 }/ u
  59.         while(__HAL_UART_GET_FLAG(&huart3,UART_FLAG_TC)!=SET);        //µÈ´ý·¢ËͽáÊø) }$ ?$ b0 H% J+ j5 I$ E! S; s9 a* N
  60.         HAL_UART_Receive_IT(&huart3, (uint8_t *)aRx3Buffer, RX3BUFFERSIZE);   7 U  B5 f) _  `* |. P# e% ~) x
  61.     }/ |+ }: q) \7 M' S/ \1 l
  62.     if(huart->Instance==UART4)//Èç¹ûÊÇ´®¿Ú4
    ; f, b* q$ O3 B- J8 `1 o  y
  63.     {: Q2 d* k- B7 a7 V8 n, H
  64.         HAL_UART_Transmit_DMA(&huart4,(uint8_t*)aRx4Buffer,USART_RX4_LEN);5 c2 p2 F4 \7 B
  65.         while(1)3 r9 t1 A# X1 f7 x7 `. q& X% {3 T
  66.             {
    ! T2 p+ i6 z5 c5 l) v% Z* u
  67.                 if(__HAL_DMA_GET_FLAG(&hdma_uart4_tx,DMA_FLAG_TCIF0_4))//µÈ´ýDMA2_Steam7´«ÊäÍê³É
    : U% v. s) z0 {, N& n
  68.                 {
    7 x; j* c8 _; n; O  A  ~( A3 [+ O
  69.                     __HAL_DMA_CLEAR_FLAG(&hdma_uart4_tx,DMA_FLAG_TCIF0_4);//Çå³ýDMA2_Steam7´«ÊäÍê³É±êÖ¾
      P5 ]' ^. B7 E7 o
  70.                     HAL_UART_DMAStop(&huart4);      //´«ÊäÍê³ÉÒÔºó¹Ø±Õ´®¿ÚDMA& p* N. ~" }$ P0 o1 u
  71.                     break; 2 z& G. Q% m/ d6 Z  T
  72.                 }, p  t+ O. A! Z7 p; t& P  o
  73.                             //    __HAL_DMA_GET_COUNTER(&hdma_uart4_tx);5 d7 ~4 Z/ _* |  s
  74.                             }    //·¢ËͽÓÊÕµ½µÄÊý¾Ý9 c3 q. Y" U/ }) `: ]# }5 `9 j9 O
  75.         while(__HAL_UART_GET_FLAG(&huart4,UART_FLAG_TC)!=SET);        //µÈ´ý·¢ËͽáÊø
    . V7 N1 ^+ v0 j, s( D
  76.         HAL_UART_Receive_IT(&huart4, (uint8_t *)aRx4Buffer, RX4BUFFERSIZE);   + g! m% q. c% L$ D3 U
  77.     }
    " L& }$ _, J) n. V6 c; N
  78. }$ G* n) w" n1 c) a
复制代码
这个我是放在中断里实现串口自收自发的。
  1. void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)/ \1 O$ _) T! r/ l% u! \' I. o! r# u
  2. 2 {& G$ ~0 l- t* H3 z. [  f
  3. 3         uint32_t isrflags   = READ_REG(huart->Instance->ISR);//?????,???????SR
    9 v* n$ V. Q  H" t
  4. 4         if((__HAL_UART_GET_FLAG(huart, UART_FLAG_PE))!=RESET)5 X. K0 ]7 e  X) b. F3 C% `
  5. 5         {2 S# ^2 N$ p2 A3 `1 w9 v" T  y+ R
  6. 6                         READ_REG(huart->Instance->RDR);//PE???,????DR. y# u* y; u( D
  7. 7                         __HAL_UART_CLEAR_IT(huart, UART_CLEAR_PEF);//???
    7 b9 E, h1 F; m
  8. 8         }% W# C0 O, N' p( Q8 ?- t2 N
  9. 9         if((__HAL_UART_GET_FLAG(huart, UART_FLAG_FE))!=RESET)
    & f. Z2 q* Y, K7 V
  10. 10         {
    ! m1 ^- G( I. R
  11. 11                         READ_REG(huart->Instance->RDR);//FE???,????DR
    + s" c8 g8 l" W! k
  12. 12                         __HAL_UART_CLEAR_IT(huart, UART_CLEAR_FEF);
    5 m3 P# ~8 _- e2 o- G* f. ?. ?- F
  13. 13         }
    ) S' c; }. w6 U. G4 ?7 E
  14. 14         
    ( ?1 k: D6 e$ V& Q7 X  F
  15. 15         if((__HAL_UART_GET_FLAG(huart, UART_FLAG_NE))!=RESET)
      K5 A  N* ^' t, ~
  16. 16         {
    8 D$ l  F0 L9 }+ p5 X' ]* ^! ~
  17. 17                         READ_REG(huart->Instance->RDR);//NE???,????DR
    ! w+ K; J3 f# b
  18. 18                         __HAL_UART_CLEAR_IT(huart, UART_CLEAR_NEF);! L/ h$ X+ ^6 h8 L+ E
  19. 19         }        , O; ]9 B* T. h# g) @. d
  20. 20         4 v* h3 e. S9 R) M4 e# ~' K
  21. 21         if((__HAL_UART_GET_FLAG(huart, UART_FLAG_ORE))!=RESET)& Y+ _+ O, f; p
  22. 22         {& L3 M0 T5 M4 I  @
  23. 23                         READ_REG(huart->Instance->RDR);//ORE???,????CR
    ' R. j$ V9 D& Y* }/ A2 X4 L
  24. 24                         __HAL_UART_CLEAR_IT(huart, UART_CLEAR_OREF);5 h7 S3 I; _3 ^6 I! Y) B+ y0 O
  25. 25         }        
    ; z1 n; N8 p0 S( Z$ `4 m
  26. 26 }
复制代码
6 v& F( F8 j& D5 }6 u

% E+ X) M8 d1 p/ p, J4 p; x! \

3 p4 {" G5 S, b  k7 Z9 w6 O9 a: l
. d' R" T) Y! j; \  y# R
收藏 评论0 发布时间:2021-12-12 21:44

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版