硬汉嵌入式论坛

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

[NUCLEO-H743ZI] 为什么stm32H7使用串口DMA发送数据全0,阻塞式串口发送数据正常

[复制链接]

1

主题

1

回帖

4

积分

新手上路

积分
4
发表于 昨天 10:12 | 显示全部楼层 |阅读模式
本帖最后由 wwhran 于 2025-4-25 13:13 编辑

最近在测试NUCLEO-H743ZI开发板接受麦克风音频数据(24位数据采样率48k)(I2S接口DMA),并通过串口发送数据,
经过测试串口阻塞式(HAL_UART_Transmit)发送数据显示正常,但是使用串口DMA(HAL_UART_Transmit_DMA)发送数据串口调试助手接收到的全是00,不知道为什么.  
测试了发送数组是局部变量和全局变量都是这样的问题,但是串口DMA发送特定数据是正确的




串口DMA配置代码:

void initUART2()
{

                GPIO_InitTypeDef  GPIO_InitStruct;
          __HAL_RCC_GPIOA_CLK_ENABLE();
                __HAL_RCC_GPIOB_CLK_ENABLE();
                __HAL_RCC_GPIOD_CLK_ENABLE();
        
                __HAL_RCC_DMA1_CLK_ENABLE();
                __HAL_RCC_DMA2_CLK_ENABLE();
        
          __HAL_RCC_USART2_CLK_ENABLE();
        
                HAL_NVIC_SetPriority(DMA1_Stream3_IRQn, 0, 0);
                HAL_NVIC_EnableIRQ(DMA1_Stream3_IRQn);
        

  /**USART2 GPIO Configuration
    PA2     ------> USART2_TX
    PA3     ------> USART2_RX
    */
    GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_3;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    GPIO_InitStruct.Alternate = GPIO_AF7_USART2;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);


  huart2.Instance = USART2;
  huart2.Init.BaudRate = 1000000;
  huart2.Init.WordLength = UART_WORDLENGTH_8B;
  huart2.Init.StopBits = UART_STOPBITS_1;
  huart2.Init.Parity = UART_PARITY_NONE;
  huart2.Init.Mode = UART_MODE_TX_RX;
  huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  huart2.Init.OverSampling = UART_OVERSAMPLING_16;
  huart2.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
  huart2.Init.ClockPrescaler = UART_PRESCALER_DIV1;
  huart2.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
  if (HAL_UART_Init(&huart2) != HAL_OK)
  {
    Error_Handler();
  }
  if (HAL_UARTEx_SetTxFifoThreshold(&huart2, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK)
  {
    Error_Handler();
  }
  if (HAL_UARTEx_SetRxFifoThreshold(&huart2, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK)
  {
    Error_Handler();
  }
  if (HAL_UARTEx_DisableFifoMode(&huart2) != HAL_OK)
  {
    Error_Handler();
  }

    /* USART2 DMA Init */
    /* USART2_TX Init */
    hdma_usart2_tx.Instance = DMA1_Stream3;
    hdma_usart2_tx.Init.Request = DMA_REQUEST_USART2_TX;
    hdma_usart2_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
    hdma_usart2_tx.Init.PeriphInc = DMA_PINC_DISABLE;
    hdma_usart2_tx.Init.MemInc = DMA_MINC_ENABLE;
    hdma_usart2_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
    hdma_usart2_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
    hdma_usart2_tx.Init.Mode = DMA_NORMAL;
    hdma_usart2_tx.Init.Priority = DMA_PRIORITY_VERY_HIGH;
    hdma_usart2_tx.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
        
    if (HAL_DMA_Init(&hdma_usart2_tx) != HAL_OK)
    {
      Error_Handler();
    }
    __HAL_LINKDMA(&huart2,hdmatx,hdma_usart2_tx);
               
          // 配置DMA传输完成中断(TCIE)
    __HAL_DMA_ENABLE_IT(&hdma_usart2_tx, DMA_IT_TC);
               
          HAL_NVIC_SetPriority(USART2_IRQn, 0, 0);
    HAL_NVIC_EnableIRQ(USART2_IRQn);
         
}


void DMA1_Stream3_IRQHandler(void)
{
  HAL_DMA_IRQHandler(&hdma_usart2_tx);
}

void USART2_IRQHandler(void)
{
  HAL_UART_IRQHandler(&huart2);
}




// 串口DMA传输完成回调
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart) {
    if (huart->Instance == USART2) {
                        BSP_LED_On(LED2);
      uart_tx_complete = 1;
    }
}




发送代码:

            // 串口发送   将符号扩展后的数据拆分为3字节(MSB在前)
            uart_send_buffer[i * 3]     = (signed_data >> 16) & 0xFF; // 最高字节
            uart_send_buffer[i * 3 + 1] = (signed_data >> 8)  & 0xFF; // 中间字节
            uart_send_buffer[i * 3 + 2] = signed_data          & 0xFF; // 最低字节        





            HAL_UART_Transmit_DMA(&huart2, uart_send_buffer, sizeof(uart_send_buffer));












回复

使用道具 举报

1

主题

1

回帖

4

积分

新手上路

积分
4
 楼主| 发表于 昨天 13:15 | 显示全部楼层
屏幕截图 2025-04-25 101314.png
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-26 02:09 , Processed in 0.247264 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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