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

STM32 3个Uart 通讯互传【接收DMA】 HAL例程

[复制链接]
慎微 发布时间:2019-7-26 11:28
附件是 末学做STM32 UART的例程:
; O; H- \9 I) }7 u
& R! y4 N- x- b主要想法是: 从A 串口收到 命令,根据需要传到 B或C串口 的设备。8 D- z' [0 L$ f* x9 n  o
B/C 串口收到的 数据反应回 A串口 打印出来。$ e, ^2 Z5 ^2 X* p* S2 w

) l. O/ a) J# J6 B: |参考论坛,
9 c5 |. U6 `+ N4 v! |3 F/ E+ `. |
4 I8 r' \7 R, h9 s: a2 ]7 V用cubeMX 工具设置 三个 串口LPUART1,USART2,UART4,比特率 及硬件;
: C- k# h3 y& N* W# {4 E9 C, |打印参口了论坛的文章,由于该芯片 L476有浮点功能,浮点打印 加 %f 即可。+ d2 R, v+ \5 |+ N; j0 ]
; S6 O1 W* [9 Z6 W# A8 X5 A
主要定义了 结构体% i1 M$ H5 k) U' ^9 ?

7 n- |0 C' P( c7 B& u#define BUFFER_SIZE      60* C' j+ E/ L+ M, d, s/ `
typedef struct8 m5 T3 U9 O; w7 X
{# _0 Y( z: J( s$ Q8 M6 z8 B
    uint8_t EndFlag:1;                   //空闲接收* O, W7 @4 `* O" h( W9 l
    uint16_t length;                     //接收长度
% S6 G1 Y$ {) S6 Z, z7 I    uint8_t dmaBuf[BUFFER_SIZE];         //串口DMA接收缓冲6 f- q: g: A' l* ^' O  R6 ^
}UART_ReceiverDef;/ P6 j5 _) M$ h
! ^! v, L" e5 z; h% B
中断处理稍加处理" s1 n$ h! A" a/ P6 O# i+ M

3 W6 o: s' O0 W8 i; Tvoid USART2_IRQHandler(void)* N9 |0 F$ w8 \" s+ S: {
{
% K8 @7 h/ U* Q! z/ |: h1 w  /* USER CODE BEGIN USART2_IRQn 0 */
+ c9 o+ k3 O6 y2 b     uint32_t tmp_flag = 0;  |0 U5 e& I- e: P
     uint32_t temp;% _: F6 Z4 r+ X% l$ [
  /* USER CODE END USART2_IRQn 0 */9 H! L/ m( E$ \8 l
  HAL_UART_IRQHandler(&huart2);
8 T2 Z& @8 ]  ]* Q4 C7 p% p# d" L  /* USER CODE BEGIN USART2_IRQn 1 */
; R  l0 ]1 I) H9 n1 H  ?4 N  tmp_flag =  __HAL_UART_GET_FLAG(&huart2,UART_FLAG_IDLE);
0 q3 [) H' O! F5 K( F+ z; w& k" q# k! h* P: |5 a: N3 }
    if((tmp_flag != RESET)). h+ Q- @% e2 ?" V& J" e" O
    {! C, ]: K$ H3 D
        __HAL_UART_CLEAR_IDLEFLAG(&huart2); 2 |  l/ o' G5 K* I/ g' f
        /* 读取串口状态寄存器(芯片型号不同,寄存器名称可能需要修改) */3 |7 Q& B4 z$ F. [
        temp = huart2.Instance->ISR;; i" k) ]4 z6 F- n) D5 \% d5 ?
0 e5 a6 D+ w) x* W, p2 _  h
        /* 读取串口数据寄存器(芯片型号不同,寄存器名称可能需要修改) */% x  a3 @! g8 {$ ?7 H
        temp = huart2.Instance->RDR;
9 Q# O! W1 n3 @6 `* d: i- A. q
        HAL_UART_DMAStop(&huart2);: c7 f, {. Z. k

8 w) W' |) \& R9 `9 s        /* 读取DMA剩余传输数量(芯片型号不同,寄存器名称可能需要修改) */2 E* u* G3 C$ o9 ^" U# s
      temp  = hdma_usart2_rx.Instance->CNDTR;
8 ?2 L- t& X- {# R  D$ I2 ?( p      huart2_rx.EndFlag = 1;! D- ]$ s  S- l( X5 V! H/ h$ B: `
      huart2_rx.length = BUFFER_SIZE - temp;  
3 g7 K, O$ `: `. x    }
! X- i8 X: ^6 S4 |6 [9 K  /* USER CODE END USART2_IRQn 1 */4 d) e$ A  N% n  D9 p9 D3 Z. @" z% P
}; U" ^  p1 _2 I
( H2 b, y' r: |' R5 I6 q$ t% k
main 函数 的 初始化:' H) m5 F( X7 e+ r7 B  C7 H
  MX_USART2_UART_Init();6 n# F% c( U' M( Z
  MX_UART4_Init();
5 o$ J3 Q* _% s  Q: z* X  MX_LPUART1_UART_Init();
4 h; @+ V; c% p; X( w% B
# X) d6 q. |) A% y9 y9 }  [启动 uart口:4 ~5 G# |! P! c7 v; s) \
  __HAL_UART_ENABLE_IT(&hlpuart1, UART_IT_IDLE);& R" e4 B/ j/ K( U6 ~9 g
        /*启动串口DMA接收*/- r8 J5 |- w4 t$ \, ?
  HAL_UART_Receive_DMA(&hlpuart1,&huart2_rx.dmaBuf[0],BUFFER_SIZE);
7 \3 ?, d0 @0 }9 A* p; p  C/ L! g# G$ `& B( q; |: O
  __HAL_UART_ENABLE_IT(&huart2, UART_IT_IDLE);8 X8 c+ g$ [2 @9 G7 n4 ^* Y+ [
        /*启动串口DMA接收*/& X) x+ T' V3 e
  HAL_UART_Receive_DMA(&huart2,&huart2_rx.dmaBuf[0],BUFFER_SIZE);
( I$ C7 G, A6 n: P0 l0 ^( j
6 k0 }% H! |8 r; l* a  __HAL_UART_ENABLE_IT(&huart4, UART_IT_IDLE); //UART_IT_IDLE
6 h+ t+ t( w8 n# p# i        /*启动串口DMA接收*/
: c# X; a( g5 N# m  HAL_UART_Receive_DMA(&huart4,&huart4_rx.dmaBuf[0],BUFFER_SIZE);
% w/ n- E4 _# K+ x
  k/ Z! I! B% q! W1 [/ l% \, n& @' ]! H: F% s, L. ^
main 函数的while loop:
2 s/ \# H  W7 @- s0 U. m: K     if (1 == hlpuart1_rx.EndFlag)- R" M: B0 v8 `+ u1 }: k
      {
9 ~# a# x% Z! A3 H( \/ r% G3 a          HAL_UART_Transmit(&hlpuart1,&hlpuart1_rx.dmaBuf[0],hlpuart1_rx.length,250); //送回验证 hlpuart1 是否 OK,若改hlpuart1为huart2,就发给另个串口
' p5 j1 `' G3 q- G# v) W/ M          hlpuart1_rx.length = 0;8 K6 S" ?! D0 t6 k: z. a
          hlpuart1_rx.EndFlag = 0;     
' _+ K5 G( n# c0 u7 }8 `8 R" K8 j
- l7 x5 ], e2 }3 n4 }& b          memset(&hlpuart1_rx.dmaBuf[0],0,BUFFER_SIZE);( r$ k" k9 Z2 O5 F7 B2 X
         HAL_UART_Receive_DMA(&hlpuart1,&hlpuart1_rx.dmaBuf[0],BUFFER_SIZE);   //其实不必每个 Loop用这个函数 接收DMA ,若是环型的话           
" O  W" _& ~6 u! X) w      }               
4 R$ r% \: H" E  R# O6 s  b
) V% V1 i; X) t2 {1 `& [. Z      if (1 == huart2_rx.EndFlag)
: V* N, v% I* h0 i/ r& b      {& L. m+ x& A  v3 c7 L& y+ B0 v( P' I3 D
          HAL_UART_Transmit(&huart2,&huart2_rx.dmaBuf[0],huart2_rx.length,250); //修改 huart2 为 hlpuart1,就可发给打印口
' R! V/ K& s$ [# D, [4 e5 e  S          huart2_rx.length = 0;
+ `7 c9 u+ N/ q: {/ E! J          huart2_rx.EndFlag = 0;     + y1 E1 n; g5 [9 s
0 ^- g9 {3 Y' J  e; t( K; F. w
          memset(&huart2_rx.dmaBuf[0],0,BUFFER_SIZE);# M0 v! v( j- a: c/ X0 k4 G
         HAL_UART_Receive_DMA(&huart2,&huart2_rx.dmaBuf[0],BUFFER_SIZE);   //其实不必每个 Loop用这个函数 接收DMA ,若是环型的话。      4 T0 ]9 N. `/ i! P* d. O! W) p* @
      }                 
/ C1 t. L6 Y/ q) @6 b# ^( z3 B: \* m& F; b, X
赞 收藏 评论1 发布时间:2019-7-26 11:28

举报

1个回答
慎微 回答时间:2019-7-26 11:30:35
附件是详细代码。

3UartOk_org.rar

下载

726.55 KB, 下载次数: 51

所属标签

相似技术帖

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