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

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

[复制链接]
慎微 发布时间:2019-7-26 11:28
附件是 末学做STM32 UART的例程:
/ Z& `5 K7 \2 s) W! }5 E  h( p( j9 _/ F2 _8 |# u, F' ?; Y; q( ?
主要想法是: 从A 串口收到 命令,根据需要传到 B或C串口 的设备。
! p# q4 U+ s( ^' g1 t9 l4 Y: dB/C 串口收到的 数据反应回 A串口 打印出来。5 ?% G, {6 U& n7 P7 n
: }- M  n9 e1 l$ S
参考论坛,
" p; y& {' |$ U) [8 T
& F7 k) A5 F1 }: o3 O, u* g! s用cubeMX 工具设置 三个 串口LPUART1,USART2,UART4,比特率 及硬件;7 e4 |2 U" c2 b; X
打印参口了论坛的文章,由于该芯片 L476有浮点功能,浮点打印 加 %f 即可。' ~+ B; j: L3 o$ w* y2 e# M8 L
! d" a( P' x+ ?$ |) Q' F8 g
主要定义了 结构体
! B* ?3 D" r( e& w
2 z: ^) {- h3 I2 c7 h7 Z1 ~#define BUFFER_SIZE      60/ B% f8 s; g* n. {4 a
typedef struct
; `8 S/ ?+ a/ q" i9 X- l$ [{
* g( |/ I  Z# \1 K    uint8_t EndFlag:1;                   //空闲接收
  `2 h/ d# F% d) l0 r    uint16_t length;                     //接收长度
" t9 _( I  ?3 N( A$ k% P    uint8_t dmaBuf[BUFFER_SIZE];         //串口DMA接收缓冲& _0 e6 T4 c6 z; b& q
}UART_ReceiverDef;( ], ^) `8 S) p9 ?
3 C; x# M3 Z3 t" e% ^# Q
中断处理稍加处理
, |; k9 U! L5 j& A1 B+ c
# ]) ]3 n' |" w" U9 j+ Hvoid USART2_IRQHandler(void)
; z9 c0 `) D) H: p{" `: k/ ~" h, Q( K
  /* USER CODE BEGIN USART2_IRQn 0 */
% R( a) }5 `- X- C4 `  S8 q     uint32_t tmp_flag = 0;% G& X7 ?; K3 d# ~: Z
     uint32_t temp;
/ ^" ^4 ?7 W5 X& [  /* USER CODE END USART2_IRQn 0 */
( C0 W8 G5 _$ t( K- S  HAL_UART_IRQHandler(&huart2);
  ]$ X; G4 i7 v  U; b  /* USER CODE BEGIN USART2_IRQn 1 */
# b, V, P2 x8 W# h/ P; ?$ A  tmp_flag =  __HAL_UART_GET_FLAG(&huart2,UART_FLAG_IDLE);+ d+ G/ K+ v9 E' a% c- v
2 x- P: i' ~( _( X; k
    if((tmp_flag != RESET))
0 u% |! A7 u7 Q$ M2 X# s    {- d& u* e5 S: E$ Y
        __HAL_UART_CLEAR_IDLEFLAG(&huart2); % a0 A3 f- x' f; A' T
        /* 读取串口状态寄存器(芯片型号不同,寄存器名称可能需要修改) */
$ ~  j, z9 a0 s* \. K/ V        temp = huart2.Instance->ISR;
5 H' V; Z! o; M9 L3 I- m
9 {! G* m/ [' V* T        /* 读取串口数据寄存器(芯片型号不同,寄存器名称可能需要修改) */. V! |- B3 W/ g% q0 p; B" N) Z
        temp = huart2.Instance->RDR;
3 ~: a6 j* a5 [5 h) _0 C
1 G% {/ q7 E' `6 g% n3 G        HAL_UART_DMAStop(&huart2);  d/ l: u# @. a

0 K& o3 X0 S) K        /* 读取DMA剩余传输数量(芯片型号不同,寄存器名称可能需要修改) */
% r- P% _+ q& o: G- S      temp  = hdma_usart2_rx.Instance->CNDTR;5 p' W9 T; W3 R( a# r( i
      huart2_rx.EndFlag = 1;8 W4 X3 u( a7 C- f( u2 r
      huart2_rx.length = BUFFER_SIZE - temp;  % q' l  h3 H1 R5 w2 ?% i3 k
    }
- x6 [' j! L/ Q; |/ L# [! a, c  /* USER CODE END USART2_IRQn 1 */
2 t7 F& e- m! M4 l  Y}4 ^) g/ k$ G, l) U3 d0 \

0 s) g) `8 i6 d  M0 |4 Xmain 函数 的 初始化:- ^4 H! S3 D/ U' {
  MX_USART2_UART_Init();
* D- ~  Y, u+ |0 ]% Q  MX_UART4_Init();9 c7 c" ]- q; z/ J9 t: N
  MX_LPUART1_UART_Init();
# b1 |% R8 b- J9 T8 S
" P" U6 ?1 C3 C. q3 ]启动 uart口:
* V% ^7 t! y. g7 G- I$ y& @  __HAL_UART_ENABLE_IT(&hlpuart1, UART_IT_IDLE);* n& l5 h4 o8 g( j
        /*启动串口DMA接收*/! k' K7 I8 w8 @5 d0 {! h2 V: C
  HAL_UART_Receive_DMA(&hlpuart1,&huart2_rx.dmaBuf[0],BUFFER_SIZE);1 t3 g: i5 w( C
7 s! N6 C( t# G& e/ ]- N& j
  __HAL_UART_ENABLE_IT(&huart2, UART_IT_IDLE);
( k5 S$ q+ ~) F        /*启动串口DMA接收*/
, U% z; }8 g" w/ k* }9 K1 _0 c  HAL_UART_Receive_DMA(&huart2,&huart2_rx.dmaBuf[0],BUFFER_SIZE);, z, T3 R$ Q& I  k' Z0 O) |
9 ]3 Z9 G  R/ r/ @
  __HAL_UART_ENABLE_IT(&huart4, UART_IT_IDLE); //UART_IT_IDLE% C1 s5 B4 C+ M* u* @
        /*启动串口DMA接收*/
( a+ |- I; _* z% X  HAL_UART_Receive_DMA(&huart4,&huart4_rx.dmaBuf[0],BUFFER_SIZE);3 W, p0 @( M- Q4 w+ d  Q/ g3 N8 w+ j  d
- F- Z: s+ [! l8 N5 O

* ~1 ^; x0 i# _0 `1 `( }main 函数的while loop:) J5 b! j  d# W: b' b- _: y7 R
     if (1 == hlpuart1_rx.EndFlag)5 [1 G9 N/ ~( n
      {
  f& q& K1 A1 C7 K$ B* d          HAL_UART_Transmit(&hlpuart1,&hlpuart1_rx.dmaBuf[0],hlpuart1_rx.length,250); //送回验证 hlpuart1 是否 OK,若改hlpuart1为huart2,就发给另个串口
, d  V+ W! T# ^" E) c          hlpuart1_rx.length = 0;
; T5 U! V. _. U- b7 c          hlpuart1_rx.EndFlag = 0;     9 b9 p6 g3 {4 m: H

7 y7 k. M2 c8 ]          memset(&hlpuart1_rx.dmaBuf[0],0,BUFFER_SIZE);/ F' n5 s9 e8 U) B
         HAL_UART_Receive_DMA(&hlpuart1,&hlpuart1_rx.dmaBuf[0],BUFFER_SIZE);   //其实不必每个 Loop用这个函数 接收DMA ,若是环型的话           
$ \5 P" Y9 B! F5 R$ c      }                # \" h2 p2 l6 b' _2 M1 ^! c

& J1 Y5 o/ E; a* z3 T      if (1 == huart2_rx.EndFlag)6 w" ?" `) R4 a. K% P$ P
      {
% G9 r5 `, n5 M& @# n! j          HAL_UART_Transmit(&huart2,&huart2_rx.dmaBuf[0],huart2_rx.length,250); //修改 huart2 为 hlpuart1,就可发给打印口2 x4 {  _& i9 b/ d4 }: {7 ^& h7 U3 e
          huart2_rx.length = 0;. D0 }/ e. h1 h# P* p' ?% i4 [9 g
          huart2_rx.EndFlag = 0;     & I5 l  ~$ I7 b$ X' Q

" h) f; O5 w& f+ K2 {; e          memset(&huart2_rx.dmaBuf[0],0,BUFFER_SIZE);
$ }8 j0 d5 y: x% m" L% [& c         HAL_UART_Receive_DMA(&huart2,&huart2_rx.dmaBuf[0],BUFFER_SIZE);   //其实不必每个 Loop用这个函数 接收DMA ,若是环型的话。      9 ?0 z; w( S7 V* _" \0 n
      }                 
* L& }4 x4 A, S6 V3 l% l4 |. `5 l9 @- i* C. X
收藏 评论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 手机版