STM32F407 使用USART+DMA方式有些小问题

2019-07-20 19:00发布

本来最近在学习STM32F407 使用USART+DMA方式接收数据。思路如下: 利用USART3的空闲中断,获取USART接收到的数据个数。

USART3配置:空闲中断 DMA配置:数据传输完成中断
现在出现的问题是:
进入USART空闲中断后: if(USART_GetITStatus(USART3, USART_IT_IDLE) != RESET) {  USART_ClearITPendingBit(USART3,USART_IT_IDLE); DMA_Cmd(DMA1_Stream1, DISABLE); //关闭DMA,防止处理其间有数据 USART_ITConfig(USART3,USART_IT_IDLE,DISABLE); //关闭串口空闲中断                 DATA_LEN = MaxBufLength - DMA_GetCurrDataCounter(DMA1_Stream1);  //获取剩余长度 if(DATA_LEN > 0) { //接收到了数据的 Usart3.len = DATA_LEN; USART3_RxOneFrameFlag = 1; USART3_ProcessIRQSrc(); } DMA1_Stream1->NDTR =512; //重装填 DMA1_Stream1->M0AR = (uint32_t)USART3_RECEIVE_DATA; USART_ITConfig(USART3,USART_IT_IDLE,ENABLE); //使能串口空闲中断 //读SR后读DR清除Idle i = USART3->SR; i = USART3->DR; DMA_Cmd(DMA1_Stream1, ENABLE); //处理完,重开DMA } DMA的Buf设置为512,USART3接收的数据为10个。
当USART3中断执行完后,又进入了DMA中断,不知道是怎么进来的,而且我也测试过,进入的是数据传输完成中断。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
11条回答
simplelifeNick
1楼-- · 2019-07-21 13:11
 精彩回答 2  元偷偷看……
尼泊尔123
2楼-- · 2019-07-21 13:32
回复【7楼】simplelifeNick:
---------------------------------
谢谢回复啊!  不用开启流控,也不用硬件连接流控引脚 是吧?还想咨询一下,这个接收空闲,是多长时间空闲?只是RX引脚空闲会产生中断?如果DMA发送过程中RX接收空闲了,会产生空闲中断吗?  问的有点多,还望回复!非常感谢!
hhlh2l
3楼-- · 2019-07-21 18:42
回复【9楼】尼泊尔123:
---------------------------------
1,无需流控制相关内容;
2,按手册是3.5个字符的时间以后没有数据为空闲,我也没有具体测试;
3,STM32串口是双工的,这个空闲时指的是串口的接收的空闲,与发送和DMA无关。我的串口接收例程中用的中断都是串口本身的,没有使用DMA中断,DMA只负责传输,不产生中断。
4,这样的方式是解决串口无固定数据长度接收的问题,且你接收的数据是需要一个断点,及需要给串口一个判断是否出现空闲的机会,对于那种循环往复不停传输的场合不适用。一般发送的数据我们都是知道数据长度的,直接配置DMA按长度传送,完成后DMA中断就行。
另,我的串口通讯协议是modbus。通讯最好有协议,可以更具协议来确定数据传输方式。如何你接收的数据都是等长的,不用这么复杂,配DMA按固定长度接收就行,接收完成后DMA中断。
simplelifeNick
4楼-- · 2019-07-22 00:39
回复【9楼】尼泊尔123:
---------------------------------
貌似芯片检测的是 rx脚接收数据   这个阈值时间和波特率有关  
当大于1个字节的时间没有收到数据就认为空闲了  所以另一端发送最好是DMA可以连续不断  
用CPU的话如果中间打断一下  你这边可能就进入空闲终端了
rewpron321
5楼-- · 2019-07-22 05:35
 精彩回答 2  元偷偷看……

一周热门 更多>