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

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

[复制链接]
jtc_88 发布时间:2018-6-19 17:13
本帖最后由 jtc_88 于 2018-6-19 17:15 编辑 8 b# O$ A. Y/ {" K3 u8 q
" q( \0 L* C& q; J2 y7 q
1529399400(1).png , C# Y% K, k9 C  Z0 {) K; T. u
1529399500(1).png
: t  J" u# O/ n. }3 f  _8 Y$ Y3 E* c/* USER CODE BEGIN Private defines */
3 @# N  z# D1 P#define                RX_DATA_NUM                (30)                        //接收数据 数组
4 ^! T2 U% c8 F2 G8 F#define                DataPacketHeaderNum                (5)                //数据包,头及CRC校验 数据量 总和
1 F, R1 V6 Z- {#define                DATA_NUM_INDEX                (2)                        //通讯协议,数据数量数组索引位2 Y. h5 U- T. o' U
/* USER CODE END Private defines */, W% O4 d6 ?* p0 D$ v# R% p

0 c8 F( ]' G% B; n/ f5 j& [: H% @& q' ^* e: H( p2 \8 f
/* Private variables ---------------------------------------------------------*/
$ J$ e* A% r# j4 E6 N$ U7 U        uint8_t         RX_DATA[RX_DATA_NUM] = {0};                        //命令接收缓冲 数组3 q: h4 g& h% T+ t! x
        / q, a6 N% U  Q9 q: K- n" v( l
/* USER CODE END PV */     
9 g: Y  _# V" w2 z; M, S% \$ R8 y/ f8 q# U4 ?1 E. k; B
/* USER CODE BEGIN 2 */
- }5 W( G& y; n      HAL_UART_Receive_DMA(&huart1, RX_DATA, RX_DATA_NUM);9 y% n0 \% G1 I3 R) P+ [. G
        __HAL_DMA_DISABLE_IT(huart1.hdmarx, DMA_IT_TC | DMA_IT_HT | DMA_IT_TE);//关闭DMA 错误 传输一半 全部完成 中断
8 B5 S* z7 x3 b6 a* W  b9 ^4 g7 S4 X3 d0 N. B
        __HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);//使能 串口 空闲中断
- m0 Y0 h& h1 N, D/ @! p  ^1 F" y: n- C; L
        HAL_NVIC_SetPriority(USART1_IRQn, 0, 0);
# O$ u$ K" J; E% ^. e        HAL_NVIC_EnableIRQ(USART1_IRQn);                        //使能中断
7 u/ E4 Z0 ]# t# W4 r# w      /* USER CODE END 2 */7 A2 [! a- K6 O3 O
9 o$ ^2 q: L# P: p5 l
void USART1_IRQHandler(void)
- d2 u7 v1 _2 Q{& T8 F# H! F7 I9 f/ C. I
        if((__HAL_DMA_GET_COUNTER(huart1.hdmarx) + RX_DATA[DATA_NUM_INDEX]) == (RX_DATA_NUM - DataPacketHeaderNum))9 g( H, h1 H7 x+ Y( z* N4 U$ s6 q
        {% t& {6 g8 H9 `% ]% n* W! S
                Flag_RX = 1;//接收到数据 标记位
6 W/ E" G+ `& [% y        }1 I3 l+ R+ P1 w( m
        
0 p" ~$ f* C4 @2 E9 h; j8 X+ [        __HAL_UART_CLEAR_IDLEFLAG(&huart1);' W$ \4 W  t) P
        
+ D; W* C* Y# t+ ]& a        __HAL_DMA_DISABLE(huart1.hdmarx);8 s9 X) c9 R7 N
        huart1.hdmarx->Instance->CNDTR = RX_DATA_NUM;; \* ^" d9 f) c
        __HAL_DMA_ENABLE(huart1.hdmarx);                                //DMA接收数据 必须在 DMA 禁止 时 重新写入
0 m% K" D+ G0 `+ N$ S+ |
; r6 |9 i% h$ w}
4 f( P3 R  B! m+ b: J7 u4 T2 l& q% w: {2 n
注:这是STM32F103的例子,其他的 类似,思路一样,小有区别,USART状态清除方式不同;2 }8 \, D. E, b# i
& ?( d3 e6 V+ K: f
& Z) Y9 ~" @% Y0 ~- w; O& o; t
赞 收藏 评论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, 下载次数: 9

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

ZDPHPN 回答时间:2018-6-21 11:19:20
混点经验,上述主要代码:$ O) e! z8 b. S9 x: P
  1. if(USART_GetITStatus(RS232_USARTx,USART_IT_IDLE)!=RESET)' e' ]! ~5 i8 c% k" U) g
  2.         {" {  N7 r; k0 H- V
  3.                 RS232_USARTx->DR;/ d0 l* S+ I) f, Y$ X! Z
  4.                 RS232_USARTx->SR;                                                                                                                                                                                                                       
    $ E; j4 k+ {/ O  d- S& ^) D
  5.                
    $ z! g: |5 h8 m4 B0 S8 s8 z5 \
  6.                 RS232_RecvDataLen=sizeof(RS232_RecvData)-DMA_GetCurrDataCounter(RS232Rx_DMAx_Channelx);6 V% z1 [, V3 u0 c6 t# r1 K9 a* B
  7.                   P0 s, m3 R. r& D5 W
  8.                 DMA_Cmd(RS232Rx_DMAx_Channelx,DISABLE);
    . @. C7 w' ]4 w
  9.                 DMA_SetCurrDataCounter(RS232Rx_DMAx_Channelx,sizeof(RS232_RecvData));       
    1 |1 I/ D2 w% d5 p+ k* f
  10.                 DMA_Cmd(RS232Rx_DMAx_Channelx,ENABLE);
    ; a* V: q9 k! _& u; Q2 I
  11.                 ! H+ J  ~( E* h5 u# {! C, s
  12.         9 U6 }) I9 i! `% x
  13.         }
复制代码

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版