[STM32L4] STM32L4R5ZIT6用DMA把存储器里的数据发往串口的·问题

[复制链接]
547|58
Tom952331 发表于 2026-6-10 15:40 | 显示全部楼层 |阅读模式
我试图用STM32L4R5ZIT6的DMA功能把存储器里的数据发往串口1
用串口可以发数据:、
比如这句:
  1. HAL_UART_Transmit(&huart1,buffer,1,1000);
用这句就不行:

  1. HAL_UART_Transmit_DMA(&huart1, (uint8_t *)Buffer, 4);
我的DMA配置函数如下:

  1. static void DMA_Config(void)
  2. {
  3.   /*## -1- Enable DMA1 clock #################################################*/
  4.   __HAL_RCC_DMA1_CLK_ENABLE();

  5.   /*##-2- Select the DMA functional Parameters ###############################*/
  6.   DmaHandle.Init.Direction = DMA_MEMORY_TO_PERIPH ;          /* M2M transfer mode                */
  7.   DmaHandle.Init.PeriphInc = DMA_PINC_DISABLE;               /* Peripheral increment mode Enable */
  8.         //DmaHandle.Init.PeriphInc = DMA_PINC_DISABLE;      
  9.   DmaHandle.Init.MemInc = DMA_MINC_ENABLE;                  /* Memory increment mode Enable     */
  10.         //DmaHandle.Init.MemInc = DMA_MINC_DISABLE;  
  11. //  DmaHandle.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD; /* Peripheral data alignment : Word */
  12. //  DmaHandle.Init.MemDataAlignment = DMA_MDATAALIGN_WORD;    /* memory data alignment : Word     */
  13. //  DmaHandle.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD; /* Peripheral data alignment : Word */
  14. //       
  15. //  DmaHandle.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;    /* memory data alignment : Word     */
  16.         DmaHandle.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE  ; /* Peripheral data alignment : Word */
  17.   DmaHandle.Init.MemDataAlignment = DMA_PDATAALIGN_BYTE  ;    /* memory data alignment : Word     */
  18.         DmaHandle.Init.Mode = DMA_NORMAL;                         /* Normal DMA mode                  */
  19.   DmaHandle.Init.Priority = DMA_PRIORITY_HIGH;              /* priority level : high            */

  20.   /*##-3- Select the DMA instance to be used for the transfer : DMA1_Channel1 #*/
  21.   DmaHandle.Instance = DMA_INSTANCE;

  22.   /*##-4- Initialize the DMA channel ##########################################*/
  23.   if (HAL_DMA_Init(&DmaHandle) != HAL_OK)
  24.   {
  25.     /* Initialization Error */
  26.     Error_Handler();
  27.   }
  28.   
  29.   /*##-5- Select Callbacks functions called after Transfer complete and Transfer error */
  30.   HAL_DMA_RegisterCallback(&DmaHandle, HAL_DMA_XFER_CPLT_CB_ID, TransferComplete);
  31.   HAL_DMA_RegisterCallback(&DmaHandle, HAL_DMA_XFER_ERROR_CB_ID, TransferError);

  32.   /*##-6- Configure NVIC for DMA transfer complete/error interrupts ##########*/
  33.   /* Set Interrupt Group Priority */
  34.   HAL_NVIC_SetPriority(DMA_INSTANCE_IRQ, 0, 0);

  35.   /* Enable the DMA STREAM global Interrupt */
  36.   HAL_NVIC_EnableIRQ(DMA_INSTANCE_IRQ);

  37.   /*##-7- Start the DMA transfer using the interrupt mode ####################*/
  38.   /* Configure the source, destination and buffer size DMA fields and Start DMA Channel transfer */
  39.   /* Enable All the DMA interrupts */
  40.   if (HAL_DMA_Start_IT(&DmaHandle, (uint32_t)&aSRC_Const_Buffer, (uint32_t)aDST_Buffer, 4) != HAL_OK)
  41.   {
  42.     /* Transfer Error */
  43.     Error_Handler();
  44.   }
  45. }
请高手指教,如何解决?谢谢!


海滨消消 发表于 2026-6-10 16:28 | 显示全部楼层
USART1的DMA通道选错了,L4R5的USART1_TX应该用DMA1_Channel5,不是Channel1。
classroom 发表于 2026-6-10 17:29 | 显示全部楼层
外设地址写成了aDST_Buffer,应该是&huart1.Instance->TDR,地址错了数据发不到串口。
cr315 发表于 2026-6-10 18:29 | 显示全部楼层
源地址用了&aSRC_Const_Buffer,常量区的地址DMA不一定能访问,换成普通RAM试试。
duo点 发表于 2026-6-10 19:30 | 显示全部楼层
HAL_UART_Transmit_DMA发起后程序就继续往下跑了,DMA还没传完主循环就把buffer改了,数据全乱。
flycamelaaa 发表于 2026-6-10 20:34 | 显示全部楼层
DMA传完之后没有关闭DMA通道,下一次调用HAL_UART_Transmit_DMA会直接返回busy。
jcky001 发表于 2026-6-10 21:28 | 显示全部楼层
回调函数里没有重新使能UART的DMA发送,传完一次就停了,第二次调不动。
onlycook 发表于 2026-6-10 21:37 | 显示全部楼层
MemoryInc设成了ENABLE但源地址是常量,增量没意义,应该设成DISABLE。
powerantone 发表于 2026-6-10 22:31 | 显示全部楼层
波特率和DMA传输速度不匹配时,TXE标志来不及置位,DMA等不到就超时了。
probedog 发表于 2026-6-10 17:02 | 显示全部楼层
DMA用的是NORMAL模式,传完4个字节就停了,如果要连续发得用CIRCULAR模式。
solty 发表于 2026-6-10 18:02 | 显示全部楼层
优先级设成HIGH但NVIC里没开DMA的中断,传输完成和错误中断都不会进。
spicy 发表于 2026-6-10 19:13 | 显示全部楼层
PeriphDataAlignment和MemDataAlignment都设成BYTE是对的,但注释里写的是WORD,容易看混。
stormwind123 发表于 2026-6-10 19:03 | 显示全部楼层
HAL_UART_Transmit_DMA返回HAL_BUSY是正常的,不代表失败,得看回调里的状态。
七毛钱 发表于 2026-6-10 21:07 | 显示全部楼层
DMA初始化放在主循环里每次都重新 init 一遍,之前的配置全被覆盖了。
今天会画卧蚕吗 发表于 2026-6-10 22:04 | 显示全部楼层
串口的DMA发送使能位没开,UART层面没允许DMA接管发送,数据发不出去。
又见江南雨 发表于 2026-6-11 11:34 | 显示全部楼层
L4R5的DMA和USART1的映射关系要查参考手册,CubeMX自动生成的不一定对。
没有太阳的晴天 发表于 2026-6-11 14:15 | 显示全部楼层
传输长度写的是4,但buffer里实际数据可能不止4个字节,多出来的部分不会发。
海滨消消 发表于 2026-6-11 16:48 | 显示全部楼层
DMA传输过程中如果串口被其他方式占用,比如printf重定向到了串口,会产生冲突。
甜心puppy 发表于 2026-6-11 18:20 | 显示全部楼层
错误回调里没有清DMA的错误标志,错误状态一直挂着,后面的传输全部失败。
等凌晨日出 发表于 2026-6-11 21:17 | 显示全部楼层
用DMA发串口之前先用HAL_UART_Transmit验证过能通,说明串口硬件没问题,问题就在DMA配置上。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

130

主题

599

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部
0