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

USART-DMA 空闲模式 接收不等长数据

[复制链接]
jtc_88 发布时间:2018-6-19 17:13
本帖最后由 jtc_88 于 2018-6-19 17:15 编辑
& j% }9 }$ _: Y, x' A$ M# P0 q9 w4 W" @# [+ d5 M. B% |0 \
1529399400(1).png
* x6 F6 O) L% B2 H8 z 1529399500(1).png 9 d  ~7 s* d4 R  q
/* USER CODE BEGIN Private defines */5 B; I  P+ }  }% u  F4 d7 E
#define                RX_DATA_NUM                (30)                        //接收数据 数组
3 C5 L/ ]2 U% ^/ @#define                DataPacketHeaderNum                (5)                //数据包,头及CRC校验 数据量 总和( v' L9 W( R- {/ h% @
#define                DATA_NUM_INDEX                (2)                        //通讯协议,数据数量数组索引位+ d5 r- p4 j/ ]5 r" K7 ]
/* USER CODE END Private defines */
3 |: y% v& s# ^7 O
! y+ |% j; N/ n1 Q" D
& Z) J+ p" S* s5 A# c/* Private variables ---------------------------------------------------------*/: v& v$ f; t8 m
        uint8_t         RX_DATA[RX_DATA_NUM] = {0};                        //命令接收缓冲 数组/ [- ], R' j  U# n0 ?  t
        
. k$ v4 O+ N) ?1 y/* USER CODE END PV */     
( \# S  U3 f! O( Y. C- W8 p, k/ j. l+ B% @7 _% n
/* USER CODE BEGIN 2 */. Z3 k$ S& J/ a
      HAL_UART_Receive_DMA(&huart1, RX_DATA, RX_DATA_NUM);5 o! x( q, O$ |1 _* ~& c2 @& F
        __HAL_DMA_DISABLE_IT(huart1.hdmarx, DMA_IT_TC | DMA_IT_HT | DMA_IT_TE);//关闭DMA 错误 传输一半 全部完成 中断
, \" m, v. O* I5 ?9 D" U2 p8 V9 _1 v" h* f! T2 Q# U
        __HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);//使能 串口 空闲中断
, r1 r* ~9 F  Q
" a1 _4 e: A- x* E0 ^. }. u% A/ r        HAL_NVIC_SetPriority(USART1_IRQn, 0, 0);
, [$ W2 s1 H* H( e! @- I, f5 o        HAL_NVIC_EnableIRQ(USART1_IRQn);                        //使能中断$ S9 s& g7 h6 _3 a: Q
      /* USER CODE END 2 */; {( g9 d( [4 u- Z

# V5 v" M3 h8 k0 I7 }void USART1_IRQHandler(void)! M, V9 Y- }! r: Z# T+ L
{
4 b2 x0 c3 Z. [% z  ]' @        if((__HAL_DMA_GET_COUNTER(huart1.hdmarx) + RX_DATA[DATA_NUM_INDEX]) == (RX_DATA_NUM - DataPacketHeaderNum))
$ P* X- Q# P% N8 m9 W        {
+ g  t" q1 g0 G* B; G! L                Flag_RX = 1;//接收到数据 标记位
/ B: A2 _# u0 N1 f2 q- X  J        }
, F" F! _2 A, w% K' ?6 E4 Y$ R2 z. L        + n, G0 Y! r0 e7 ~1 c
        __HAL_UART_CLEAR_IDLEFLAG(&huart1);
+ H% X; V1 {+ u6 d3 D' @" L& f        0 d  t) `9 m+ P
        __HAL_DMA_DISABLE(huart1.hdmarx);8 J8 `, T0 n  T# P8 u
        huart1.hdmarx->Instance->CNDTR = RX_DATA_NUM;
  @+ S, J; f$ n& u        __HAL_DMA_ENABLE(huart1.hdmarx);                                //DMA接收数据 必须在 DMA 禁止 时 重新写入  F  ~& j, Q# D2 G) }. p3 M/ V6 |

2 |% K: T) v! `}
$ B2 C. y8 y; H
+ ~, V! j. |4 J4 M注:这是STM32F103的例子,其他的 类似,思路一样,小有区别,USART状态清除方式不同;
$ q# Y! U2 U( v& s0 ?/ p; @5 x
- j# s; y9 }. [& p6 z% N5 q. Q( G7 U( z7 \- A8 ~, }3 q0 N
赞 收藏 评论4 发布时间:2018-6-19 17:13

举报

4个回答
zero99 回答时间:2018-6-19 17:32:17
学习了
me浩 回答时间:2018-6-20 09:30:54
ZDPHPN 回答时间:2018-6-21 11:15:43
我也分享一个串口空闲中断+DMA收发的例子,只要发送是连续的,使用空闲中断+DMA接收不定长数据还是可以的

RS232.rar

下载

1.67 KB, 下载次数: 9

文件名任意,就是一个串口收发,包括.c/.h两个文件

ZDPHPN 回答时间:2018-6-21 11:19:20
混点经验,上述主要代码:$ X/ \5 P: Q& J- j) d3 G6 q
  1. if(USART_GetITStatus(RS232_USARTx,USART_IT_IDLE)!=RESET)
    3 j" r0 A7 H4 V# D( k
  2.         {% n) {4 E3 k& ]+ c5 {
  3.                 RS232_USARTx->DR;: \; c+ m- V5 v7 l3 ]
  4.                 RS232_USARTx->SR;                                                                                                                                                                                                                        ; U- k, H$ L- n
  5.                 , h6 R, E% m4 |( x8 A
  6.                 RS232_RecvDataLen=sizeof(RS232_RecvData)-DMA_GetCurrDataCounter(RS232Rx_DMAx_Channelx);
    " |( j) p6 s3 G% y$ G7 A, B
  7.                 $ Y& x3 U4 Y* C9 r# o" J2 ]* e
  8.                 DMA_Cmd(RS232Rx_DMAx_Channelx,DISABLE);
    0 l# \2 M" d9 l* x) F! E- N
  9.                 DMA_SetCurrDataCounter(RS232Rx_DMAx_Channelx,sizeof(RS232_RecvData));        # k0 v! n* N5 Z$ I6 M& X
  10.                 DMA_Cmd(RS232Rx_DMAx_Channelx,ENABLE);
    ) _; }% x% \9 V( l. i1 j
  11.                
    0 S* R% \# r2 [0 N# M0 H4 X
  12.        
    8 M9 k% b3 A. ~) |
  13.         }
复制代码
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版