Tanxiaoli 发表于 2023-10-23 14:13:23

STM32F407配置DMA问题

本人在一直STM32F407时配置了DMA用来实现USART1收发数据,在裸机状态下DMA配置收发都没有问题,加入了操作系统FreeRTOS导致DMA没办法接收数据,仿真发现DMA错误标志被置位。现在不知道问题出现在哪里?

eric2013 发表于 2023-10-23 14:58:45

描述信息太少,贴必要的代码。

Tanxiaoli 发表于 2023-10-23 17:05:06

感谢硬汉哥的回复,以下是配置代码:
#define DEBUG_COM_PORT          USART1
#define DEBUG_IRQ               USART1_IRQn
#define DEBUG_IRQHandler      USART1_IRQHandler
#define DEBUG_DMA_PORT          DMA2
#define DEBUG_DMA_RX_CH         LL_DMA_CHANNEL_4
#define DEBUG_DMA_RX_STREAM   LL_DMA_STREAM_5
#define DEBUG_DMA_TX_CH         LL_DMA_CHANNEL_4
#define DEBUG_DMA_TX_STREAM   LL_DMA_STREAM_7
#define DEBUG_DMA_IRQ         DMA2_Stream5_IRQn
#define DEBUG_DMA_IRQHandler    DMA2_Stream5_IRQHandler

/**
* @brief 调试串口初始化
* @parambound            波特率
*/
void debug_com_init(uint32_t bound)
{
    LL_USART_InitTypeDef USART_InitStruct;
    gpio_af_conf(Debug_TX_GPIO_Port, LL_GPIO_AF_7, LL_GPIO_MODE_ALTERNATE, LL_GPIO_PULL_NO, LL_GPIO_SPEED_FREQ_VERY_HIGH, LL_GPIO_OUTPUT_PUSHPULL, Debug_TX_Pin);
    gpio_af_conf(Debug_RX_GPIO_Port, LL_GPIO_AF_7, LL_GPIO_MODE_ALTERNATE, LL_GPIO_PULL_NO, LL_GPIO_SPEED_FREQ_VERY_HIGH, LL_GPIO_OUTPUT_PUSHPULL, Debug_RX_Pin);

    LL_USART_DeInit(DEBUG_COM_PORT);
    /* USER CODE END USART1_Init 1 */
    USART_InitStruct.BaudRate = bound;
    USART_InitStruct.DataWidth = LL_USART_DATAWIDTH_8B;
    USART_InitStruct.StopBits = LL_USART_STOPBITS_1;
    USART_InitStruct.Parity = LL_USART_PARITY_NONE;
    USART_InitStruct.TransferDirection = LL_USART_DIRECTION_TX_RX;
    USART_InitStruct.HardwareFlowControl = LL_USART_HWCONTROL_NONE;
    USART_InitStruct.OverSampling = LL_USART_OVERSAMPLING_16;
    LL_USART_Init(DEBUG_COM_PORT, &USART_InitStruct);
   
    LL_USART_ConfigAsyncMode(DEBUG_COM_PORT);
    LL_USART_SetTransferDirection(DEBUG_COM_PORT, LL_USART_DIRECTION_TX_RX); // 使能发送和接收
    //LL_USART_EnableIT_RXNE(DEBUG_COM_PORT);                                  // 使能接收中断
    LL_USART_EnableIT_IDLE(DEBUG_COM_PORT);                                  // 使能空闲中断
   
    LL_USART_ClearFlag_TC(DEBUG_COM_PORT);                                 // 清除发送完成标志
    //LL_USART_ClearFlag_RXNE(DEBUG_COM_PORT);
    LL_USART_ClearFlag_IDLE(DEBUG_COM_PORT);
   

    HAL_NVIC_SetPriority(DEBUG_IRQ, 0, 0);
    HAL_NVIC_EnableIRQ(DEBUG_IRQ);
   
    debug_dma_init();//打开DMA
    LL_USART_EnableDMAReq_TX(DEBUG_COM_PORT);//使能DMA发送
    LL_USART_EnableDMAReq_RX(DEBUG_COM_PORT);//使能DMA接收
    LL_USART_Enable(DEBUG_COM_PORT);
   
}

void debug_dma_init(void)
{
    LL_DMA_InitTypeDef debug_dma;
    /** DMA Tx Config */
    LL_DMA_DeInit(DEBUG_DMA_PORT,DEBUG_DMA_TX_STREAM);
    debug_dma.Channel = DEBUG_DMA_TX_CH;                            //DMA通道
    debug_dma.Direction = LL_DMA_DIRECTION_MEMORY_TO_PERIPH;      //DMA传输方向
    //FIFO配置
    debug_dma.FIFOMode = LL_DMA_FIFOMODE_DISABLE;                   //FIFO
    debug_dma.FIFOThreshold = LL_DMA_FIFOTHRESHOLD_FULL;            //FIFO阀值
    //内存配置
    debug_dma.MemBurst = LL_DMA_MBURST_SINGLE;                      //内存突发传输配置
    debug_dma.MemoryOrM2MDstAddress = (uint32_t)pDebug.Data;      //内存地址
    debug_dma.MemoryOrM2MDstDataSize = LL_DMA_MDATAALIGN_BYTE;      //内存地址大小,byte short int
    debug_dma.MemoryOrM2MDstIncMode = LL_DMA_MEMORY_INCREMENT;      //内存地址是否自增
    //外设配置
    debug_dma.PeriphBurst = LL_DMA_PBURST_SINGLE;                   //外设突发传输配置
    debug_dma.PeriphOrM2MSrcAddress = (uint32_t)&DEBUG_COM_PORT->DR;//外设地址
    debug_dma.PeriphOrM2MSrcDataSize = LL_DMA_PDATAALIGN_BYTE;      //内存地址大小
    debug_dma.PeriphOrM2MSrcIncMode = LL_DMA_PERIPH_NOINCREMENT;    //内存地址是否自增
    //模式配置
    debug_dma.Mode = LL_DMA_MODE_NORMAL;                            //DMA模式
    debug_dma.NbData = USART_MAX_LEN;                               //DMA传输最大数量
    debug_dma.Priority = LL_DMA_PRIORITY_LOW;                  //DMA优先级
    LL_DMA_Init(DEBUG_DMA_PORT,DEBUG_DMA_TX_STREAM,&debug_dma);   //DMA初始化
    /** DMA Tx Config End*/
   
    /** DMA Rx Config */
    LL_DMA_DeInit(DEBUG_DMA_PORT,DEBUG_DMA_RX_STREAM);
    debug_dma.Channel = DEBUG_DMA_RX_CH;                            //DMA通道
    debug_dma.Direction = LL_DMA_DIRECTION_PERIPH_TO_MEMORY;      //DMA传输方向
    //FIFO配置
    debug_dma.FIFOMode = LL_DMA_FIFOMODE_DISABLE;                  //FIFO
    debug_dma.FIFOThreshold = LL_DMA_FIFOTHRESHOLD_FULL;            //FIFO阀值
    //内存配置
    debug_dma.MemBurst = LL_DMA_MBURST_SINGLE;                      //内存突发传输配置
    debug_dma.MemoryOrM2MDstAddress = (uint32_t)pDebug.Data;      //内存地址
    debug_dma.MemoryOrM2MDstDataSize = LL_DMA_MDATAALIGN_BYTE;      //内存地址大小,byte short int
    debug_dma.MemoryOrM2MDstIncMode = LL_DMA_MEMORY_INCREMENT;      //内存地址是否自增
    //外设配置
    debug_dma.PeriphBurst = LL_DMA_PBURST_SINGLE;                   //外设突发传输配置
    debug_dma.PeriphOrM2MSrcAddress = (uint32_t)&DEBUG_COM_PORT->DR;//外设地址
    debug_dma.PeriphOrM2MSrcDataSize = LL_DMA_PDATAALIGN_BYTE;      //内存地址大小
    debug_dma.PeriphOrM2MSrcIncMode = LL_DMA_PERIPH_NOINCREMENT;    //内存地址是否自增
    //模式配置
    debug_dma.Mode = LL_DMA_MODE_NORMAL;                            //DMA模式
    debug_dma.NbData = USART_MAX_LEN;                               //DMA传输最大数量
    debug_dma.Priority = LL_DMA_PRIORITY_LOW;                  //DMA优先级
    LL_DMA_Init(DEBUG_DMA_PORT,DEBUG_DMA_RX_STREAM,&debug_dma);   //DMA初始化
   
    HAL_NVIC_SetPriority(UHF_DMA_IRQ, 1, 0);
    HAL_NVIC_EnableIRQ(UHF_DMA_IRQ);
   
    LL_DMA_EnableStream(DEBUG_DMA_PORT,DEBUG_DMA_RX_STREAM);
    /** DMA Rx Config End*/
}

/**
* @brief 调试中断函数
*/
void DEBUG_IRQHandler(void)
{
    xHigherPriorityTaskWoken = pdTRUE;
    if (LL_USART_IsActiveFlag_RXNE(DEBUG_COM_PORT) == SET)
    {
//      LL_USART_ClearFlag_RXNE(DEBUG_COM_PORT);
//      pDebug.Data = LL_USART_ReceiveData8(DEBUG_COM_PORT);
//      pDebug.Len++;
//      if (pDebug.Len > USART_MAX_LEN)
//            pDebug.Len = 0;
    }
    if (LL_USART_IsActiveFlag_IDLE(DEBUG_COM_PORT) == SET)
    {
      LL_USART_ClearFlag_IDLE(DEBUG_COM_PORT);
      LL_USART_ReceiveData8(DEBUG_COM_PORT);
      LL_DMA_DisableStream(DEBUG_DMA_PORT,DEBUG_DMA_RX_STREAM);
      pDebug.Len = USART_MAX_LEN - LL_DMA_GetDataLength(DEBUG_DMA_PORT,DEBUG_DMA_RX_STREAM);
      LL_DMA_SetDataLength(DEBUG_DMA_PORT,DEBUG_DMA_RX_STREAM,USART_MAX_LEN);
      LL_DMA_ClearFlag_TC5(DEBUG_DMA_PORT);
      LL_DMA_EnableStream(DEBUG_DMA_PORT,DEBUG_DMA_RX_STREAM);
      pDebug.Flag = ENABLE;
      /** 通知任务处理数据 */
      xTaskNotifyFromISR(DebugTask_Handler, 1, eSetValueWithoutOverwrite, &xHigherPriorityTaskWoken);
    }
}

Tanxiaoli 发表于 2023-10-23 17:06:20

#define DEBUG_COM_PORT          USART1
#define DEBUG_IRQ               USART1_IRQn
#define DEBUG_IRQHandler      USART1_IRQHandler
#define DEBUG_DMA_PORT          DMA2
#define DEBUG_DMA_RX_CH         LL_DMA_CHANNEL_4
#define DEBUG_DMA_RX_STREAM   LL_DMA_STREAM_5
#define DEBUG_DMA_TX_CH         LL_DMA_CHANNEL_4
#define DEBUG_DMA_TX_STREAM   LL_DMA_STREAM_7
#define DEBUG_DMA_IRQ         DMA2_Stream5_IRQn
#define DEBUG_DMA_IRQHandler    DMA2_Stream5_IRQHandler

/**
* @brief 调试串口初始化
* @parambound            波特率
*/
void debug_com_init(uint32_t bound)
{
    LL_USART_InitTypeDef USART_InitStruct;
    gpio_af_conf(Debug_TX_GPIO_Port, LL_GPIO_AF_7, LL_GPIO_MODE_ALTERNATE, LL_GPIO_PULL_NO, LL_GPIO_SPEED_FREQ_VERY_HIGH, LL_GPIO_OUTPUT_PUSHPULL, Debug_TX_Pin);
    gpio_af_conf(Debug_RX_GPIO_Port, LL_GPIO_AF_7, LL_GPIO_MODE_ALTERNATE, LL_GPIO_PULL_NO, LL_GPIO_SPEED_FREQ_VERY_HIGH, LL_GPIO_OUTPUT_PUSHPULL, Debug_RX_Pin);

    LL_USART_DeInit(DEBUG_COM_PORT);
    /* USER CODE END USART1_Init 1 */
    USART_InitStruct.BaudRate = bound;
    USART_InitStruct.DataWidth = LL_USART_DATAWIDTH_8B;
    USART_InitStruct.StopBits = LL_USART_STOPBITS_1;
    USART_InitStruct.Parity = LL_USART_PARITY_NONE;
    USART_InitStruct.TransferDirection = LL_USART_DIRECTION_TX_RX;
    USART_InitStruct.HardwareFlowControl = LL_USART_HWCONTROL_NONE;
    USART_InitStruct.OverSampling = LL_USART_OVERSAMPLING_16;
    LL_USART_Init(DEBUG_COM_PORT, &USART_InitStruct);
   
    LL_USART_ConfigAsyncMode(DEBUG_COM_PORT);
    LL_USART_SetTransferDirection(DEBUG_COM_PORT, LL_USART_DIRECTION_TX_RX); // 使能发送和接收
    //LL_USART_EnableIT_RXNE(DEBUG_COM_PORT);                                  // 使能接收中断
    LL_USART_EnableIT_IDLE(DEBUG_COM_PORT);                                  // 使能空闲中断
   
    LL_USART_ClearFlag_TC(DEBUG_COM_PORT);                                 // 清除发送完成标志
    //LL_USART_ClearFlag_RXNE(DEBUG_COM_PORT);
    LL_USART_ClearFlag_IDLE(DEBUG_COM_PORT);
   

    HAL_NVIC_SetPriority(DEBUG_IRQ, 0, 0);
    HAL_NVIC_EnableIRQ(DEBUG_IRQ);
   
    debug_dma_init();//打开DMA
    LL_USART_EnableDMAReq_TX(DEBUG_COM_PORT);//使能DMA发送
    LL_USART_EnableDMAReq_RX(DEBUG_COM_PORT);//使能DMA接收
    LL_USART_Enable(DEBUG_COM_PORT);
   
}

void debug_dma_init(void)
{
    LL_DMA_InitTypeDef debug_dma;
    /** DMA Tx Config */
    LL_DMA_DeInit(DEBUG_DMA_PORT,DEBUG_DMA_TX_STREAM);
    debug_dma.Channel = DEBUG_DMA_TX_CH;                            //DMA通道
    debug_dma.Direction = LL_DMA_DIRECTION_MEMORY_TO_PERIPH;      //DMA传输方向
    //FIFO配置
    debug_dma.FIFOMode = LL_DMA_FIFOMODE_DISABLE;                   //FIFO
    debug_dma.FIFOThreshold = LL_DMA_FIFOTHRESHOLD_FULL;            //FIFO阀值
    //内存配置
    debug_dma.MemBurst = LL_DMA_MBURST_SINGLE;                      //内存突发传输配置
    debug_dma.MemoryOrM2MDstAddress = (uint32_t)pDebug.Data;      //内存地址
    debug_dma.MemoryOrM2MDstDataSize = LL_DMA_MDATAALIGN_BYTE;      //内存地址大小,byte short int
    debug_dma.MemoryOrM2MDstIncMode = LL_DMA_MEMORY_INCREMENT;      //内存地址是否自增
    //外设配置
    debug_dma.PeriphBurst = LL_DMA_PBURST_SINGLE;                   //外设突发传输配置
    debug_dma.PeriphOrM2MSrcAddress = (uint32_t)&DEBUG_COM_PORT->DR;//外设地址
    debug_dma.PeriphOrM2MSrcDataSize = LL_DMA_PDATAALIGN_BYTE;      //内存地址大小
    debug_dma.PeriphOrM2MSrcIncMode = LL_DMA_PERIPH_NOINCREMENT;    //内存地址是否自增
    //模式配置
    debug_dma.Mode = LL_DMA_MODE_NORMAL;                            //DMA模式
    debug_dma.NbData = USART_MAX_LEN;                               //DMA传输最大数量
    debug_dma.Priority = LL_DMA_PRIORITY_LOW;                  //DMA优先级
    LL_DMA_Init(DEBUG_DMA_PORT,DEBUG_DMA_TX_STREAM,&debug_dma);   //DMA初始化
    /** DMA Tx Config End*/
   
    /** DMA Rx Config */
    LL_DMA_DeInit(DEBUG_DMA_PORT,DEBUG_DMA_RX_STREAM);
    debug_dma.Channel = DEBUG_DMA_RX_CH;                            //DMA通道
    debug_dma.Direction = LL_DMA_DIRECTION_PERIPH_TO_MEMORY;      //DMA传输方向
    //FIFO配置
    debug_dma.FIFOMode = LL_DMA_FIFOMODE_DISABLE;                  //FIFO
    debug_dma.FIFOThreshold = LL_DMA_FIFOTHRESHOLD_FULL;            //FIFO阀值
    //内存配置
    debug_dma.MemBurst = LL_DMA_MBURST_SINGLE;                      //内存突发传输配置
    debug_dma.MemoryOrM2MDstAddress = (uint32_t)pDebug.Data;      //内存地址
    debug_dma.MemoryOrM2MDstDataSize = LL_DMA_MDATAALIGN_BYTE;      //内存地址大小,byte short int
    debug_dma.MemoryOrM2MDstIncMode = LL_DMA_MEMORY_INCREMENT;      //内存地址是否自增
    //外设配置
    debug_dma.PeriphBurst = LL_DMA_PBURST_SINGLE;                   //外设突发传输配置
    debug_dma.PeriphOrM2MSrcAddress = (uint32_t)&DEBUG_COM_PORT->DR;//外设地址
    debug_dma.PeriphOrM2MSrcDataSize = LL_DMA_PDATAALIGN_BYTE;      //内存地址大小
    debug_dma.PeriphOrM2MSrcIncMode = LL_DMA_PERIPH_NOINCREMENT;    //内存地址是否自增
    //模式配置
    debug_dma.Mode = LL_DMA_MODE_NORMAL;                            //DMA模式
    debug_dma.NbData = USART_MAX_LEN;                               //DMA传输最大数量
    debug_dma.Priority = LL_DMA_PRIORITY_LOW;                  //DMA优先级
    LL_DMA_Init(DEBUG_DMA_PORT,DEBUG_DMA_RX_STREAM,&debug_dma);   //DMA初始化
   
    HAL_NVIC_SetPriority(UHF_DMA_IRQ, 1, 0);
    HAL_NVIC_EnableIRQ(UHF_DMA_IRQ);
   
    LL_DMA_EnableStream(DEBUG_DMA_PORT,DEBUG_DMA_RX_STREAM);
    /** DMA Rx Config End*/
}
/**
* @brief 调试中断函数
*/
void DEBUG_IRQHandler(void)
{
    xHigherPriorityTaskWoken = pdTRUE;
    if (LL_USART_IsActiveFlag_RXNE(DEBUG_COM_PORT) == SET)
    {
//      LL_USART_ClearFlag_RXNE(DEBUG_COM_PORT);
//      pDebug.Data = LL_USART_ReceiveData8(DEBUG_COM_PORT);
//      pDebug.Len++;
//      if (pDebug.Len > USART_MAX_LEN)
//            pDebug.Len = 0;
    }
    if (LL_USART_IsActiveFlag_IDLE(DEBUG_COM_PORT) == SET)
    {
      LL_USART_ClearFlag_IDLE(DEBUG_COM_PORT);
      LL_USART_ReceiveData8(DEBUG_COM_PORT);
      LL_DMA_DisableStream(DEBUG_DMA_PORT,DEBUG_DMA_RX_STREAM);
      pDebug.Len = USART_MAX_LEN - LL_DMA_GetDataLength(DEBUG_DMA_PORT,DEBUG_DMA_RX_STREAM);
      LL_DMA_SetDataLength(DEBUG_DMA_PORT,DEBUG_DMA_RX_STREAM,USART_MAX_LEN);
      LL_DMA_ClearFlag_TC5(DEBUG_DMA_PORT);
      LL_DMA_EnableStream(DEBUG_DMA_PORT,DEBUG_DMA_RX_STREAM);
      pDebug.Flag = ENABLE;
      /** 通知任务处理数据 */
      xTaskNotifyFromISR(DebugTask_Handler, 1, eSetValueWithoutOverwrite, &xHigherPriorityTaskWoken);
    }
}

Tanxiaoli 发表于 2023-10-23 17:07:52

感谢硬汉哥的回复,以下是配置的代码
/**
* @brief 调试串口初始化
* @parambound            波特率
*/
void debug_com_init(uint32_t bound)
{
    LL_USART_InitTypeDef USART_InitStruct;
    gpio_af_conf(Debug_TX_GPIO_Port, LL_GPIO_AF_7, LL_GPIO_MODE_ALTERNATE, LL_GPIO_PULL_NO, LL_GPIO_SPEED_FREQ_VERY_HIGH, LL_GPIO_OUTPUT_PUSHPULL, Debug_TX_Pin);
    gpio_af_conf(Debug_RX_GPIO_Port, LL_GPIO_AF_7, LL_GPIO_MODE_ALTERNATE, LL_GPIO_PULL_NO, LL_GPIO_SPEED_FREQ_VERY_HIGH, LL_GPIO_OUTPUT_PUSHPULL, Debug_RX_Pin);

    LL_USART_DeInit(DEBUG_COM_PORT);
    /* USER CODE END USART1_Init 1 */
    USART_InitStruct.BaudRate = bound;
    USART_InitStruct.DataWidth = LL_USART_DATAWIDTH_8B;
    USART_InitStruct.StopBits = LL_USART_STOPBITS_1;
    USART_InitStruct.Parity = LL_USART_PARITY_NONE;
    USART_InitStruct.TransferDirection = LL_USART_DIRECTION_TX_RX;
    USART_InitStruct.HardwareFlowControl = LL_USART_HWCONTROL_NONE;
    USART_InitStruct.OverSampling = LL_USART_OVERSAMPLING_16;
    LL_USART_Init(DEBUG_COM_PORT, &USART_InitStruct);
   
    LL_USART_ConfigAsyncMode(DEBUG_COM_PORT);
    LL_USART_SetTransferDirection(DEBUG_COM_PORT, LL_USART_DIRECTION_TX_RX); // 使能发送和接收
    //LL_USART_EnableIT_RXNE(DEBUG_COM_PORT);                                  // 使能接收中断
    LL_USART_EnableIT_IDLE(DEBUG_COM_PORT);                                  // 使能空闲中断
   
    LL_USART_ClearFlag_TC(DEBUG_COM_PORT);                                 // 清除发送完成标志
    //LL_USART_ClearFlag_RXNE(DEBUG_COM_PORT);
    LL_USART_ClearFlag_IDLE(DEBUG_COM_PORT);
   

    HAL_NVIC_SetPriority(DEBUG_IRQ, 0, 0);
    HAL_NVIC_EnableIRQ(DEBUG_IRQ);
   
    debug_dma_init();//打开DMA
    LL_USART_EnableDMAReq_TX(DEBUG_COM_PORT);//使能DMA发送
    LL_USART_EnableDMAReq_RX(DEBUG_COM_PORT);//使能DMA接收
    LL_USART_Enable(DEBUG_COM_PORT);
   
}
void debug_dma_init(void)
{
    LL_DMA_InitTypeDef debug_dma;
    /** DMA Tx Config */
    LL_DMA_DeInit(DEBUG_DMA_PORT,DEBUG_DMA_TX_STREAM);
    debug_dma.Channel = DEBUG_DMA_TX_CH;                            //DMA通道
    debug_dma.Direction = LL_DMA_DIRECTION_MEMORY_TO_PERIPH;      //DMA传输方向
    //FIFO配置
    debug_dma.FIFOMode = LL_DMA_FIFOMODE_DISABLE;                   //FIFO
    debug_dma.FIFOThreshold = LL_DMA_FIFOTHRESHOLD_FULL;            //FIFO阀值
    //内存配置
    debug_dma.MemBurst = LL_DMA_MBURST_SINGLE;                      //内存突发传输配置
    debug_dma.MemoryOrM2MDstAddress = (uint32_t)pDebug.Data;      //内存地址
    debug_dma.MemoryOrM2MDstDataSize = LL_DMA_MDATAALIGN_BYTE;      //内存地址大小,byte short int
    debug_dma.MemoryOrM2MDstIncMode = LL_DMA_MEMORY_INCREMENT;      //内存地址是否自增
    //外设配置
    debug_dma.PeriphBurst = LL_DMA_PBURST_SINGLE;                   //外设突发传输配置
    debug_dma.PeriphOrM2MSrcAddress = (uint32_t)&DEBUG_COM_PORT->DR;//外设地址
    debug_dma.PeriphOrM2MSrcDataSize = LL_DMA_PDATAALIGN_BYTE;      //内存地址大小
    debug_dma.PeriphOrM2MSrcIncMode = LL_DMA_PERIPH_NOINCREMENT;    //内存地址是否自增
    //模式配置
    debug_dma.Mode = LL_DMA_MODE_NORMAL;                            //DMA模式
    debug_dma.NbData = USART_MAX_LEN;                               //DMA传输最大数量
    debug_dma.Priority = LL_DMA_PRIORITY_LOW;                  //DMA优先级
    LL_DMA_Init(DEBUG_DMA_PORT,DEBUG_DMA_TX_STREAM,&debug_dma);   //DMA初始化
    /** DMA Tx Config End*/
   
    /** DMA Rx Config */
    LL_DMA_DeInit(DEBUG_DMA_PORT,DEBUG_DMA_RX_STREAM);
    debug_dma.Channel = DEBUG_DMA_RX_CH;                            //DMA通道
    debug_dma.Direction = LL_DMA_DIRECTION_PERIPH_TO_MEMORY;      //DMA传输方向
    //FIFO配置
    debug_dma.FIFOMode = LL_DMA_FIFOMODE_DISABLE;                  //FIFO
    debug_dma.FIFOThreshold = LL_DMA_FIFOTHRESHOLD_FULL;            //FIFO阀值
    //内存配置
    debug_dma.MemBurst = LL_DMA_MBURST_SINGLE;                      //内存突发传输配置
    debug_dma.MemoryOrM2MDstAddress = (uint32_t)pDebug.Data;      //内存地址
    debug_dma.MemoryOrM2MDstDataSize = LL_DMA_MDATAALIGN_BYTE;      //内存地址大小,byte short int
    debug_dma.MemoryOrM2MDstIncMode = LL_DMA_MEMORY_INCREMENT;      //内存地址是否自增
    //外设配置
    debug_dma.PeriphBurst = LL_DMA_PBURST_SINGLE;                   //外设突发传输配置
    debug_dma.PeriphOrM2MSrcAddress = (uint32_t)&DEBUG_COM_PORT->DR;//外设地址
    debug_dma.PeriphOrM2MSrcDataSize = LL_DMA_PDATAALIGN_BYTE;      //内存地址大小
    debug_dma.PeriphOrM2MSrcIncMode = LL_DMA_PERIPH_NOINCREMENT;    //内存地址是否自增
    //模式配置
    debug_dma.Mode = LL_DMA_MODE_NORMAL;                            //DMA模式
    debug_dma.NbData = USART_MAX_LEN;                               //DMA传输最大数量
    debug_dma.Priority = LL_DMA_PRIORITY_LOW;                  //DMA优先级
    LL_DMA_Init(DEBUG_DMA_PORT,DEBUG_DMA_RX_STREAM,&debug_dma);   //DMA初始化
   
    HAL_NVIC_SetPriority(UHF_DMA_IRQ, 1, 0);
    HAL_NVIC_EnableIRQ(UHF_DMA_IRQ);
   
    LL_DMA_EnableStream(DEBUG_DMA_PORT,DEBUG_DMA_RX_STREAM);
    /** DMA Rx Config End*/
}

Tanxiaoli 发表于 2023-10-23 17:08:34

感谢硬汉哥的回复,我贴上了代码怎么论坛看不到

missfox 发表于 2023-10-24 09:45:50

楼主可以试试把这个 xTaskNotifyFromISR(DebugTask_Handler, 1, eSetValueWithoutOverwrite, &xHigherPriorityTaskWoken);删掉,这样就跟你的裸机代码一样了,看看正常不,如果不正常,你的FreeRTOS移植的有问题。
页: [1]
查看完整版本: STM32F407配置DMA问题