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

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

[复制链接]
慎微 发布时间:2019-7-26 11:28
附件是 末学做STM32 UART的例程:9 I4 U* P& _9 M8 G0 u/ c

, i+ c8 E8 U" p# i; F. ]( V$ }主要想法是: 从A 串口收到 命令,根据需要传到 B或C串口 的设备。) A/ U9 p$ |4 x: n8 ^7 \
B/C 串口收到的 数据反应回 A串口 打印出来。% k/ q. [( M* e; R# F3 ?

' m/ _1 c% i8 x  b3 t3 n参考论坛,  n9 `: j* h9 [3 E4 T! j6 O3 s

6 s2 X2 s; U  \+ C0 ?5 h用cubeMX 工具设置 三个 串口LPUART1,USART2,UART4,比特率 及硬件;4 s$ C/ N2 P! v* F
打印参口了论坛的文章,由于该芯片 L476有浮点功能,浮点打印 加 %f 即可。7 z: R: |  K0 N" ^
* @5 ^- `& j% S$ [7 Z" X0 n
主要定义了 结构体5 ]5 U% j2 E3 c4 ]

# y# \: b. g# r& F3 ?  ?' c8 a) X#define BUFFER_SIZE      600 y; _" }/ `& s. E: [* q' ]
typedef struct
* N' U( T' L& I7 z( O/ {{6 X' \: z2 n, }- c2 p' b
    uint8_t EndFlag:1;                   //空闲接收, ^$ V4 |7 `& j" M, F
    uint16_t length;                     //接收长度
4 {- [: m: G7 S8 l( y    uint8_t dmaBuf[BUFFER_SIZE];         //串口DMA接收缓冲; A& q0 q* n! @) u. E# ^) t
}UART_ReceiverDef;
3 p/ J" ?* Q. H$ e4 r6 j! S7 T. K# H+ `' ^  Y
中断处理稍加处理
. b: H" `% N0 |! |+ N3 a  Q2 _2 E) U8 p: L
void USART2_IRQHandler(void)$ p7 W) x& h, t5 N( R; B& e
{
5 q( {! \  M! p  k* K) b- Y  /* USER CODE BEGIN USART2_IRQn 0 */
) t, ^9 e% S- v! k     uint32_t tmp_flag = 0;1 G$ O, a& z2 l0 K' l  K2 B
     uint32_t temp;8 e/ S' |1 s. Q$ G& F7 G1 B
  /* USER CODE END USART2_IRQn 0 */
+ B' ]& b( E# K0 d- @8 ?  HAL_UART_IRQHandler(&huart2);" h8 Q4 \, ?' m* m
  /* USER CODE BEGIN USART2_IRQn 1 */
7 I* a/ V( \6 p4 b- P  tmp_flag =  __HAL_UART_GET_FLAG(&huart2,UART_FLAG_IDLE);0 J) s0 _* U$ E* ], ~7 K9 b. ?7 Y
" R4 W3 S2 S' R$ m9 a/ k. V
    if((tmp_flag != RESET))" `7 r3 D" t# ?: ]
    {4 I8 v0 I' n1 K9 p0 f/ _
        __HAL_UART_CLEAR_IDLEFLAG(&huart2);
7 ~3 }$ b/ P3 I0 `. d        /* 读取串口状态寄存器(芯片型号不同,寄存器名称可能需要修改) */6 n2 k5 b" N+ ]( ?) A. t4 v8 v
        temp = huart2.Instance->ISR;
+ L0 F8 M* y/ K/ x3 D# Q+ x
% W7 D0 q- }- K, Z) C        /* 读取串口数据寄存器(芯片型号不同,寄存器名称可能需要修改) */- s+ b7 Z( ^& u7 d+ [7 W; g& O
        temp = huart2.Instance->RDR;( z( B! J0 ?7 O, x
" w/ ?3 N; @) [5 I
        HAL_UART_DMAStop(&huart2);1 J7 d$ ?1 E% p
+ v/ F& f. O( @  U
        /* 读取DMA剩余传输数量(芯片型号不同,寄存器名称可能需要修改) */
. i, o0 {: }9 K" Q. V8 y. i$ x8 f      temp  = hdma_usart2_rx.Instance->CNDTR;
+ }' f) E' U* e      huart2_rx.EndFlag = 1;: @" N$ W7 P- a8 o' `
      huart2_rx.length = BUFFER_SIZE - temp;  ; `+ x9 w8 x) {  v
    }
8 V( h. T- T/ O; `4 T( D, [  j, u  /* USER CODE END USART2_IRQn 1 */
1 n0 S, f  W5 l  j8 f$ Y}
& c& x5 \3 A2 W0 T2 t( C+ B& c6 w) M' G2 I2 k1 u
main 函数 的 初始化:
6 ?. `0 p7 T% \$ G( E; l  MX_USART2_UART_Init();( @7 W. R4 u% Y3 q
  MX_UART4_Init();
+ c# Q6 T- ~. J2 P. l( @& G5 v  MX_LPUART1_UART_Init();
  `5 y, p8 g; h. b* U! |9 T$ f) @8 I
启动 uart口:6 Y( ^- Z! V, X# |+ b
  __HAL_UART_ENABLE_IT(&hlpuart1, UART_IT_IDLE);- v  O& e) J  r- `, z* t
        /*启动串口DMA接收*/& O) \/ w/ A; x& }9 \
  HAL_UART_Receive_DMA(&hlpuart1,&huart2_rx.dmaBuf[0],BUFFER_SIZE);+ P8 f0 S* j7 t7 I4 k9 |' G

. b) M0 b8 q/ o- }' p1 i  __HAL_UART_ENABLE_IT(&huart2, UART_IT_IDLE);- e# R  }, y! N) i- J! T
        /*启动串口DMA接收*/9 A7 K1 Z+ A* ~# d
  HAL_UART_Receive_DMA(&huart2,&huart2_rx.dmaBuf[0],BUFFER_SIZE);
# E' B- a  C. n/ g' z* Y3 T" }* z/ d! ?0 y- p4 U. L
  __HAL_UART_ENABLE_IT(&huart4, UART_IT_IDLE); //UART_IT_IDLE
* x$ k1 ^, N5 [# w+ N; K        /*启动串口DMA接收*/. P0 `- ^5 k6 C. I2 _% R6 k) K& T
  HAL_UART_Receive_DMA(&huart4,&huart4_rx.dmaBuf[0],BUFFER_SIZE);0 K/ h' z6 F5 k) A0 ~1 }

' `2 o: n3 Y% e7 T  l- {
+ p2 _- j$ `, u" hmain 函数的while loop:& g1 a3 Z( r2 ~# M9 ~
     if (1 == hlpuart1_rx.EndFlag)
4 M/ f7 d- ^; T! a1 l      {& ]: i7 F: ?) C
          HAL_UART_Transmit(&hlpuart1,&hlpuart1_rx.dmaBuf[0],hlpuart1_rx.length,250); //送回验证 hlpuart1 是否 OK,若改hlpuart1为huart2,就发给另个串口
3 {  c5 o' X, f% ~          hlpuart1_rx.length = 0;
2 B) M3 s5 R! X  e1 N# s# G" z          hlpuart1_rx.EndFlag = 0;     7 c1 @) L) x* d2 t8 L( o

9 n0 `8 ~# u, i3 y6 k& w          memset(&hlpuart1_rx.dmaBuf[0],0,BUFFER_SIZE);2 `" T; H+ P( ]: K# m8 g
         HAL_UART_Receive_DMA(&hlpuart1,&hlpuart1_rx.dmaBuf[0],BUFFER_SIZE);   //其实不必每个 Loop用这个函数 接收DMA ,若是环型的话           ! a4 S, c) Y8 N* |+ q+ M1 o
      }                ; R9 ~5 [2 `" a9 u/ @/ m, l1 Z9 y
& `, r& `) p  R7 Q/ k0 O6 H
      if (1 == huart2_rx.EndFlag)
- L5 [  R! t9 x      {" Q3 h8 `  x. u6 V* u( P. I
          HAL_UART_Transmit(&huart2,&huart2_rx.dmaBuf[0],huart2_rx.length,250); //修改 huart2 为 hlpuart1,就可发给打印口
  E2 j! T: ]6 _; T8 U; z$ p          huart2_rx.length = 0;
* E  f$ u9 C1 v6 a# r; O          huart2_rx.EndFlag = 0;     ! [, J; [. u9 c* |6 w1 s  f3 Q
5 o3 B2 u+ L# f) o  d+ i
          memset(&huart2_rx.dmaBuf[0],0,BUFFER_SIZE);0 Q0 v, L! ]0 l" [6 T& _6 z5 o
         HAL_UART_Receive_DMA(&huart2,&huart2_rx.dmaBuf[0],BUFFER_SIZE);   //其实不必每个 Loop用这个函数 接收DMA ,若是环型的话。      
4 Q7 y: t1 |3 u& I      }                 
) ^" q, j; I# s; x, s3 F  ]) H9 F$ Z! L% o! @5 N
收藏 评论1 发布时间:2019-7-26 11:28

举报

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

3UartOk_org.rar

下载

726.55 KB, 下载次数: 48

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