STM32-高速串口,基于DMA的空闲中断

本文介绍了在STM32中,为处理高速串口数据接收,采用DMA结合空闲中断(IDLE)的方法来确保数据帧的完整性。传统DMA中断可能因数据切割问题而无法满足要求,通过检测串口空闲状态,可以精确地在数据帧结束时触发中断,从而实现高效的数据拼接和处理。示例代码展示了如何在中断服务函数中实现该机制。
摘要由CSDN通过智能技术生成

STM32发送,接收说明

串口接收数据的方式,有两种,
1,poll
2,int

中断又分为一次接收一个数据,和DMA一次接收多个数据。
考虑到数据的高速情况,我们这里当然是选择DMA了,

但是DMA有一个不好的点就是中断触发机制,要么是half,要么是接收完毕,
那么就有一个很难受的问题,一帧数据,基本上会被切断,所以对于那些对帧的完整性有较高要求的场景,DMA的这种中断就很难使用。

常用的解决办法就是实现一个判空机制,判断上一次中断和当前时间是否timeout,如果timeout,就认为一帧结束,把DMA的数据获取并拼包之后使用。

但是这个办法没办法准确判定timeout的时间,因为poll的时间差,或者是帧与帧时间的时间差,导致很难判定成功。

这个时候,STM32的一个牛掰的机制就来了,中断有一个IDLE中断源,就是串口进入空闲时,触发一个中断。那DMA+IDLE结合, 就可以很完美的实现快速接受和帧数据分离。

下面是代码

void UsartReceive_IDLE(UART_HandleTypeDef *huart)
{
stuUartRevFifo *revinfo;
for(int32_t i = 0 ; i < ZQ_UARTINFO_COUNT ; i ++)
{
if(huart == sg_uartRevFifoBuff[i].uart && sg_uartRev

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值