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

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

[复制链接]
jtc_88 发布时间:2018-6-19 17:13
本帖最后由 jtc_88 于 2018-6-19 17:15 编辑
3 Z5 V5 u8 Y& e% A7 A
% }! R' q0 Q6 V5 H3 P 1529399400(1).png : I+ f0 @# z+ D; j' P+ v* M: l
1529399500(1).png 3 s( ^* x2 o9 s5 C
/* USER CODE BEGIN Private defines */
; R9 w( F  H4 c' K, E: h3 ^9 v#define                RX_DATA_NUM                (30)                        //接收数据 数组
+ H. b3 _' h9 }6 E+ r' L2 w#define                DataPacketHeaderNum                (5)                //数据包,头及CRC校验 数据量 总和& q: G$ V( }0 ?* A
#define                DATA_NUM_INDEX                (2)                        //通讯协议,数据数量数组索引位
$ `0 E: K; j3 \4 z/* USER CODE END Private defines */
' ]( I% ~2 x' v" D3 A
: m+ p& B% I, B7 t1 t$ a* s7 _
& g" {5 S# z0 }: Z+ T( c; y8 o/* Private variables ---------------------------------------------------------*/
+ W6 Q6 n( b* a' ^        uint8_t         RX_DATA[RX_DATA_NUM] = {0};                        //命令接收缓冲 数组8 H2 _9 ]" c: d; B
        
: u1 X& s2 Z  t/* USER CODE END PV */     3 T7 w" `4 J* Q, ]( j2 ~& p! C5 c. J
0 N6 d) [- s( |6 a$ z- O
/* USER CODE BEGIN 2 */4 f  J% O* c& b. q6 W
      HAL_UART_Receive_DMA(&huart1, RX_DATA, RX_DATA_NUM);( e3 N3 J* ~) N6 q9 F- C
        __HAL_DMA_DISABLE_IT(huart1.hdmarx, DMA_IT_TC | DMA_IT_HT | DMA_IT_TE);//关闭DMA 错误 传输一半 全部完成 中断
, c5 {# G$ t! ]. f; s( _2 Q* H. y
6 L( q' x5 `. [1 B        __HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);//使能 串口 空闲中断
) W3 U$ e* A; |" p& f' V0 t
3 ^; C" g3 W$ L! \9 V0 q' J; V& I) @        HAL_NVIC_SetPriority(USART1_IRQn, 0, 0);
0 j2 n6 }5 {5 I! g$ B4 j        HAL_NVIC_EnableIRQ(USART1_IRQn);                        //使能中断
' D# R) r$ s* c/ `      /* USER CODE END 2 */9 [% W$ U1 L6 b) o3 B

  Y4 u2 P9 I. j% i: S: Lvoid USART1_IRQHandler(void)" [. ]1 i$ [/ U  I' q
{
* S7 A( n7 W1 a+ M        if((__HAL_DMA_GET_COUNTER(huart1.hdmarx) + RX_DATA[DATA_NUM_INDEX]) == (RX_DATA_NUM - DataPacketHeaderNum))/ M% Q4 A# G5 l- I7 ^1 m0 V
        {. p  j; G8 p3 O% _0 l( ^
                Flag_RX = 1;//接收到数据 标记位) Z2 G- G) W- n, j
        }
/ o3 i. @8 c- \% B$ U, w        
$ X4 ^/ L2 f5 ]. [  W        __HAL_UART_CLEAR_IDLEFLAG(&huart1);
) ]8 [  P% h4 M9 ?        
. c1 z) c+ \1 c6 Y( K1 _        __HAL_DMA_DISABLE(huart1.hdmarx);9 x% S3 @0 b) Z
        huart1.hdmarx->Instance->CNDTR = RX_DATA_NUM;
0 K% r3 e, M* P2 {( k        __HAL_DMA_ENABLE(huart1.hdmarx);                                //DMA接收数据 必须在 DMA 禁止 时 重新写入
" V$ L5 ]$ v+ u, \9 U: i' X% T6 z1 v; g
}
& D; }$ n, E3 x/ U$ o4 ~: f' s0 `2 b  H8 o3 n! x1 t6 K8 z
注:这是STM32F103的例子,其他的 类似,思路一样,小有区别,USART状态清除方式不同;
& O# k* ^: p* U% |; ?* t: [* H: g: U7 p  `, H
' |7 b5 E( s+ j" X
收藏 评论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
混点经验,上述主要代码:
5 P! x3 Z% {# X9 T$ B
  1. if(USART_GetITStatus(RS232_USARTx,USART_IT_IDLE)!=RESET)* X! e) S, n) _/ ~1 _
  2.         {$ P% G# N6 N) @8 u) P
  3.                 RS232_USARTx->DR;
    # j) ^3 ]% \5 h& y! c" E
  4.                 RS232_USARTx->SR;                                                                                                                                                                                                                        ; Z/ e" |/ X3 w1 A( f
  5.                 6 p5 {  {/ L8 S+ r6 W
  6.                 RS232_RecvDataLen=sizeof(RS232_RecvData)-DMA_GetCurrDataCounter(RS232Rx_DMAx_Channelx);- D/ a$ C3 Z2 v+ H; _2 g3 k5 W
  7.                
    0 e! j* v+ m) }
  8.                 DMA_Cmd(RS232Rx_DMAx_Channelx,DISABLE);; P, r, o. J5 j* J1 m- d
  9.                 DMA_SetCurrDataCounter(RS232Rx_DMAx_Channelx,sizeof(RS232_RecvData));       
    ; P! h2 \: o' X  ?; J$ u
  10.                 DMA_Cmd(RS232Rx_DMAx_Channelx,ENABLE);8 @% G/ K" k( B
  11.                
    ; b$ _* [) c' ]. L% G% d
  12.        
    * c& S6 w3 _+ Y- x- Y* k8 j
  13.         }
复制代码

所属标签

相似分享

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