硬汉嵌入式论坛

 找回密码
 立即注册
查看: 755|回复: 6
收起左侧

[FreeRTOS] STM32F407配置DMA问题

[复制链接]

3

主题

11

回帖

20

积分

新手上路

积分
20
发表于 2023-10-23 14:13:23 | 显示全部楼层 |阅读模式
本人在一直STM32F407时配置了DMA用来实现USART1收发数据,在裸机状态下DMA配置收发都没有问题,加入了操作系统FreeRTOS导致DMA没办法接收数据,仿真发现DMA错误标志被置位。现在不知道问题出现在哪里?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106739
QQ
发表于 2023-10-23 14:58:45 | 显示全部楼层
描述信息太少,贴必要的代码。
回复

使用道具 举报

3

主题

11

回帖

20

积分

新手上路

积分
20
 楼主| 发表于 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 调试串口初始化
* @param  bound            波特率
*/
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[pDebug.Len] = 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);
    }
}
回复

使用道具 举报

3

主题

11

回帖

20

积分

新手上路

积分
20
 楼主| 发表于 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 调试串口初始化
* @param  bound            波特率
*/
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[pDebug.Len] = 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);
    }
}
回复

使用道具 举报

3

主题

11

回帖

20

积分

新手上路

积分
20
 楼主| 发表于 2023-10-23 17:07:52 | 显示全部楼层
感谢硬汉哥的回复,以下是配置的代码
/**
* @brief 调试串口初始化
* @param  bound            波特率
*/
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*/
}
回复

使用道具 举报

3

主题

11

回帖

20

积分

新手上路

积分
20
 楼主| 发表于 2023-10-23 17:08:34 | 显示全部楼层
感谢硬汉哥的回复,我贴上了代码怎么论坛看不到
回复

使用道具 举报

23

主题

1406

回帖

1475

积分

至尊会员

积分
1475
发表于 2023-10-24 09:45:50 | 显示全部楼层
楼主可以试试把这个 xTaskNotifyFromISR(DebugTask_Handler, 1, eSetValueWithoutOverwrite, &xHigherPriorityTaskWoken);删掉,这样就跟你的裸机代码一样了,看看正常不,如果不正常,你的FreeRTOS移植的有问题。
代码不规范,亲人两行泪!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-3 13:32 , Processed in 0.318622 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表