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

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

[复制链接]
慎微 发布时间:2019-7-26 11:28
附件是 末学做STM32 UART的例程:
. r& A$ b/ u% ]8 q8 Q9 V2 C" k* f$ l5 q4 k/ g0 `4 ^9 l" R- j4 w9 E
主要想法是: 从A 串口收到 命令,根据需要传到 B或C串口 的设备。+ P# J0 l# N+ p
B/C 串口收到的 数据反应回 A串口 打印出来。
$ k  v* g0 S6 V# g* B% P
9 I" U4 k1 T& y1 r9 A参考论坛,5 n4 n% o5 E, z* c% @
6 }- g+ w- {- Q2 V1 R
用cubeMX 工具设置 三个 串口LPUART1,USART2,UART4,比特率 及硬件;
$ q9 u6 C9 a: e5 q. m打印参口了论坛的文章,由于该芯片 L476有浮点功能,浮点打印 加 %f 即可。
0 N' D* @7 I+ ]5 j* W/ ^
. h0 r0 V5 s( n! v  @3 E主要定义了 结构体
' F+ j5 e, y, R/ ?! h, S% Y( Z6 d3 W; s. l0 ^
#define BUFFER_SIZE      603 [& [; v. C; n
typedef struct% Z, V' R2 Z0 u3 ]
{; N) i& a( F3 G1 O) J3 G4 h
    uint8_t EndFlag:1;                   //空闲接收
% S  A5 j/ [# Z& I3 K3 z    uint16_t length;                     //接收长度7 ?2 X  ^2 M. y9 V% r) u8 r
    uint8_t dmaBuf[BUFFER_SIZE];         //串口DMA接收缓冲
0 E0 g: @8 O2 K6 p* N- b}UART_ReceiverDef;
) M: L3 P: f) [1 m
! j) a: |, G( i; M) O: c中断处理稍加处理9 [2 U, }, X+ A9 A0 \7 H/ ~+ ~# L* o$ L+ p

$ N7 O$ R0 U5 e* w& P- evoid USART2_IRQHandler(void)2 u: w8 _. d1 H; p1 k" r
{
# d+ @/ u# t" j/ {1 ~6 ^/ X  /* USER CODE BEGIN USART2_IRQn 0 */: I9 E7 o# K$ O, B1 t' m
     uint32_t tmp_flag = 0;* D) c* B' N2 A3 B
     uint32_t temp;+ U* o6 ]3 O/ `/ O5 h, |3 b( k
  /* USER CODE END USART2_IRQn 0 */' S- w! y( v- S* N# s  E" c# T9 N8 C
  HAL_UART_IRQHandler(&huart2);
3 {2 b9 S0 e8 J! S) y  /* USER CODE BEGIN USART2_IRQn 1 */
" L0 W& f5 F9 ~0 }- J8 [+ ^  tmp_flag =  __HAL_UART_GET_FLAG(&huart2,UART_FLAG_IDLE);  t( G- j4 o* K  f

3 l4 b7 ?2 T. E4 i- b    if((tmp_flag != RESET)). `6 ?( B! j( G
    {5 C' ?- S2 b. V/ Z! n
        __HAL_UART_CLEAR_IDLEFLAG(&huart2);
# M  q3 d% B% {/ ~& o% P8 Q9 n& ?        /* 读取串口状态寄存器(芯片型号不同,寄存器名称可能需要修改) */) w9 Y7 o5 M; _; E5 S  F
        temp = huart2.Instance->ISR;
1 b5 d7 _, V& u" N+ V
9 ?& i/ ~8 x3 w- t; R9 D        /* 读取串口数据寄存器(芯片型号不同,寄存器名称可能需要修改) */4 E9 T0 |0 L5 _* h) |, l
        temp = huart2.Instance->RDR;
4 d9 c& r' X4 g/ r4 B# {; a; C- W7 ~( E+ P/ E) v! }: N# X
        HAL_UART_DMAStop(&huart2);
. i0 y1 Z9 L3 K/ z9 T, G" ]& B- _* w2 K4 q2 b
        /* 读取DMA剩余传输数量(芯片型号不同,寄存器名称可能需要修改) */
/ `3 ~$ V, ^+ W0 ^0 e      temp  = hdma_usart2_rx.Instance->CNDTR;1 j' H6 F7 o. Y
      huart2_rx.EndFlag = 1;
- I/ Z0 W. D$ ]9 A9 u0 M      huart2_rx.length = BUFFER_SIZE - temp;  6 c9 X$ ~% ~+ a) r* D# ~9 O7 o" @
    }
& S, ~( d+ E3 S( t/ R$ Z$ f  /* USER CODE END USART2_IRQn 1 */$ C) w9 {! F- J6 d1 r  Y9 N6 U
}
7 z! U+ t, y5 Q! f% K( A4 A& N8 j, D2 [& b
main 函数 的 初始化:( r9 t0 P8 b0 m/ @1 A% ^4 A8 ?
  MX_USART2_UART_Init();7 H0 V: o3 e, x4 y8 ]/ [
  MX_UART4_Init();
, X7 L. l9 t* J7 i1 F  MX_LPUART1_UART_Init();
. @% g4 n, R2 i1 j2 J. }  p1 ?
" ~, k0 O2 T0 e8 ?1 Q7 \& x启动 uart口:
1 M( S) d/ X1 {; P5 p' g  __HAL_UART_ENABLE_IT(&hlpuart1, UART_IT_IDLE);
1 `4 F) Q) a9 g9 j        /*启动串口DMA接收*/7 H7 S( H- @% O; x
  HAL_UART_Receive_DMA(&hlpuart1,&huart2_rx.dmaBuf[0],BUFFER_SIZE);
4 c# P  N5 B: g: g0 G3 U) W
& {: R- H' L8 `3 R  __HAL_UART_ENABLE_IT(&huart2, UART_IT_IDLE);9 Y7 h% h; }8 R( E) W5 t0 g
        /*启动串口DMA接收*/
0 Z& O3 a3 u4 ^7 u1 ~  HAL_UART_Receive_DMA(&huart2,&huart2_rx.dmaBuf[0],BUFFER_SIZE);% y0 S2 Q) `6 u6 s: w" h/ }- E
9 u  h( `3 h+ k2 o7 a5 N
  __HAL_UART_ENABLE_IT(&huart4, UART_IT_IDLE); //UART_IT_IDLE
+ o& G/ \7 A0 c4 V* M2 B9 D        /*启动串口DMA接收*/6 v) K+ P0 [1 P! v
  HAL_UART_Receive_DMA(&huart4,&huart4_rx.dmaBuf[0],BUFFER_SIZE);4 @& `% E: ~! o  r" e
8 b$ z- y7 Q1 v# N
7 y0 L' D! x' ?+ H
main 函数的while loop:( x1 c- K8 b: V2 E0 U
     if (1 == hlpuart1_rx.EndFlag)  E& q) m. @( [: s, u
      {
7 {$ W3 x! L1 d, c7 F          HAL_UART_Transmit(&hlpuart1,&hlpuart1_rx.dmaBuf[0],hlpuart1_rx.length,250); //送回验证 hlpuart1 是否 OK,若改hlpuart1为huart2,就发给另个串口
. l) F5 S! Y/ p0 P0 X          hlpuart1_rx.length = 0;: V. _0 W3 l$ l) {+ [! @! W
          hlpuart1_rx.EndFlag = 0;     
# S; U& B; m' D! z/ e0 Z. N7 {/ C# E; l, s' Y
          memset(&hlpuart1_rx.dmaBuf[0],0,BUFFER_SIZE);
# e/ k- J  k! b+ q/ ~         HAL_UART_Receive_DMA(&hlpuart1,&hlpuart1_rx.dmaBuf[0],BUFFER_SIZE);   //其实不必每个 Loop用这个函数 接收DMA ,若是环型的话           
- c! z; b6 F0 y& n& v      }               
1 P5 p+ S8 B$ R) X( K
8 @( D( o* S0 D9 B6 f7 u! ^/ w      if (1 == huart2_rx.EndFlag)
3 J- g, M( ?9 E! ?' Z/ l. [0 n      {
3 g4 {+ y0 _- P7 N' F          HAL_UART_Transmit(&huart2,&huart2_rx.dmaBuf[0],huart2_rx.length,250); //修改 huart2 为 hlpuart1,就可发给打印口% ~# w& T; z1 k
          huart2_rx.length = 0;& f8 U( W7 \3 z' ]' P3 G/ ?
          huart2_rx.EndFlag = 0;     - F2 d' i+ k. C* R& r; `
; D/ V$ j% S4 U- f. F
          memset(&huart2_rx.dmaBuf[0],0,BUFFER_SIZE);
: Q) K$ n; e4 |5 n7 {. B  |. Z         HAL_UART_Receive_DMA(&huart2,&huart2_rx.dmaBuf[0],BUFFER_SIZE);   //其实不必每个 Loop用这个函数 接收DMA ,若是环型的话。      
: H% b1 S  h+ k0 N) X      }                 
% ]! `2 c( U: X, F  v
7 R1 m7 k7 x7 r- I
赞 收藏 评论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 手机版