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

stm32G4 cubemx串口+DMA接受不定长数据

[复制链接]
STMCU小助手 发布时间:2023-2-24 23:00
串口DMA收不定长数据
! l' A0 j+ e2 X4 E5 M4 p  N9 U主要利用了IDLE空闲中断,然后整体验证采用透传,发送后回传数据。$ i0 X/ c5 w3 J) b
整体流程
5 @2 d7 Q! h& _' f% r( ?' L" T1cubemx配置
5 y1 A' o6 n! l1 t4 a  o2接收发送数组,标志位定义,# h8 _' a8 G- x+ N
3中断使能. u1 Z; o7 N- k2 O7 r! c0 \8 t
4中断函数修改" a. K/ w1 ~( ^2 Q2 [( A
5回调函数修改
3 e. V7 x0 B+ n" N& T

+ q$ S) W% M, {0 @% j; M& F一、cubemx配置
7 l, ^% _# D/ }& T

  `1 L, I0 D( K$ ]- y/ u% |8 f1 [
e3d17b81928c4ad6906a4e29616b5d4f.png
; Z( q) x6 ^# C" C# \, m- Y
5 ?7 m8 Z" L: c2 m
波特率随便设置,我设置的是1M,注意你的上位机和串口助手是否选择一致的参数
1 `# `3 e! c2 H7 E9 A- `, m; @$ ^/ a3 [6 Q* N
f0007c213bf8406799a77aabb62c2ad9.png
& Q/ ~* }& c5 o' f( m

6 ~6 {* R- N8 E: V. WDMA USART1 TX RX 设置,mode都是normal模式就可以
% @" @- o/ ]7 A0 g. R1 y
0 G8 t2 T6 W+ O
22092d53b6074b0493b34b0d66a527d8.png 1 @0 E$ }8 A* }' C( z3 ?

* e8 Y7 g9 x% E, `7 l
) \; }+ K* C8 S; c" ^1 Y8 X
二、程序修改
; _9 C' W7 y. @; I' t: n9 n1.初始数组定义  @/ V4 G0 v8 |  t* ?) D
  1. uint8_t                Rx_Flag = 0;         //接收标志位1 g& r: U. Q* k
  2. uint8_t                RecCount = 0;         //个数
    8 N" m% u0 h% L5 l: X5 @! O6 W
  3. uint8_t                Rx_Buf[256];             //接收缓冲区
    + C# r- Y- r% r% x# {# Z1 S, r( T: n
  4. uint8_t     Tx_Buf[256];
    . Z( h+ d6 Y* ^1 ]$ h, t
复制代码

* r2 y1 g6 l- \% C% o2.中断使能配置6 z6 [1 z0 f0 @6 F/ e) C1 k
  1. void MX_USART1_UART_Init(void)
    % V% M  k& k, c- Q/ u  l
  2. {
    4 N  D# w, C$ L

  3. 5 \& A$ I( s0 L+ a
  4.   /* USER CODE BEGIN USART1_Init 0 */. i0 V4 z- a' @. ^* ~7 o

  5. 1 a" w6 D' f( w( E& ~& Q% n2 ]
  6.   /* USER CODE END USART1_Init 0 */4 J! O" y: ?) K  |: A* {
  7. 4 {( i% A4 X$ ]; r" c4 C1 I
  8.   /* USER CODE BEGIN USART1_Init 1 */# l  ]1 }+ q( a& b7 W  U

  9. 2 o5 w7 Z2 J, y3 Z3 Q
  10.   /* USER CODE END USART1_Init 1 */- f! v& p# d( k! m4 J0 r* @
  11.   huart1.Instance = USART1;' _; p& A- V/ @% }, }) U) j% E
  12.   huart1.Init.BaudRate = 1000000;
    5 G5 q: u6 _3 E5 a9 D; e
  13.   huart1.Init.WordLength = UART_WORDLENGTH_8B;( U+ J( L( a5 C: f/ y: x
  14.   huart1.Init.StopBits = UART_STOPBITS_1;
    4 C0 Z& S2 r& w; U, k1 v: i
  15.   huart1.Init.Parity = UART_PARITY_NONE;9 l+ X6 H( r; Y5 N0 W( N9 O
  16.   huart1.Init.Mode = UART_MODE_TX_RX;/ E* g6 T5 [9 a1 t* P' @
  17.   huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;2 R) ^6 ~- z+ y3 L
  18.   huart1.Init.OverSampling = UART_OVERSAMPLING_16;
    2 H3 c# c# `1 k" W
  19.   huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
    0 |8 m# z2 r0 {% x/ o, P' n
  20.   huart1.Init.ClockPrescaler = UART_PRESCALER_DIV1;! m, E/ j" C! U% L" O' i9 S! P
  21.   huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
    2 }, l! }8 ^1 |
  22.   if (HAL_RS485Ex_Init(&huart1, UART_DE_POLARITY_HIGH, 0, 0) != HAL_OK)
    4 _% u/ L5 H. Q7 X+ [
  23.   {* B2 D9 F7 w$ s: s8 l
  24.     Error_Handler();' A/ x& o) I& Q! Z
  25.   }
    . x  `" K9 ?: `* A$ M
  26.   if (HAL_UARTEx_SetTxFifoThreshold(&huart1, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK)/ q5 f! _; m8 J, W- |
  27.   {& B5 N0 A7 R: ^9 [
  28.     Error_Handler();
    - K: W/ W5 Z/ F; T$ \* G
  29.   }# u4 K# S. i+ Y) X: Z4 i
  30.   if (HAL_UARTEx_SetRxFifoThreshold(&huart1, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK)
    ) @% h# l  r/ E! F! Q8 P
  31.   {9 G0 F# j, x4 ~4 Y$ P+ P
  32.     Error_Handler();2 n/ b3 j& A. X6 d  V  Q" _# D# ~- Z  _# v1 {
  33.   }
    2 m# W. T) T: _- p! c
  34.   if (HAL_UARTEx_DisableFifoMode(&huart1) != HAL_OK)9 B9 v9 G% X0 A
  35.   {
    : e$ i9 b1 b9 E! L
  36.     Error_Handler();
    7 Q( W6 s# O, k8 v: X4 D9 e- @- u
  37.   }
    6 H2 a/ G, C& @, B: u# X
  38.   /* USER CODE BEGIN USART1_Init 2 */" X/ R( Y2 ~  j. W
  39.         __HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);//开启idle中断
    3 L+ v+ o9 s6 R, e
  40.           HAL_UART_Receive_DMA(&huart1, Rx_Buf, 256);        //开启dma中断+ u, m) m5 _* c
  41.   /* USER CODE END USART1_Init 2 */
    ( h9 O5 _4 A9 l1 i

  42. 5 S5 W( S' O/ J  U* B7 {
  43. }" h1 E/ @9 A, C, d  o  U# G
复制代码
: E* Q; o1 O* c# e0 o4 }  q
3.中断函数修改* a, m3 h2 ?: f8 D1 C  ~' A
  1.   */
    , L9 c% k: W$ f) Z$ C& {
  2. void USART1_IRQHandler(void)
    0 L; k' \& B& o" `
  3. {
    4 |* A0 X. C* }
  4.   /* USER CODE BEGIN USART1_IRQn 0 */
    / r% z* u. g$ z& C- ]
  5.         ) u  N/ L- Z* D* ?$ W
  6.   /* USER CODE END USART1_IRQn 0 */6 L0 O, k8 d2 q/ D% ^: z% A* ]
  7.   HAL_UART_IRQHandler(&huart1);3 K2 l. ?4 J/ c; ?9 W4 V. I' n
  8.   /* USER CODE BEGIN USART1_IRQn 1 */
    , v/ V" ?7 X; ]( y; \
  9.         //添加idle中断处理
    ' Y3 }6 {- Y" u) V+ x" `
  10.   if(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE)!=RESET)  //是否发生idle中断
    ( M# i( C; v5 Y5 Q6 K( ?
  11.         {
    # k8 }: w( t4 o) B
  12.                 __HAL_UART_CLEAR_IDLEFLAG(&huart1);   //清除idle中断
    , y/ m8 P' L* K, @0 `5 d
  13.                 HAL_UART_IdleCpltCallback(&huart1);   //用户编写的中断回调函数
    1 ~- O/ x  f: Q  v1 ^
  14.         }
    - V9 \  t7 C1 L" \) T
  15. ( w1 L) P" N+ z2 M( S7 y: u
  16. & I0 E6 e2 Z; l( X
  17.   /* USER CODE END USART1_IRQn 1 */; b; R2 S; i# m# l8 X
  18. }* X0 [) g: H9 p# \* A3 {) p0 G
复制代码
7 X# G1 c6 C+ g* U" o( e# u' O
4.回调函数修改, L% H/ z. D2 u4 k+ C( U, U! C
  1. void HAL_UART_IdleCpltCallback(UART_HandleTypeDef *huart)     //空闲中断函数5 B. {6 A& p* V" M' ^
  2. {
    , C1 k5 m" R7 j) C
  3.    Rx_Flag = 1;                                              // 设置接收完成标志
    + R  m6 r9 O. v; w/ t: y& B
  4.    HAL_UART_DMAStop(huart);                                 // 停止DMA传输
    . z5 E. K/ e; ^; M6 a. S
  5. 0 {$ A8 t! e! I( i/ y2 [- w: e
  6.    //发生空闲中断时,已接受的数据等于数据总减去dma中待接收的数据
    5 \5 ]1 _+ t9 W: s
  7.    RecCount= 256 - __HAL_DMA_GET_COUNTER(&hdma_usart1_rx);   
    : E8 O2 I) E9 Q4 d  v

  8. 9 J( A2 \  y: {) {  L3 @
  9.          memcpy(Tx_Buf, Rx_Buf, RecCount);                     //内存复制函数
    ' V) n  M5 C0 w8 S; l
  10.          memset(Rx_Buf, 0, sizeof(Rx_Buf));                    // 清零接收缓存区
    ; l$ C& V- D5 I* ~- M
  11.          HAL_UART_Receive_DMA(&huart1,Rx_Buf, sizeof(Rx_Buf));   //重新开启DMA传输
    : I9 t- x, N2 P8 _! m
  12.          
    . O$ _% f" w! Y9 d) u8 \+ }
  13.        
    : e+ ~+ _: r1 Z4 Q
  14. }
    ! U) `! B3 ]/ z* d
复制代码

1 l  e# c. `* v; ^/ n# V4 ]) k/ p) V6 E6 k6 K1 }* `5 \: ?+ @; x8 j4 @
————————————————0 {4 S, v2 N3 _# \* w5 j% X
版权声明:超级馒头神4 b0 P' |2 N3 t( W

7 l! U+ e% E2 X/ z# M) P' f" V! B
赞 收藏 评论0 发布时间:2023-2-24 23:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

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