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

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

[复制链接]
jtc_88 发布时间:2018-6-19 17:13
本帖最后由 jtc_88 于 2018-6-19 17:15 编辑 1 w6 h% R$ a5 {" X* P4 V8 }; Z  Y
/ I. J% ~1 g; T# g9 f. s9 s: P
1529399400(1).png
2 u, W0 `- R0 F* B6 e0 m& ^ 1529399500(1).png
9 n3 q: S. G  M8 L2 {1 N5 L/* USER CODE BEGIN Private defines */- ~6 s/ \/ A  g6 W; a- V) p
#define                RX_DATA_NUM                (30)                        //接收数据 数组
' U9 x2 J% B& t3 J#define                DataPacketHeaderNum                (5)                //数据包,头及CRC校验 数据量 总和
5 J9 `# Y9 U2 F: T9 F' R, z#define                DATA_NUM_INDEX                (2)                        //通讯协议,数据数量数组索引位% `5 m+ H' |) b5 B& U
/* USER CODE END Private defines */
9 u' n1 X! M6 y
7 b) }8 ]2 l9 C
6 d5 X  N: H3 `7 w1 O  I/* Private variables ---------------------------------------------------------*/5 A9 K6 _9 c) ]% ]
        uint8_t         RX_DATA[RX_DATA_NUM] = {0};                        //命令接收缓冲 数组
7 Y0 n4 o/ M7 p! z          ?9 b. l  {& A& x5 @9 Y
/* USER CODE END PV */     . G1 ]6 _" o) m: o0 w
$ C# _' |  M7 v4 n
/* USER CODE BEGIN 2 */
8 g- }; r# J  b: N      HAL_UART_Receive_DMA(&huart1, RX_DATA, RX_DATA_NUM);! p8 Q  y, K/ p1 D  H: i8 h9 J
        __HAL_DMA_DISABLE_IT(huart1.hdmarx, DMA_IT_TC | DMA_IT_HT | DMA_IT_TE);//关闭DMA 错误 传输一半 全部完成 中断) \+ L* B) ^7 j

5 x' o) n1 e+ L1 B2 I        __HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);//使能 串口 空闲中断0 \& ~$ ^  p1 }, T8 V% e4 l' e3 E
3 `% `8 j2 r, g. ]4 q* z
        HAL_NVIC_SetPriority(USART1_IRQn, 0, 0);
7 P9 q" v" e9 h/ c        HAL_NVIC_EnableIRQ(USART1_IRQn);                        //使能中断" l7 P! S* T7 L# P( W
      /* USER CODE END 2 */. Q8 F- x  a4 W

" d' Q& H4 A! n, |4 T/ v0 e0 zvoid USART1_IRQHandler(void)
6 B0 t. g3 x( z: |{1 K# K  z. ]5 j' _3 [6 F5 m: I1 Y
        if((__HAL_DMA_GET_COUNTER(huart1.hdmarx) + RX_DATA[DATA_NUM_INDEX]) == (RX_DATA_NUM - DataPacketHeaderNum))* d- A8 B) ]% H- o
        {& K4 F  ^' B+ s. P& K0 n
                Flag_RX = 1;//接收到数据 标记位
8 S; d* a! _/ T# S" {7 d' c2 I$ f        }
6 T4 O4 T+ F1 q+ |) ]        2 U6 ~! j. z/ H! ~5 ]
        __HAL_UART_CLEAR_IDLEFLAG(&huart1);0 H5 [. @: l" t6 b0 ?9 @
        ( h3 B$ n+ n( x) F' c& @: w
        __HAL_DMA_DISABLE(huart1.hdmarx);" \5 k& v% F6 i1 x
        huart1.hdmarx->Instance->CNDTR = RX_DATA_NUM;" U6 g7 Q1 K7 O9 E0 \$ g
        __HAL_DMA_ENABLE(huart1.hdmarx);                                //DMA接收数据 必须在 DMA 禁止 时 重新写入
5 {; P* O! L( J  H! Y' f8 o7 M* }/ d
0 w6 s$ r. q/ G}4 H+ W1 O4 ], P

: t0 v+ ]. ?7 D+ @注:这是STM32F103的例子,其他的 类似,思路一样,小有区别,USART状态清除方式不同;
8 X: C' X! j8 U9 y( S) V% R1 [8 d# r$ O+ \

& u; m) r; f) F! P
收藏 评论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, 下载次数: 8

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

ZDPHPN 回答时间:2018-6-21 11:19:20
混点经验,上述主要代码:; N8 m# F' Y; d. n/ H6 ^( r
  1. if(USART_GetITStatus(RS232_USARTx,USART_IT_IDLE)!=RESET)
    8 x; G$ p3 K) d3 @
  2.         {
    2 {& V) h% r7 f+ T' D1 ~# ~6 c2 t
  3.                 RS232_USARTx->DR;/ Z; v- ^) B, [2 R- L& \3 g* ~
  4.                 RS232_USARTx->SR;                                                                                                                                                                                                                        * u# A: M. L9 W. |& h4 r
  5.                
    - _1 x% y1 c0 C6 i4 v
  6.                 RS232_RecvDataLen=sizeof(RS232_RecvData)-DMA_GetCurrDataCounter(RS232Rx_DMAx_Channelx);
    , t) i9 j5 t: M4 j9 Q1 N3 E! s; C  E
  7.                
    - j" e# A$ U/ s( X! C) ~8 U5 b
  8.                 DMA_Cmd(RS232Rx_DMAx_Channelx,DISABLE);
    / Q& H4 q" _% t- C- j0 A9 m: W
  9.                 DMA_SetCurrDataCounter(RS232Rx_DMAx_Channelx,sizeof(RS232_RecvData));        4 b- J3 S1 i/ Z/ T' k5 D: ^
  10.                 DMA_Cmd(RS232Rx_DMAx_Channelx,ENABLE);- u; r7 n; x! C4 t1 d' W6 b* ~
  11.                 % y$ k( M& K; B
  12.         + k( N2 q1 O: j  d% |
  13.         }
复制代码

所属标签

相似分享

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版