决定开始在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