lfldalong 发表于 2022-3-31 16:29:49

串口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);



lfldalong 发表于 2022-3-31 17:20:25

串口DMA设置通道设置串口传输的数据不个数成功,标题写的有问题

eric2013 发表于 2022-4-1 10:41:16

配置阶段,建议全部HAL配置。

下面这些都有对应的函数和参数成员。

      //禁止DMA通道
      USART3_DMA_RX_STREAM->CR &=0xFFFFFFFE;
      //设置传输个数
      USART3_DMA_RX_STREAM->NDTR = BUFFER_MAX_SIZE;
       //打开DMA通道
      USART3_DMA_RX_STREAM->CR |= 0x01;
页: [1]
查看完整版本: 串口DMA设置通道设置串口传输的数据不成功