硬汉嵌入式论坛

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

[DMA] 串口DMA

[复制链接]

1

主题

5

回帖

8

积分

新手上路

积分
8
发表于 5 天前 | 显示全部楼层 |阅读模式
uint8_t RecData[20];
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
  HAL_UART_Transmit_IT(&huart1, RecData, sizeof(RecData));
  HAL_UART_Receive_IT(&huart1, RecData, sizeof(RecData));
}

  HAL_UART_Receive_IT(&huart1, RecData, sizeof(RecData));
这段代码就可以正常回传消息,这个是串口中断

但是使用DMA后没办法正常收发是哪里出了问题吗?代码如下

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
  HAL_UART_Transmit_DMA(&huart1, RecData, sizeof(RecData));
  HAL_UART_Receive_DMA(&huart1, RecData, sizeof(RecData));
}
  HAL_UART_Receive_DMA(&huart1, RecData, sizeof(RecData));


dma配置:

    GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_10;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    GPIO_InitStruct.Alternate = GPIO_AF7_USART1;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    /* USART1 DMA Init */
    /* USART1_RX Init */
    hdma_usart1_rx.Instance = DMA1_Stream1;
    hdma_usart1_rx.Init.Request = DMA_REQUEST_USART1_RX;
    hdma_usart1_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;
    hdma_usart1_rx.Init.PeriphInc = DMA_PINC_DISABLE;
    hdma_usart1_rx.Init.MemInc = DMA_MINC_ENABLE;
    hdma_usart1_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
    hdma_usart1_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
    hdma_usart1_rx.Init.Mode = DMA_NORMAL;
    hdma_usart1_rx.Init.Priority = DMA_PRIORITY_LOW;
    hdma_usart1_rx.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
    if (HAL_DMA_Init(&hdma_usart1_rx) != HAL_OK)
    {
      Error_Handler();
    }

    __HAL_LINKDMA(uartHandle,hdmarx,hdma_usart1_rx);

    /* USART1_TX Init */
    hdma_usart1_tx.Instance = DMA1_Stream0;
    hdma_usart1_tx.Init.Request = DMA_REQUEST_USART1_TX;
    hdma_usart1_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
    hdma_usart1_tx.Init.PeriphInc = DMA_PINC_DISABLE;
    hdma_usart1_tx.Init.MemInc = DMA_MINC_ENABLE;
    hdma_usart1_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
    hdma_usart1_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
    hdma_usart1_tx.Init.Mode = DMA_NORMAL;
    hdma_usart1_tx.Init.Priority = DMA_PRIORITY_LOW;
    hdma_usart1_tx.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
    if (HAL_DMA_Init(&hdma_usart1_tx) != HAL_OK)
    {
      Error_Handler();
    }

    __HAL_LINKDMA(uartHandle,hdmatx,hdma_usart1_tx);




回复

使用道具 举报

1

主题

5

回帖

8

积分

新手上路

积分
8
 楼主| 发表于 5 天前 | 显示全部楼层
HAL库的一些配置
微信图片_20250604141055.png
微信图片_20250604141130.png
微信图片_20250604141143.png
微信图片_20250604141202.png
微信图片_20250604141213.png
微信图片_20250604141249.png
回复

使用道具 举报

24

主题

195

回帖

267

积分

高级会员

积分
267
QQ
发表于 5 天前 | 显示全部楼层
DMA不是这样直接替换的,需要更改串口 API 的使用方法。

建议参考
stbanana/Dataflow: Dataflow middleware. Enhanced use of DMA and half-duplex.

DMA 需要摒弃寄存器操作的思路,采用合理的通道思维。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116197
QQ
发表于 4 天前 | 显示全部楼层
我这个例子是一个简易的串口DMA例子,适合楼主对比参考

【STM32H743实验例程】实验14:STM32H743串口DMA方式收发,DMA方式问题比较多,要注意数据一致性
https://www.armbbs.cn/forum.php? ... 6271&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

4

主题

21

回帖

33

积分

新手上路

积分
33
发表于 4 天前 | 显示全部楼层
H7的DMA1能访问的SRAM只有SRAM1~SRAM3,具体看一下手册,访问不了AXI-RAM和DTCM。配置没啥问题。我也是这么配置的,如果配置了Cache,还得注意数据一致性。你前面没有配置MPU,注意DMA1的访问权限吧。坛里硬汉大佬的关于MPU和Cache还是四通八达的矩阵(具体忘了)那个帖子里面视频说的很详细的。
回复

使用道具 举报

24

主题

195

回帖

267

积分

高级会员

积分
267
QQ
发表于 4 天前 | 显示全部楼层
lyj41801 发表于 2025-6-5 11:26
H7的DMA1能访问的SRAM只有SRAM1~SRAM3,具体看一下手册,访问不了AXI-RAM和DTCM。配置没啥问题。我也是这么 ...

我也了解过这种说法,stm32H7放在D2里。
但是我用GD的H7,DMA buffer区就放在 AXI 也能正常工作,这是为啥?
回复

使用道具 举报

4

主题

21

回帖

33

积分

新手上路

积分
33
发表于 4 天前 | 显示全部楼层
yono 发表于 2025-6-5 16:18
我也了解过这种说法,stm32H7放在D2里。
但是我用GD的H7,DMA buffer区就放在 AXI 也能正常工作,这是为 ...

GD32H7和STM32H7是两个东西,不要混为一谈,STM32H7B0和STM32H743差别还很大呢。就事论事
回复

使用道具 举报

1

主题

5

回帖

8

积分

新手上路

积分
8
 楼主| 发表于 13 小时前 | 显示全部楼层
eric2013 发表于 2025-6-5 07:33
我这个例子是一个简易的串口DMA例子,适合楼主对比参考

【STM32H743实验例程】实验14:STM32H743串口DMA ...

好的佬,我全看看
回复

使用道具 举报

1

主题

5

回帖

8

积分

新手上路

积分
8
 楼主| 发表于 13 小时前 | 显示全部楼层
yono 发表于 2025-6-4 16:32
DMA不是这样直接替换的,需要更改串口 API 的使用方法。

建议参考

好的佬,我去看看
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-9 23:54 , Processed in 0.272029 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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