DMA计算接收长度和发送中断的用法

2019-07-20 17:15发布

已实现阻塞的发送接收,非阻塞的接收中断。现在实现UART的DMA数据传送,已实现定长数据接收,并用阻塞式发送出来;但是用非阻塞式中断接收的方式计算长度,目前没有调通,就是DMA接收1个数据,再在回调函数中把数据放入另一个数组并计算长度并再开启DMA接收。  
问题一:DMA中断如何算出计算的长度     难道是DMA的原理不允许一个一个的发送吗?百度上的帖子说过DMA中断相比uart中断次数少
问题二:DMA或者transmit_IT发送中断怎么用,不能理解   比如 发送中断是在while(1)前调用一次,再在callback中继续调用;当板子接收到数据时,从第一个receive_IT进入,并在回调函数中再次调用;那发送中断就是用transmit_IT发送一个数据时进入中断处理函数;写在这里好像明白点了;那么发送时在中断函数里做些什么好呢,大家举个实例好吗?比如接收中断里是接收数据到指定的数组并计算长度。

大家给下思路,谢谢啦!(前面轮询和接收中断都发帖了 ,没人理,一个是没多少其他板子经验,就用过MSP432和STM32F7 都是新板子  第一次接触cube和HAL  学了一周了)  大家给下思路 ,我继续在板子上下程序  看效果  搞通为止    PS:用到了UART  DMA  RS485
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
7条回答
阿拓
1楼-- · 2019-07-20 20:02
目前我用的是 串口接收DMA + 空闲中断 接收数据。seri_count 就是接收到的数据长度
        if(USART_GetITStatus(USART1, USART_IT_IDLE) != RESET)
         {
           DMA_Cmd(DMA2_Stream2,DISABLE);
                 seri_count = USART1->SR;
                 seri_count = USART1->DR;   //clear
           seri_count = 100 -  DMA_GetCurrDataCounter(DMA2_Stream2);     // get data count         
                 USART1_Receive_flag = true;         
         }
       
xuande
2楼-- · 2019-07-21 01:40

我也算老司机了,
但LZ说的话让我晕,基本听不懂。


xuande
3楼-- · 2019-07-21 03:05
 精彩回答 2  元偷偷看……
K.O.Carnivist
4楼-- · 2019-07-21 03:15
本帖最后由 K.O.Carnivist 于 2017-1-20 09:49 编辑

"已实现阻塞的发送接收,非阻塞的接收中断。
现在实现UART的DMA数据传送,
已实现定长数据接收,并用阻塞式发送出来;
但是用非阻塞式中断接收的方式计算长度,目前没有调通,"

"就是DMA接收1个数据,再在回调函数中把数据放入另一个数组并计算长度并再开启DMA接收。 "
再在哪个回调函数中计算谁的长度?

"问题一:DMA中断如何算出计算的长度"
同上,谁的长度?

"难道是DMA的原理不允许一个一个的发送吗?百度上的帖子说过DMA中断相比uart中断次数少"
什么是你期望的“一个一个发送”?

"问题二:DMA或者transmit_IT发送中断怎么用,不能理解"
"比如发送中断是在while(1)前调用一次,再在callback中继续调用;当板子接收到数据时,从第一个receive_IT进入,并在回调函数中再次调用;"
发送中断被调用是什么意思?一般来说中断服务函数被事件触发这种说法吧。

"那发送中断就是用transmit_IT发送一个数据时进入中断处理函数;写在这里好像明白点了;"
呃所以刚才发送中断被调用指的是以中断方式发送的这个transmit_IT被调用吗?

"那么发送时在中断函数里做些什么好呢,大家举个实例好吗?比如接收中断里是接收数据到指定的数组并计算长度。"
发送中断是在允许写下一个发送数据的时候触发的,就是当需要连续发送多个数据时,在这个中断服务里面可以写下一个数据了。
K.O.Carnivist
5楼-- · 2019-07-21 08:19
xuande 发表于 2017-1-19 17:12
阻塞、非阻塞是什么意思?  Verilog语言里才有这概念。
还有,回调函数。

阻塞IO/非阻塞IO就是传输完成后返回/传输开始后返回其他任务啊
回调函数就是下层库文件反过来调用上层应用程序的函数啊
楼主虽然写的话不是很明白……但这两个词用的还是对的啊……
为我的心
6楼-- · 2019-07-21 14:07
题目的确不大清楚,因为懂得很少,概念还没拉通,那我再研究研究,希望今天能做出来,目标是DMA串口空闲中断,之前main.c中开启HAL_UART_Receive_IT(UART,RXBUFF,1)函数,每次收一个数据,然后再HAL_UART_RxCpltCallback中计算长度并将接收的数据放入自己的数组,用OD OA来判断接收是否结束,函数内 HAL_UART_Receive_IT(UART,RXBUFF,1)。也就是有数据来就重复进入中断,接收中断就做好了。之前还有书上例程中        HAL_Delay(100); if((rxlen==(RS485_RX_CNT)) && rxlen ) 这两句不知道大家见过没,IRQHandler和read_data两个函数拿来参考 数据老是不对,各种BUG。昨天开始研究DMA,也想用接收中断的方式移植到DMA中,不过不行,设置固定长度能接收并回显,但这不能计算长度。今天早上有一思路,因为本来要用空闲中断的,二楼也提了一下,就打算DMA接收使用定长,收完后产生空闲中断计算长度。 待会儿再见!

一周热门 更多>