dma接收双缓存 stm32_STM32的串口DMA收发以及双缓冲区的实现

本文介绍了STM32使用USART1的DMA功能进行串口收发的实现过程,包括RX和TX的DMA初始化、中断配置以及双缓冲区的处理。通过DMA的Circle模式实现循环接收,中断服务函数处理双缓冲区切换,确保大数据量接收的连续性。同时提到了DMA在Normal和Circle模式下的区别,以及在TX DMA中断处理中的注意事项。
摘要由CSDN通过智能技术生成

在使用STM32的UART的DMA功能总结如下:

首先上代码,这里采用STM32 的USART1作为Demo,RX的DMA为DMA1_Channel5,TX的DMA为DMA1_Channel4.初始化如下,红色的标记需要注意:

RX-DMA初始化

1 //DMA Rx

2 USART_DMACmd(USART1,USART_DMAReq_Rx,ENABLE);3 DMA_Cmd(DMA1_Channel5,DISABLE);4 DMA_InitStruct.DMA_PeripheralBaseAddr = (u32)(&USART1->DR);5 DMA_InitStruct.DMA_MemoryBaseAddr =(u32)RxBuf0;6 DMA_InitStruct.DMA_DIR =DMA_DIR_PeripheralSRC;7 DMA_InitStruct.DMA_BufferSize = 10;8 DMA_InitStruct.DMA_PeripheralInc =DMA_PeripheralInc_Disable;9 DMA_InitStruct.DMA_MemoryInc =DMA_MemoryInc_Enable;10 DMA_InitStruct.DMA_PeripheralDataSize =DMA_PeripheralDataSize_HalfWord;11 DMA_InitStruct.DMA_MemoryDataSize =DMA_PeripheralDataSize_Byte;12 DMA_InitStruct.DMA_Mode = DMA_Mode_Circular;13 DMA_InitStruct.DMA_Priority =DMA_Priority_High;14 DMA_InitStruct.DMA_M2M =DMA_M2M_Disable;15 DMA_Init(DMA1_Channel5,&D

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32中,DMA双缓冲模式可以通过配置DMA的通道控制寄存器来实现。下面是一个示例代码,可以帮助你理解如何使用STM32DMA双缓冲模式。 首先,需要定义两个缓冲,用于DMA的读写操作。在本示例中,我们假设缓冲大小为16字节。 ```c #define BUFFER_SIZE 16 uint8_t buffer1[BUFFER_SIZE]; uint8_t buffer2[BUFFER_SIZE]; ``` 然后,需要配置DMA通道的控制寄存器。在本示例中,我们使用DMA1通道1,并启用双缓冲模式。 ```c DMA_HandleTypeDef hdma; hdma.Instance = DMA1_Channel1; hdma.Init.Direction = DMA_PERIPH_TO_MEMORY; hdma.Init.PeriphInc = DMA_PINC_DISABLE; hdma.Init.MemInc = DMA_MINC_ENABLE; hdma.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; hdma.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; hdma.Init.Mode = DMA_CIRCULAR; hdma.Init.Priority = DMA_PRIORITY_HIGH; hdma.Init.FIFOMode = DMA_FIFOMODE_DISABLE; hdma.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL; hdma.Init.MemBurst = DMA_MBURST_SINGLE; hdma.Init.PeriphBurst = DMA_PBURST_SINGLE; HAL_DMA_Init(&hdma); __HAL_DMA_DISABLE(&hdma); hdma.Instance->CR |= DMA_SxCR_DBM; ``` 接下来,需要启动DMA传输。 ```c HAL_DMA_Start(&hdma, (uint32_t)&peripheral_device, (uint32_t)buffer1, BUFFER_SIZE); ``` 在DMA传输期间,当缓冲1已经被填满时,DMA会自动切换到缓冲2进行数据传输。当缓冲2也被填满时,DMA会再次切换回缓冲1。 当需要读取DMA传输的数据时,可以通过检查DMA传输期间使用的缓冲来获取传输的数据。 ```c uint8_t* buffer = (hdma.Instance->CR & DMA_SxCR_CT) ? buffer2 : buffer1; ``` 最后,在传输完成后,需要停止DMA传输并释放DMA通道。 ```c HAL_DMA_Stop(&hdma); HAL_DMA_DeInit(&hdma); ``` 以上就是一个基本的DMA双缓冲模式的示例代码。需要注意的是,在使用DMA双缓冲模式时,需要保证缓冲大小足够大,以避免数据溢出。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值