STM32串口空闲中断加DMA传输不定长数据

本文介绍了如何使用STM32的串口空闲中断结合DMA来接收不定长度的数据,以减轻CPU负担。通过开启串口DMA接收,在串口空闲中断时计算已接收数据长度,并进行解码处理,为多模块数据传输提供高效解决方案。文中还分享了代码实现及调试过程中遇到的问题和解决经验。
摘要由CSDN通过智能技术生成

决定开始在CSDN上记录学习单片机的过程了

想讲讲我对串口空闲中断加DMA的理解

1.DMA传输的好处

一般的数据通过串口传输都会经过CPU的读取 当模块多起来(比如五六个激光测距模块读取再加上MPU的解算)CPU会负荷过重而致使程序卡顿造成干扰  

而DMA可以当成传输数据的桥梁 (介于外设到存储器 /存储器到外设 /存储器到存储器 )

桥梁的作用是自身开辟一个通道使数据传输无需经过CPU从而减少CPU消耗

2.串口空闲中断

串口空闲中断顾名思义 在串口空闲时(发完一帧数据)产生中断

3.串口空闲中断加DMA接受不定长度数据过程

  • 0、开启串口DMA接收
  • 1、串口收到数据,DMA不断传输数据到存储buf(在DMA配置了外设地址与存储器地址,如果是外设到存储器,则这个存储buf就是存储器地址)
  • 2、一帧数据发送完毕,串口暂时空闲,触发串口空闲中断
  • 3、在中断服务函数中,可以计算刚才收到了多少个字节的数据(收到字节长度  =  DMA设定的数据接受量-DMA_GetCurrDataCounter(dma中剩余长度))
  • 4、解码存储buf,清除标志位,开始下一帧接收

 

unsigned char ucRxFinish=0;
unsigned char ucRxData[100];
int uiData;
u8 usart6_rx_buf[DMA_REC_LEN] = {0};
u8 dma_rec_buff[DMA_REC_LEN] = {0};
u16 uart6_rec_cnt = 0;                                                                            //串口接收数据长度
 
u8 data_backup[DMA_REC_LEN] = {0};                                                     //数据备份
_Bool receiveOK_flag = 0;                                                                        //接收完成标志位

//DMAx的各通道配置
//这里的传输形式是固定的,这点要根据不同的情况来修改
//从存储器->外设模式/8位数据宽度/存储器增量模式
//DMA_Streamx:DMA数据流,DMA1_Stream0~7/DMA2_Stream0~7
//chx:DMA通道选择,@ref DMA_channel DMA_Channel_0~DMA_Channel_7 

void MYDMA_Config(DMA_Stream_T

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值