请选择 进入手机版 | 继续访问电脑版

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

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

[复制链接]
jtc_88 发布时间:2018-6-19 17:13
本帖最后由 jtc_88 于 2018-6-19 17:15 编辑 + j# X4 G, U0 a( s8 `) i6 v" H  o
) b! I( c$ {8 a$ U/ P
1529399400(1).png ( R9 ~+ k3 _3 k5 C  z2 E! F4 A
1529399500(1).png
: `' r- ^" q' D; j; \" Y6 P; E/* USER CODE BEGIN Private defines */
4 x3 ], V' D8 H' ~2 I' M( R#define                RX_DATA_NUM                (30)                        //接收数据 数组$ {2 o: o8 I' G$ {9 h
#define                DataPacketHeaderNum                (5)                //数据包,头及CRC校验 数据量 总和& l1 @2 }9 m  v" ]9 P  C3 H
#define                DATA_NUM_INDEX                (2)                        //通讯协议,数据数量数组索引位: a4 o3 N  `0 g+ @! V$ m+ H
/* USER CODE END Private defines */& c, b2 j' R+ S/ g' p% E. B& Y
. ?- T0 y7 Y/ B! u0 O+ M8 Q5 r

! {, G  t* W; `' e8 Q: G$ `/* Private variables ---------------------------------------------------------*/
/ t5 m' b; a3 g( Y        uint8_t         RX_DATA[RX_DATA_NUM] = {0};                        //命令接收缓冲 数组! G3 c5 u* {- W" c* S5 e$ M0 p
        
( M  z( ?" o4 G% x, L3 }! I/* USER CODE END PV */     ( @& e9 Q+ m7 q' r8 ?$ y
2 C% v! C' A, r) O8 |. u
/* USER CODE BEGIN 2 */
& ^/ o! L% T) @% c1 v& B6 x% E      HAL_UART_Receive_DMA(&huart1, RX_DATA, RX_DATA_NUM);! I+ Y3 n& I1 Y  Z) f5 c0 }0 q& E
        __HAL_DMA_DISABLE_IT(huart1.hdmarx, DMA_IT_TC | DMA_IT_HT | DMA_IT_TE);//关闭DMA 错误 传输一半 全部完成 中断$ O* R# S; h4 [" `( y1 k

% B0 S; |6 q) Z        __HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);//使能 串口 空闲中断
5 ?; |7 Q) |. _7 ?9 j: m. j: w
" _: G8 [* \' u- }2 s        HAL_NVIC_SetPriority(USART1_IRQn, 0, 0);
6 o* b8 x# _- y# I$ P; X9 R        HAL_NVIC_EnableIRQ(USART1_IRQn);                        //使能中断1 {  x: y% h" J# l
      /* USER CODE END 2 */5 A% l7 |6 s9 z0 [$ f* C

1 a: }4 m9 p+ s( |. W  Evoid USART1_IRQHandler(void)
9 t4 E, a$ g- N% A  B{, s# e2 a4 m: W3 G* n" b
        if((__HAL_DMA_GET_COUNTER(huart1.hdmarx) + RX_DATA[DATA_NUM_INDEX]) == (RX_DATA_NUM - DataPacketHeaderNum))7 ^: N4 J+ a5 S5 \- S5 k) j
        {
; f0 C! P% S* e4 Y/ V% }+ S                Flag_RX = 1;//接收到数据 标记位+ |: [. `" l2 O3 r- O. o2 i
        }( J4 x- @6 w( W( b3 o% t
        2 g) p& ?* l; @! z( }
        __HAL_UART_CLEAR_IDLEFLAG(&huart1);
; c" p6 T" g: ]! G4 T        
9 C. m  U& k6 u. T; O- G) g        __HAL_DMA_DISABLE(huart1.hdmarx);" Z* E+ v7 h+ `
        huart1.hdmarx->Instance->CNDTR = RX_DATA_NUM;/ ^- S1 K! k3 q4 p- H
        __HAL_DMA_ENABLE(huart1.hdmarx);                                //DMA接收数据 必须在 DMA 禁止 时 重新写入
# w0 r5 k# n& s, A* b) s' `4 i. O) \4 N, I
}
$ O: v, K. t2 N8 W0 D  R2 B/ Y1 N- d( X. b* ~+ V
注:这是STM32F103的例子,其他的 类似,思路一样,小有区别,USART状态清除方式不同;- K* h; \9 y: z) \3 P6 a! d, h
0 y% O) f8 S+ F* \. r1 K( x1 s
: z, x$ B$ F" X! Y; {
收藏 评论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
混点经验,上述主要代码:
8 D; F; Z' K9 T4 O  I# E4 ^7 `
  1. if(USART_GetITStatus(RS232_USARTx,USART_IT_IDLE)!=RESET)
    ' ^  q9 ~0 i; N! j+ a! I( j
  2.         {
    ; n; H: B0 N# `  Q
  3.                 RS232_USARTx->DR;
    6 N# ]6 U! Z" B" T* ?( w0 P
  4.                 RS232_USARTx->SR;                                                                                                                                                                                                                        8 G4 ?3 c8 U  O7 A
  5.                
    ; X. F% H# h& E' s) e% K/ Q& {7 i
  6.                 RS232_RecvDataLen=sizeof(RS232_RecvData)-DMA_GetCurrDataCounter(RS232Rx_DMAx_Channelx);4 ]- O6 Z5 ^/ ?, D+ C1 y
  7.                 ' T6 {/ s9 q8 v$ X, L2 h3 |2 g
  8.                 DMA_Cmd(RS232Rx_DMAx_Channelx,DISABLE);2 }0 H# m& X+ y  R8 o' z& x; B
  9.                 DMA_SetCurrDataCounter(RS232Rx_DMAx_Channelx,sizeof(RS232_RecvData));        0 H! |- `$ U8 y( d. g. }
  10.                 DMA_Cmd(RS232Rx_DMAx_Channelx,ENABLE);8 ]3 S3 p2 X9 `% X  {6 Q! S
  11.                
    1 S# h) H3 }/ @
  12.        
    0 z# R; V& }  t& ]' H( x/ E
  13.         }
复制代码

所属标签

相似分享

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