硬石社区

 找回密码
 立即注册
查看: 5700|回复: 3

[STM32F4 & F7] 用DMA来做串口5Mbps接收,怎么做?

[复制链接]

1

主题

3

帖子

486

积分

打杂小鬼

Rank: 1

积分
486
发表于 2019-1-15 11:35:35 | 显示全部楼层 |阅读模式
看网上都是用的串口空闲中断方式来做DMA串口接收,每个字节接收都要进入中断查询,波特率低点还可以,如果传输的数据频率很高,进入中断就过于频繁了。有没有方法,可以使用DMA接收完成设定的数据长度,才进入中断处理数据的?(这样减少中断次数,DMA2_Stream2_IRQHandler函数处理又不对)。
版主有没有方法,求指导


回复

使用道具 举报

370

主题

1323

帖子

16万

积分

传说中的管理员

Rank: 25Rank: 25Rank: 25Rank: 25Rank: 25Rank: 25Rank: 25Rank: 25Rank: 25Rank: 25Rank: 25Rank: 25Rank: 25Rank: 25Rank: 25Rank: 25Rank: 25Rank: 25Rank: 25Rank: 25Rank: 25Rank: 25Rank: 25Rank: 25Rank: 25

积分
165022
QQ
发表于 2019-1-15 21:35:12 | 显示全部楼层
DMA有传输完成中断TC,就是类似DMA2_Stream2_IRQHandler函数,,估计是你程序没处理对而已吧,理论上就是这样的。
你可以先把你现在的程序波特率调低一些测试,波特率低的可以了,再搞波特率高的。
回复 支持 反对

使用道具 举报

1

主题

3

帖子

486

积分

打杂小鬼

Rank: 1

积分
486
 楼主| 发表于 2019-1-16 10:26:15 | 显示全部楼层
仔细阅读了HAL_UART_Receive_DMA函数,里面有条语句指明了回调函数huart->hdmarx->XferCpltCallback = UART_DMAReceiveCplt;
UART_DMAReceiveCplt最终就是串口接收完成回调函数void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)

我的串口TX RX都是用的DMA,TX是Normal,RX是Circular,下面是我的处理函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
        //方法一
        memset(aTxBuffer,0,DMABUFF_SIZE);
        memcpy(aTxBuffer,aRxBuffer,DMABUFF_SIZE);
        HAL_UART_Transmit_DMA(huart,aTxBuffer, DMABUFF_SIZE);
        memset(aRxBuffer,0,DMABUFF_SIZE);

        //方法二
        /*memset(aTxBuffer,0,DMABUFF_SIZE);
        memcpy(aTxBuffer,aRxBuffer,DMABUFF_SIZE);
        HAL_UART_Transmit(huart,aTxBuffer,DMABUFF_SIZE,0x0FFF);
        memset(aRxBuffer,0,DMABUFF_SIZE);*/
}
方法一用DMA回传至上位机,只能传回一次数据。方法二用串口传输函数回传,上位机发一次,回传一次,是正常的。
高手能给我解惑一下吗,为什么方法一后面就不能回传了?
回复 支持 反对

使用道具 举报

1

主题

3

帖子

486

积分

打杂小鬼

Rank: 1

积分
486
 楼主| 发表于 2019-1-16 10:38:51 | 显示全部楼层
自己解决了,必须要在CubeMX里将Uart1的全局中断打开,才能使用方法一
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|手机版|小黑屋|Comsenz Inc. ( 粤ICP备16080364号

GMT+8, 2022-11-27 22:46 , Processed in 0.059439 second(s), 27 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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