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

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

[复制链接]
jtc_88 发布时间:2018-6-19 17:13
本帖最后由 jtc_88 于 2018-6-19 17:15 编辑 ! o6 e, c: s0 H/ c

7 g9 L  i1 W) B7 F+ p 1529399400(1).png # o' Z( ?0 \( a, |$ a1 _5 V5 a
1529399500(1).png
0 t8 ?/ y" L5 K3 @/* USER CODE BEGIN Private defines */  j% j: Y3 {) n$ u8 g0 }
#define                RX_DATA_NUM                (30)                        //接收数据 数组% @8 I; B, I' B$ j* T- E% Y' m# A
#define                DataPacketHeaderNum                (5)                //数据包,头及CRC校验 数据量 总和
; R$ O% y# x* [' L#define                DATA_NUM_INDEX                (2)                        //通讯协议,数据数量数组索引位" k9 `% b% E. a1 u' p
/* USER CODE END Private defines */4 ^+ c; |1 x  k2 T
, K* v+ P9 Q) _+ R7 F( r
, L5 P& V) _/ x9 R
/* Private variables ---------------------------------------------------------*/
" E9 H, m1 t# l$ M7 @6 x; V/ P        uint8_t         RX_DATA[RX_DATA_NUM] = {0};                        //命令接收缓冲 数组
- E8 W9 h0 J0 m: M        2 f- t: s4 W/ g; b' R/ o. m. o
/* USER CODE END PV */     
; C1 q" f+ [  ^3 F
  Q- \0 Q" J: b$ M" G/* USER CODE BEGIN 2 */
. p' L' T9 |' {; Q$ f3 a      HAL_UART_Receive_DMA(&huart1, RX_DATA, RX_DATA_NUM);
  [1 c  l1 W" E        __HAL_DMA_DISABLE_IT(huart1.hdmarx, DMA_IT_TC | DMA_IT_HT | DMA_IT_TE);//关闭DMA 错误 传输一半 全部完成 中断
% _( K! N- d- C1 `9 t/ ?. Z0 f# \+ i. Y) v0 [* i
        __HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);//使能 串口 空闲中断
( a* P9 l) j3 O# L
8 `' ~5 A, F/ ?4 E        HAL_NVIC_SetPriority(USART1_IRQn, 0, 0);
7 {" b0 R/ D) v+ n        HAL_NVIC_EnableIRQ(USART1_IRQn);                        //使能中断( ^; t% H' j/ F/ H; c
      /* USER CODE END 2 */
* F; h' U* o9 h9 _( t, ?, q: e0 _! _' I9 S5 q' [
void USART1_IRQHandler(void)6 ^! e5 w9 h( E1 Y+ j" P* l
{
( t. Z; i$ b) {6 m  A        if((__HAL_DMA_GET_COUNTER(huart1.hdmarx) + RX_DATA[DATA_NUM_INDEX]) == (RX_DATA_NUM - DataPacketHeaderNum))" T7 F) ?8 ~6 j
        {
0 U1 N$ m3 {6 m# K( u+ G! [: S                Flag_RX = 1;//接收到数据 标记位
' R& I9 U! u4 W% f6 k8 U        }. \0 ?) `$ o# C+ J5 H9 |
        4 e6 a; K3 z4 Q  {& m) b8 f2 M
        __HAL_UART_CLEAR_IDLEFLAG(&huart1);
( Q* t5 u$ G1 e3 Q" h+ e  S6 ^# ?        - P8 A8 ?, p: N: c: z2 z$ E
        __HAL_DMA_DISABLE(huart1.hdmarx);$ A' _, f4 j2 k' m* ~5 D# P& f
        huart1.hdmarx->Instance->CNDTR = RX_DATA_NUM;
# \- y' V/ E* w" q- L( Z# O; ]        __HAL_DMA_ENABLE(huart1.hdmarx);                                //DMA接收数据 必须在 DMA 禁止 时 重新写入, t  o( k! T" a6 p

8 l  D- _, P1 i9 Z3 h/ `1 i}
+ d, S+ S" n3 x! c3 t: h) @* n! K, w4 j4 ]& k# ~5 y
注:这是STM32F103的例子,其他的 类似,思路一样,小有区别,USART状态清除方式不同;
) H% v+ Z  {2 j, }; L% l/ t! n7 g9 y" e7 }% u

( j1 t  t, k( R' L
收藏 评论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
混点经验,上述主要代码:: O$ ~5 i( R1 b/ x. R$ [, i
  1. if(USART_GetITStatus(RS232_USARTx,USART_IT_IDLE)!=RESET)
    ; y( H5 ]5 X+ H9 i# u. J/ O
  2.         {
    2 p6 }. w+ W4 u3 K7 G% A4 q2 z
  3.                 RS232_USARTx->DR;
    5 h' l' x" Z; b9 {
  4.                 RS232_USARTx->SR;                                                                                                                                                                                                                        $ d, |7 d* l/ c" X$ I1 u
  5.                
    ( z, Q5 b: E1 g3 k% ~
  6.                 RS232_RecvDataLen=sizeof(RS232_RecvData)-DMA_GetCurrDataCounter(RS232Rx_DMAx_Channelx);
    % ?8 `+ n3 J3 c4 n; [, B7 D
  7.                
    * B4 I/ B& s$ X5 M. n. T
  8.                 DMA_Cmd(RS232Rx_DMAx_Channelx,DISABLE);) L3 s2 I' p* H" z) X4 y3 D  j
  9.                 DMA_SetCurrDataCounter(RS232Rx_DMAx_Channelx,sizeof(RS232_RecvData));        1 z0 T' l6 }) T6 z8 t5 O
  10.                 DMA_Cmd(RS232Rx_DMAx_Channelx,ENABLE);& R* K3 J4 m# e7 \: k& z
  11.                 ( P: D+ E( @  W% |9 q
  12.        
    ) d, h0 u( \7 e& s
  13.         }
复制代码

所属标签

相似分享

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