你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

UART DMA 数据发送报错

[复制链接]
yuyingdong2002 提问时间:2018-8-29 11:31 /
采用STM32H743芯片, 实现UART DMA收发数据.
用图形化的界面配置了设置, UART配置成DMA模式, 之后通过HAL_UART_Transmit_DMA发送数据, 中断报发送错误(DMA_FLAG_TEIF0_4), 总线上也没有数据输出.

以下是初始化部分代码:
static void MX_UART4_Init(void)
{
  huart4.Instance = UART4;
  huart4.Init.BaudRate = 115200;
  huart4.Init.WordLength = UART_WORDLENGTH_8B;
  huart4.Init.StopBits = UART_STOPBITS_1;
  huart4.Init.Parity = UART_PARITY_NONE;
  huart4.Init.Mode = UART_MODE_TX_RX;
  huart4.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  huart4.Init.OverSampling = UART_OVERSAMPLING_16;
  huart4.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
  huart4.Init.Prescaler = UART_PRESCALER_DIV1;
  huart4.Init.FIFOMode = UART_FIFOMODE_DISABLE;
  huart4.Init.TXFIFOThreshold = UART_TXFIFO_THRESHOLD_1_8;
  huart4.Init.RXFIFOThreshold = UART_RXFIFO_THRESHOLD_1_8;
  huart4.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
  if (HAL_UART_Init(&huart4) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }
}

void HAL_UART_MspInit(UART_HandleTypeDef* huart)
{
  GPIO_InitTypeDef GPIO_InitStruct;
  if(huart->Instance==UART4)
  {
  /* USER CODE BEGIN UART4_MspInit 0 */
  /* USER CODE END UART4_MspInit 0 */
    /* Peripheral clock enable */
    __HAL_RCC_UART4_CLK_ENABLE();
  
    /**UART4 GPIO Configuration   
    PA0-WKUP     ------> UART4_TX
    PA11     ------> UART4_RX
    */
    GPIO_InitStruct.Pin = GPIO_PIN_0;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    GPIO_InitStruct.Alternate = GPIO_AF8_UART4;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    GPIO_InitStruct.Pin = GPIO_PIN_11;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    GPIO_InitStruct.Alternate = GPIO_AF6_UART4;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    /* UART4 DMA Init */
    /* UART4_TX Init */
    hdma_uart4_tx.Instance = DMA1_Stream0;
    hdma_uart4_tx.Init.Request = DMA_REQUEST_UART4_TX;
    hdma_uart4_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
    hdma_uart4_tx.Init.PeriphInc = DMA_PINC_DISABLE;
    hdma_uart4_tx.Init.MemInc = DMA_MINC_ENABLE;
    hdma_uart4_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
    hdma_uart4_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
    hdma_uart4_tx.Init.Mode = DMA_NORMAL;
    hdma_uart4_tx.Init.Priority = DMA_PRIORITY_LOW;
    hdma_uart4_tx.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
    if (HAL_DMA_Init(&hdma_uart4_tx) != HAL_OK)
    {
      _Error_Handler(__FILE__, __LINE__);
    }
    __HAL_LINKDMA(huart,hdmatx,hdma_uart4_tx);
    /* UART4_RX Init */
    hdma_uart4_rx.Instance = DMA1_Stream1;
    hdma_uart4_rx.Init.Request = DMA_REQUEST_UART4_RX;
    hdma_uart4_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;
    hdma_uart4_rx.Init.PeriphInc = DMA_PINC_DISABLE;
    hdma_uart4_rx.Init.MemInc = DMA_MINC_ENABLE;
    hdma_uart4_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
    hdma_uart4_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
    hdma_uart4_rx.Init.Mode = DMA_CIRCULAR;
    hdma_uart4_rx.Init.Priority = DMA_PRIORITY_LOW;
    hdma_uart4_rx.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
    if (HAL_DMA_Init(&hdma_uart4_rx) != HAL_OK)
    {
      _Error_Handler(__FILE__, __LINE__);
    }
    __HAL_LINKDMA(huart,hdmarx,hdma_uart4_rx);
    /* UART4 interrupt Init */
    HAL_NVIC_SetPriority(UART4_IRQn, 0, 0);
    HAL_NVIC_EnableIRQ(UART4_IRQn);
  /* USER CODE BEGIN UART4_MspInit 1 */
  /* USER CODE END UART4_MspInit 1 */
  }
}

调用 if(HAL_UART_Transmit_DMA(&huart4, (uint8_t *)cmd_37, 1/*sizeof(cmd_37)*/)!= HAL_OK)
//if(HAL_UART_Transmit(&huart4, (uint8_t *)cmd_37, sizeof(cmd_37), 1000)!= HAL_OK)
{
  Error_Handler();
}
DMA产生了中断, 中断源是发送错误.

补充: 通过HAL_UART_Transmit(&huart4, (uint8_t *)cmd_37, sizeof(cmd_37), 1000)发送, 串口是可以正常看到数据发送的, 可以排除串口本身的问题.



收藏 评论3 发布时间:2018-8-29 11:31

举报

3个回答
feixiang20 回答时间:2018-8-30 02:24:48
现在都出H7啦,为了这个问题,看了很多帖子,但理解的不好。
猜想无非就是检查时钟配置,IO配置、复用功能配置。配置USARTx中断优先级,启用NVIC USART中断句柄。实际使用时只需把要发送的数据准备好,调用Uart_Send_Data。 Uart_Send_Data("AT+VERSION\r\n", 12);  唉,说不好了,我有空再研究研究
要不你自己参考,【STM32H743网络-----分享调试经验及注意事项】
https://www.stmcu.org.cn/module/forum/thread-615089-1-1.html
https://www.stmcu.org.cn/module/forum/thread-616379-1-1.html

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

yuyingdong2002 回答时间:2018-8-30 10:15:20
feixiang20 发表于 2018-8-30 02:24
现在都出H7啦,为了这个问题,看了很多帖子,但理解的不好。
猜想无非就是检查时钟配置,IO配置、复用功能 ...

收到,谢谢
wenyangzeng 回答时间:2018-8-31 10:25:21
这个FIFO先关闭试看看。

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版