1.我们知道DMA可以自动的不在CPU干预下,自动把数据重外设存储到内存(我们这节讲的),内存到外设,内存到内存等。但是DMA接收的是指定长度的,在接收不定长数据的时候DMA就傻眼了。网上有许多方法讲解运用定时器超时检测来接收不定长数据,而我们现在要讲的是运用串口空闲中断+DMA的方式接收不定长数据。
2.我们调试用的是串口1、DMA_Channel_4。具体的配置见下面程序:
DMA接收配置:
void USART1_DMA_Config(void)
{
DMA_InitTypeDef DMA_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE);//开启DMA时钟
DMA_InitStructure.DMA_Channel = DMA_Channel_4;//通道4
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)USART1_DR_Address; //外设地址为[#define USART1_DR_Address (0x40011000+0x04)]
DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)Data_Buffer; //内存地址
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;//外设到内存
DMA_InitStructure.DMA_BufferSize = 65535; //缓冲大小
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//外设地址不增
DMA_InitStructure

本文介绍了如何利用STM32的串口空闲中断结合DMA来接收不定长度的数据。在传统的DMA接收中,由于预设的长度限制,无法直接处理不定长数据。通过串口空闲中断,可以在数据传输完成后触发中断,从而获取实际的数据长度。文章详细讲解了配置串口1和DMA_Channel_4的过程,并提供了在中断中计算数据长度的方法,确保在数据处理过程中不会因为新数据的到来导致错误。读者可以通过串口调试助手进行测试验证。
最低0.47元/天 解锁文章
6600

被折叠的 条评论
为什么被折叠?



