请选择 进入手机版 | 继续访问电脑版
搜索
查看: 2117|回复: 5

[求助] 串口接收DMA+IDE中断接收不定长数据的问题请教

[复制链接]

该用户从未签到

38

主题

77

帖子

0

蝴蝶豆

高级会员

最后登录
2020-10-9
发表于 2018-9-3 19:48:50 | 显示全部楼层 |阅读模式
这段代码是IDE+DAM接收串口数据的,为什么要先进入接收非空中断后然后才开启DMA传输?不会造成第一个数据丢失吗?
  1. void  BSP_Ser2_ISR_Handler (void)
  2. {
  3.         uint8_t clear=clear;

  4.         FlagStatus idle_status;

  5.         if(USART_GetFlagStatus(USART2, USART_FLAG_RXNE) == SET){
  6.                 USART_ITConfig(USART2, USART_IT_RXNE, DISABLE);
  7.                 Ser2_RXDMA_Init();//开启DMA接收
  8.         }
  9.        
  10.         idle_status = USART_GetFlagStatus(USART2, USART_FLAG_IDLE);
  11.     if (idle_status == SET) {
  12.                 clear = USART2->SR;
  13.                 clear = USART2->DR;
  14.                
  15.                 USART_ITConfig(USART2, USART_IT_IDLE, DISABLE);
  16.                
  17.                 if(Ser2_read_f){
  18.                         BSP_OS_SemPost(&BSP_Ser2RxWait);
  19.                         Ser2_read_cnt = CMD_LEN_MAX - DMA_GetCurrDataCounter(DMA1_Channel6);
  20.                 }
  21.                
  22.                 DMA_Cmd(DMA1_Channel6, DISABLE);
  23.                 DMA_DeInit(DMA1_Channel6);
  24.                 USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);       

  25.     }       
  26.        

  27. }
复制代码


回复

使用道具 举报

该用户从未签到

91

主题

4756

帖子

4

蝴蝶豆

论坛元老

最后登录
2021-2-27
发表于 2018-9-3 23:37:27 | 显示全部楼层
串口实现的3种方式,可以用轮询、中断以及DMA实现,轮询模式为堵塞模式,必须在设定的时间内接收到设定的数据长度才会正确接收;中断模式为非堵塞模式,也是平时用的比较多的,但在HAL库中必须在每次接完之后就要重新开启接收中断,这样在接收不确定长度数据就不好处理;最后发现有一个比较好的方法那就是用串口的空闲中断+DMA实现串口数据的接收,在接收一帧数据只需要中断一次,这样就可以接收不定长数据了

评分

参与人数 1蝴蝶豆 +3 收起 理由
STMCU + 3

查看全部评分

回复 支持 反对

使用道具 举报

该用户从未签到

5

主题

904

帖子

58

蝴蝶豆

论坛元老

最后登录
2021-3-30
发表于 2018-9-6 09:42:03 | 显示全部楼层
假如先開啟DMA傳輸 , 在DMA傳輸過程中 , uart 有 data 進入 , 引起中斷 , 這樣DMA傳輸的 data 有可能會發生錯誤吧

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

回复 支持 反对

使用道具 举报

该用户从未签到

41

主题

2582

帖子

282

蝴蝶豆

论坛元老

最后登录
2021-4-1
发表于 2018-9-6 10:59:33 | 显示全部楼层
初始化串口之后,先打开DMA接收,然后等待串口空闲中断,中断后,关闭DMA接收,取出DMA中的数据,重新打开DMA接收。

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

回复 支持 反对

使用道具 举报

该用户从未签到

74

主题

1442

帖子

194

蝴蝶豆

版主

最后登录
2023-10-26
发表于 2018-9-6 11:27:32 | 显示全部楼层
接收DMA+IDE中断接收不定长数据
首先要明白机制
1、开启DMA传输是将DMA缓存的内容写入到你真正需要的空间里
2、DMA接收一直都有存在的,将Usart接收到的字符系统自动的写到你设定的DMA缓冲区里。
3、IDE中断发送才开启DMA传输,是为下一次传输做准备。
4、当然速度快了是容易丢失或者几个包一起接收,就要看你系统设计偏好了。

评分

参与人数 1蝴蝶豆 +3 收起 理由
STMCU + 3

查看全部评分

回复 支持 反对

使用道具 举报

该用户从未签到

38

主题

77

帖子

0

蝴蝶豆

高级会员

最后登录
2020-10-9
 楼主| 发表于 2018-9-9 16:33:33 | 显示全部楼层
wolfgang2015 发表于 2018-9-6 11:27
接收DMA+IDE中断接收不定长数据
首先要明白机制
1、开启DMA传输是将DMA缓存的内容写入到你真正需要的空间里 ...

是RXNE中断开启DMA
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|论坛-意法半导体STM32/STM8技术社区

GMT+8, 2024-3-28 18:07 , Processed in 1.172155 second(s), 36 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表