OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 416|回复: 3

STM32u575 USART 用GPDMA接收,DMA中断,usart 中断正常来,ROR数据正确,接收缓冲却不变

[复制链接]

1

主题

2

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2025-12-28
在线时间
3 小时
发表于 2026-3-9 09:37:26 | 显示全部楼层 |阅读模式
1金钱
main代码:while (1) {    /* First transmit data, then start DMA receive */
    if (loop_TX < 0xFF) {
      loop_TX++;
      HAL_UART_Transmit(&huart2, &loop_TX, 1, 100);
      HAL_Delay(100);
      /* Start DMA receive with IDLE detection */
      HAL_UARTEx_ReceiveToIdle_DMA(&huart2, &loop_RX, 1);
      /* Wait for DMA transfer to complete */
      HAL_Delay(100);
      /* Flush cache to ensure DMA data is visible to CPU */
      SCB_InvalidateDCache_by_Addr(&loop_RX, sizeof(loop_RX));
      printf("[MAIN] TX: %02X, RX: %02X\r\n", loop_TX, loop_RX);
    }
  }
void GPDMA1_Channel0_IRQHandler(void)
{
  /* USER CODE BEGIN GPDMA1_Channel0_IRQn 0 */
  printf("[GPDMA1_Channel0] DMA done, CNDTR=%u, CSAR=0x%08lX, CDAR=0x%08lX, CTR1=0x%08lX\r\n",
         __HAL_DMA_GET_COUNTER(&handle_GPDMA1_Channel0),
         handle_GPDMA1_Channel0.Instance->CSAR,
         handle_GPDMA1_Channel0.Instance->CDAR,
         handle_GPDMA1_Channel0.Instance->CTR1);
  /* USER CODE END GPDMA1_Channel0_IRQn 0 */
  HAL_DMA_IRQHandler(&handle_GPDMA1_Channel0);
  /* USER CODE BEGIN GPDMA1_Channel0_IRQn 1 */

  /* USER CODE END GPDMA1_Channel0_IRQn 1 */
}
void USART2_IRQHandler(void)
{
  /* USER CODE BEGIN USART2_IRQn 0 */
  if (__HAL_UART_GET_FLAG(&huart2, UART_FLAG_IDLE)) {

    __HAL_UART_CLEAR_IDLEFLAG(&huart2);

    uint16_t dma_cntr = __HAL_DMA_GET_COUNTER(huart2.hdmarx);

    /* Flush cache to ensure DMA data is visible to CPU */
    SCB_InvalidateDCache_by_Addr(&loop_RX, sizeof(loop_RX));

    printf("[USART2] IDLE, DMA CNDTR=%u, RX=%02X, RDR=%02X\r\n",
           dma_cntr, loop_RX, huart2.Instance->RDR);
  }
  /* USER CODE END USART2_IRQn 0 */
  HAL_UART_IRQHandler(&huart2);
  /* USER CODE BEGIN USART2_IRQn 1 */
  /* USER CODE END USART2_IRQn 1 */
}
打印信息看DMA中断进去了,IDLE中断进去了,ROR是正确的,loop_RX却维持初始化的值。
[MAIN] loop_RX addr=0x20000029[GPDMA1_Channel0] DMA done, CNDTR=0, CSAR=0x40004424, CDAR=0x20000029, CTR1=0x00000000[MAIN] TX: B4, RX: 0F[USART2] IDLE, DMA CNDTR=0, RX=0F, RDR=B5[MAIN] loop_RX addr=0x20000029[GPDMA1_Channel0] DMA done, CNDTR=0, CSAR=0x40004424, CDAR=0x20000029, CTR1=0x00000000[MAIN] TX: B5, RX: 0F[USART2] IDLE, DMA CNDTR=0, RX=0F, RDR=B6[MAIN] loop_RX addr=0x20000029[GPDMA1_Channel0] DMA done, CNDTR=0, CSAR=0x40004424, CDAR=0x20000029, CTR1=0x00000000

USART2 TX直接接在了RX上。










st.png
回复

使用道具 举报

1

主题

2

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2025-12-28
在线时间
3 小时
 楼主| 发表于 2026-3-9 09:40:49 | 显示全部楼层
这个图是中断优先级
10ebc053-ecce-41f0-8ab8-c576f4fc8c96.png
回复

使用道具 举报

8

主题

588

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2991
金钱
2991
注册时间
2016-5-13
在线时间
189 小时
发表于 2026-3-9 16:39:24 | 显示全部楼层
你已经用stm32cubeMX了。里面配置串口DMA的你截图发出来看让我们看下。
虽然不明白你们在说什么,但感觉很厉害的样子。
回复

使用道具 举报

8

主题

588

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2991
金钱
2991
注册时间
2016-5-13
在线时间
189 小时
发表于 2026-3-9 16:48:36 | 显示全部楼层

__HAL_UART_ENABLE_IT(&huart2, UART_IT_IDLE);   

HAL_UART_Receive_DMA(&huart2,g_usart2_rx_buf,USART_REC_LEN);

void MX_DMA_Init(void)
{

  /* DMA controller clock enable */
  __HAL_RCC_DMA1_CLK_ENABLE();

  /* DMA interrupt init */
  /* DMA1_Stream1_IRQn interrupt configuration */
  HAL_NVIC_SetPriority(DMA1_Stream1_IRQn, 6, 0);
  HAL_NVIC_EnableIRQ(DMA1_Stream1_IRQn);
  /* DMA1_Stream5_IRQn interrupt configuration */
  HAL_NVIC_SetPriority(DMA1_Stream5_IRQn, 4, 0);
  HAL_NVIC_EnableIRQ(DMA1_Stream5_IRQn);
  /* DMA1_Stream6_IRQn interrupt configuration */
  HAL_NVIC_SetPriority(DMA1_Stream6_IRQn, 5, 0);
  HAL_NVIC_EnableIRQ(DMA1_Stream6_IRQn);

}


void DMA1_Stream5_IRQHandler(void)
{
  /* USER CODE BEGIN DMA1_Stream5_IRQn 0 */

  /* USER CODE END DMA1_Stream5_IRQn 0 */
  HAL_DMA_IRQHandler(&hdma_usart2_rx);
  /* USER CODE BEGIN DMA1_Stream5_IRQn 1 */

  /* USER CODE END DMA1_Stream5_IRQn 1 */
}

/**
  * @brief This function handles DMA1 stream6 global interrupt.
  */
void DMA1_Stream6_IRQHandler(void)
{
  /* USER CODE BEGIN DMA1_Stream6_IRQn 0 */

  /* USER CODE END DMA1_Stream6_IRQn 0 */
  HAL_DMA_IRQHandler(&hdma_usart2_tx);
  /* USER CODE BEGIN DMA1_Stream6_IRQn 1 */

  /* USER CODE END DMA1_Stream6_IRQn 1 */
}

虽然不明白你们在说什么,但感觉很厉害的样子。
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /1 下一条

正点原子公众号

如发现本坛存在违规或侵权内容, 请点击这里发送邮件举报 (或致电020-38271790)。请提供侵权说明和联系方式。我们将及时审核依法处理,感谢配合。

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2026-3-20 09:57

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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