|
1、在安富莱教程的基础上,设置了DMA通道传输的个数,按照参考手册,先禁止DMA通道,设置后,开启DMA通道
void USART3_DMA_Config(void)
{
/* Deinitialize the stream for new transfer */
HAL_DMA_DeInit(&USART3_DMA_Handle_RX);
USART3_DMA_Init();
//禁止DMA通道
USART3_DMA_RX_STREAM->CR &= 0xFFFFFFFE;
//设置传输个数
USART3_DMA_RX_STREAM->NDTR = BUFFER_MAX_SIZE;
//打开DMA通道
USART3_DMA_RX_STREAM->CR |= 0x01;
USART3_DMA_Handle_RX.Instance = USART3_DMA_RX_STREAM;
/*usart3 rx对应dma1,数据流0*/
USART3_DMA_Handle_RX.Init.Request = DMA_REQUEST_USART3_RX;
/*方向:从外设到内存*/
USART3_DMA_Handle_RX.Init.Direction = DMA_PERIPH_TO_MEMORY;
//外设地址是固定的
USART3_DMA_Handle_RX.Init.PeriphInc = DMA_PINC_DISABLE;
/*内存地址自增*/
USART3_DMA_Handle_RX.Init.MemInc = DMA_MINC_ENABLE;
/*外设数据单位*/
USART3_DMA_Handle_RX.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
/*内存数据单位 8bit*/
USART3_DMA_Handle_RX.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
/*DMA模式:正常模式,单次*/
USART3_DMA_Handle_RX.Init.Mode = DMA_CIRCULAR;
/*优先级:中*/
USART3_DMA_Handle_RX.Init.Priority = DMA_PRIORITY_MEDIUM;
/*使能FIFO*/
USART3_DMA_Handle_RX.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
USART3_DMA_Handle_RX.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL;
/*存储器突发传输 1个节拍*/
USART3_DMA_Handle_RX.Init.MemBurst = DMA_MBURST_SINGLE;
/*外设突发传输 1个节拍*/
USART3_DMA_Handle_RX.Init.PeriphBurst = DMA_PBURST_SINGLE;
/* Configure the DMA stream */
HAL_DMA_Init(&USART3_DMA_Handle_RX);
//设置缓冲区接收的个数
//设置接收设置DMA
__HAL_LINKDMA(&Usart3Handle, hdmarx, USART3_DMA_Handle_RX);
/* Deinitialize the stream for new transfer */
HAL_DMA_DeInit(&USART3_DMA_Handle_TX);
USART3_DMA_Handle_TX.Instance = USART3_DMA_TX_STREAM;
/*usart1 rx对应dma1,数据流2*/
USART3_DMA_Handle_TX.Init.Request = DMA_REQUEST_USART3_TX;
/*方向:从外设到内存*/
USART3_DMA_Handle_TX.Init.Direction = DMA_MEMORY_TO_PERIPH;
//外设地址是固定的
USART3_DMA_Handle_TX.Init.PeriphInc = DMA_PINC_DISABLE;
/*内存地址自增*/
USART3_DMA_Handle_TX.Init.MemInc = DMA_MINC_ENABLE;
/*外设数据单位*/
USART3_DMA_Handle_TX.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
/*内存数据单位 8bit*/
USART3_DMA_Handle_TX.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
/*DMA模式:正常模式,单次*/
USART3_DMA_Handle_TX.Init.Mode = DMA_NORMAL;
/*优先级:中*/
USART3_DMA_Handle_TX.Init.Priority = DMA_PRIORITY_MEDIUM;
/*使能FIFO*/
USART3_DMA_Handle_TX.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
USART3_DMA_Handle_TX.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL;
/*存储器突发传输 1个节拍*/
USART3_DMA_Handle_TX.Init.MemBurst = DMA_MBURST_SINGLE;
/*外设突发传输 1个节拍*/
USART3_DMA_Handle_TX.Init.PeriphBurst = DMA_PBURST_SINGLE;
/* Configure the DMA stream */
HAL_DMA_Init(&USART3_DMA_Handle_TX);
//设置接收设置DMA
__HAL_LINKDMA(&Usart3Handle, hdmatx, USART3_DMA_Handle_TX);
}
2、设置后,在出口空闲中断中查看的传输个数的初始值,还是默认的256
unsigned short cnt = __HAL_DMA_GET_COUNTER(&USART3_DMA_Handle_RX);
|
|