1.双缓冲模式简介
设置DMA_SxCR寄存器的DBM位为1可启动双缓冲传输模式,并自动激活循环模式,所以设置普通模式或者循环模式都可以。
双缓冲不应用与存储器到存储器的传输。可以应用在从存储器到外设或者外设到存储器。
双缓冲模式下, 两个存储器地址指针都有效,即DMA_SxM1AR寄存器将被激活使用。开始传输使用DMA_SxM0AR寄存器的地址指针所对应的存储区, 当这个存储区数据传输完DMA控制器会自动切换至DMA_SxM1AR寄存器的地址指针所对应的另一块存储区, 如果这一块也传输完成就再切换至DMA_SxM0AR寄存器的地址指针所对应的存储区,这样循环调用。
所以我们需要配置传输完成中断,在中断服务函数中,我们可以获取正在使用哪一个buffer,然后可以去填充另一个buffer的数据。
2.示例
#ifndef __BSP_USART_H
#define __BSP_USART_H
#ifdef __cplusplus
extern "C"{
#endif
#include "stm32f4xx.h"
#include "stdio.h"
#define LOGGER_USART USART1
#define LOGGER_USART_BAUDRATE 115200
#define LOGGER_USART_CLK RCC_APB2Periph_USART1
#define LOGGER_USART_IRQHandler USART1_IRQHandler
#define LOGGER_USART_IRQ USART1_IRQn
#define USART1_TX_PIN GPIO_Pin_9
#define USART1_TX_GPIO_Port GPIOA
#define USART1_TX_GPIO_CLK RCC_AHB1Periph_GPIOA
#define USART1_TX_AF GPIO_AF_USART1
#define USART1_TX_SOURCE GPIO_PinSource9
#define USART1_RX_PIN GPIO_Pin_10
#define USART1_RX_GPIO_Port GPIOA
#define USART1_RX_GPIO_CLK RCC_AHB1Periph_GPIOA
#define USART1_RX_AF GPIO_AF_USART1
#define USART1_RX_SOURCE GPIO_PinSource10
//usart1_tx只能使用到DMA2_Stream7 Channel_4
#define USART1_TX_DMA_STREAM DMA2_Stream7
#define USART1_TX_DMA_CHANNEL DMA_Channel_4
#define USART1_TX_DMA_STREAM_CLK RCC_AHB1Periph_DMA2
#define USART1_TX_DMA_IT_TCIF DMA_IT_TCIF7
#define USART1_TX_DMA_IT_HTIF DMA_IT_HTIF7
#