硬汉嵌入式论坛

 找回密码
 立即注册
查看: 3569|回复: 1
收起左侧

[客户分享] F4的串口接收,利用DMA和空闲中断,与F1有区别,有坑。

[复制链接]

335

主题

2040

回帖

3050

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3050
发表于 2019-9-5 11:22:59 | 显示全部楼层 |阅读模式
今天在一个老项目上尝试更新串口接收的方式,从接收中断方式更改为空闲中断方式。

首先,参考了论坛的帖子:分享基于F103单片机的串口空闲中断+DMA实现数据不定长接收以及DMA发送
但是,出现了几个问题:
第一,初始化串口阶段,使用USART_ClearFlag(USART1, USART_FLAG_IDLE);时出现了死循环。我不理解,望大侠们指点一下?

第二,空闲中断函数中,只能第一次接收数据帧成功。然后重置DMA计数器始终不成功,第二次接收数据帧失败。数据长度远小于缓冲区。
代码如下:  
  1. DMA_Cmd(USART1_RX_DMA_STREAM,DISABLE);  /* 接收DMA复位 */
  2. USART1_RX_DMA_STREAM->NDTR=128;
  3. DMA_Cmd(USART1_RX_DMA_STREAM,ENABLE);
复制代码
如果在第二行增加一句 DMA_ClearFlag(USART1_RX_DMA_STREAM,USART1_RX_DMA_FLAG_TCIF); 则可以成功复位DMA计数器。
查找参考手册,发现这里有一种解释。 外设到存储器的完成判断比较特别:
Snipaste_2019-09-05_11-21-35.png
不知道理解是否有误,请各位帮忙分析一下子。




回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107116
QQ
发表于 2019-9-5 11:28:49 | 显示全部楼层
可以参考我这个修正

基于V6的CMSIS-Driver串口应用,支持8串口DMA不定长收发,比CubeMX还要省事
http://www.armbbs.cn/forum.php?m ... 3714&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-18 13:41 , Processed in 0.152527 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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