串口DMA设置通道设置串口传输的数据不成功
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 shortcnt = __HAL_DMA_GET_COUNTER(&USART3_DMA_Handle_RX);
串口DMA设置通道设置串口传输的数据不个数成功,标题写的有问题 配置阶段,建议全部HAL配置。
下面这些都有对应的函数和参数成员。
//禁止DMA通道
USART3_DMA_RX_STREAM->CR &=0xFFFFFFFE;
//设置传输个数
USART3_DMA_RX_STREAM->NDTR = BUFFER_MAX_SIZE;
//打开DMA通道
USART3_DMA_RX_STREAM->CR |= 0x01;
页:
[1]