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

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

[复制链接]
jtc_88 发布时间:2018-6-19 17:13
本帖最后由 jtc_88 于 2018-6-19 17:15 编辑
4 _: C* [$ i9 b& v6 Z8 g" D: R0 a% z3 M# B( o
1529399400(1).png , ?* z  Q8 _, I/ x6 i; C
1529399500(1).png
! z; o4 x) z) e0 {/* USER CODE BEGIN Private defines */
  E- _* f- n6 u2 T2 P4 F) f, j3 f#define                RX_DATA_NUM                (30)                        //接收数据 数组
  |" d0 q8 a  G, c#define                DataPacketHeaderNum                (5)                //数据包,头及CRC校验 数据量 总和
9 a& J2 W6 d& `) I#define                DATA_NUM_INDEX                (2)                        //通讯协议,数据数量数组索引位
- b" B8 V; [- {5 M$ Z- }/* USER CODE END Private defines */$ v, ~+ E* S, z7 Q6 G' H
/ L8 q0 R# t0 Z* O9 W8 p
1 C! z& g5 b- c
/* Private variables ---------------------------------------------------------*/( F; V: Z* z4 r9 g
        uint8_t         RX_DATA[RX_DATA_NUM] = {0};                        //命令接收缓冲 数组4 O: G/ m. P, D$ [4 K+ V3 ~5 f5 S
        ' o9 k# v9 P5 Y; @4 v
/* USER CODE END PV */     
  c0 }, W; w* m
% |: U% |2 F4 e3 B6 x/* USER CODE BEGIN 2 */
; b3 [! r3 v3 M* J      HAL_UART_Receive_DMA(&huart1, RX_DATA, RX_DATA_NUM);
3 j$ W$ c+ S# q' E! \        __HAL_DMA_DISABLE_IT(huart1.hdmarx, DMA_IT_TC | DMA_IT_HT | DMA_IT_TE);//关闭DMA 错误 传输一半 全部完成 中断+ P7 ^, ?) j' g

" b6 x8 i" d( D: G, U, A# N3 v        __HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);//使能 串口 空闲中断3 _0 G6 l! N: D7 M) [
# d1 d+ I$ Q4 F+ n3 b9 F
        HAL_NVIC_SetPriority(USART1_IRQn, 0, 0);
* r2 T( h7 l& t5 s  L6 T        HAL_NVIC_EnableIRQ(USART1_IRQn);                        //使能中断+ j. o) ?% U3 z; @
      /* USER CODE END 2 */
; R+ _8 R( n: K: X9 L$ z
% S4 W0 i/ |( H8 P5 Z+ R3 l3 U, fvoid USART1_IRQHandler(void)$ c6 e' ]( l( i  V3 O
{3 M: A: x! w" v  e% M$ o
        if((__HAL_DMA_GET_COUNTER(huart1.hdmarx) + RX_DATA[DATA_NUM_INDEX]) == (RX_DATA_NUM - DataPacketHeaderNum))
/ r' ?% w$ Q8 P" M$ |        {
" n$ }. k; i+ W& R                Flag_RX = 1;//接收到数据 标记位$ h' A2 J) c+ y/ s
        }
) E/ e) p5 m1 K+ E. w        * B# S; Q7 u# f" h& T
        __HAL_UART_CLEAR_IDLEFLAG(&huart1);- s1 Y' e+ h' i, F6 R
        
' e6 K. \( K. @4 R$ ^        __HAL_DMA_DISABLE(huart1.hdmarx);) D0 J! T4 ~1 h$ t, M( w" ?' N
        huart1.hdmarx->Instance->CNDTR = RX_DATA_NUM;: l( W) M2 U. Z2 @
        __HAL_DMA_ENABLE(huart1.hdmarx);                                //DMA接收数据 必须在 DMA 禁止 时 重新写入
6 @& I( `1 `4 a$ _$ y8 A
( V% }" M5 c4 ]4 H4 q7 R}
! R1 U  a- ]8 g* i- d6 X7 J  M1 r# a$ B& k9 C
注:这是STM32F103的例子,其他的 类似,思路一样,小有区别,USART状态清除方式不同;3 m) M1 e( }+ o: V8 a

$ D7 I; N- k! w; d
6 u8 G4 B* Y5 @
收藏 评论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
混点经验,上述主要代码:
' ]3 L4 K: a$ G2 k# F) }9 g" X
  1. if(USART_GetITStatus(RS232_USARTx,USART_IT_IDLE)!=RESET)6 F4 }& s7 }+ Q5 ]$ U/ s
  2.         {
    / K6 @, d! |2 c- B5 h! T" z
  3.                 RS232_USARTx->DR;6 f4 v% r8 {  @/ i4 I
  4.                 RS232_USARTx->SR;                                                                                                                                                                                                                        7 G" c3 \% q. j8 W$ D( ^. Z
  5.                 + C; f* T0 G+ E. o8 O$ G* A/ v( ?
  6.                 RS232_RecvDataLen=sizeof(RS232_RecvData)-DMA_GetCurrDataCounter(RS232Rx_DMAx_Channelx);
    ' v) d( k; V  D) r
  7.                
    / {  o( n( L' w  C6 S4 x
  8.                 DMA_Cmd(RS232Rx_DMAx_Channelx,DISABLE);
    " o- Q; g0 c% J- z# j5 }( B9 l+ G
  9.                 DMA_SetCurrDataCounter(RS232Rx_DMAx_Channelx,sizeof(RS232_RecvData));        # v5 H  q$ K" j% r5 O8 I4 }
  10.                 DMA_Cmd(RS232Rx_DMAx_Channelx,ENABLE);
    ' c8 x+ `: z: J
  11.                
    & O: Z0 y' [; g/ c' n* S. M: _$ }
  12.         8 s3 g( K8 S( k; ^; S$ ^1 |
  13.         }
复制代码

所属标签

相似分享

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