[STM32U5] STM32U575板子DMA的问题

[复制链接]
230|54
powerantone 发表于 2026-6-4 21:39 | 显示全部楼层
内存到内存传输得看DMA通道支不支持,STM32U5的GPDMA1有些通道可能不支持,得查参考手册。
进入猫次元 发表于 2026-6-4 22:14 | 显示全部楼层
试试用HAL库的原函数HAL_DMA_Start_IT,而不是自己改的HAL_DMA_Start_IT1,原函数的参数是uint32_t地址,更符合要求,可能你改的函数有问题。
probedog 发表于 2026-6-4 22:40 | 显示全部楼层
突发长度设成1没问题,但半字传的话,每个突发传1个半字(2字节),总传输次数是BUFFER_SIZE次,没问题。
 楼主| Tom952331 发表于 2026-6-5 06:43 | 显示全部楼层
flycamelaaa 发表于 2026-6-4 19:38
半字传的话,SrcDataWidth和DestDataWidth得设成DMA_SRC_DATAWIDTH_HALFWORD,你初始化里改对了没? ...

这个初始化了。
 楼主| Tom952331 发表于 2026-6-5 11:19 | 显示全部楼层
onlycook 发表于 2026-6-4 21:39
中断服务函数GPDMA1_Channel15_IRQHandler里,有没有调用HAL_DMA_IRQHandler(&handle_GPDMA1_Channel15)? ...

有调用
CarterERO 发表于 2026-6-15 13:19 | 显示全部楼层
改用HAL_DMA_Start_IT1时,确保SrcAddress和DstAddress都是uint32_t类型,且数组地址必须是2字节对齐。检查你的源代码中地址转换是否正确。
 楼主| Tom952331 发表于 2026-6-15 13:45 | 显示全部楼层

谢谢!考进去一大堆错误。我找参考手册,没有找到DMA_MEM_CH这个寄存器
 楼主| Tom952331 发表于 2026-6-15 15:03 | 显示全部楼层

我考过来,一大堆错误。我找参考手册,没有DMA_MEM_CN这个寄存器
 楼主| Tom952331 发表于 2026-6-16 09:10 | 显示全部楼层

我考到文件里,一大堆错误。而且我找参考手册,没有找到DMA_MEM_CH寄存器
21ic小管家 发表于 2026-6-16 09:32 | 显示全部楼层
xch 发表于 2026-6-16 09:38 | 显示全部楼层
Tom952331 发表于 2026-6-15 13:45
谢谢!考进去一大堆错误。我找参考手册,没有找到DMA_MEM_CH这个寄存器

你自己定义用哪个通道就是了。比如
#define DMA_MEM_CH              GPDMA1_Channel0
xch 发表于 2026-6-16 09:40 | 显示全部楼层
#define DMA_MEM_LLS_CH              GPDMA1_Channel10
 楼主| Tom952331 发表于 2026-6-16 10:53 | 显示全部楼层

我把代码考到文件里,一大堆错误。我在参考手册里也找不到DMA_MEM_CH这个寄存器
xch 发表于 2026-6-16 12:03 | 显示全部楼层
Tom952331 发表于 2026-6-16 10:53
我把代码考到文件里,一大堆错误。我在参考手册里也找不到DMA_MEM_CH这个寄存器 ...

Tom952331 发表于 2026-6-15 13:45
谢谢!考进去一大堆错误。我找参考手册,没有找到DMA_MEM_CH这个寄存器

你自己定义用哪个通道就是了。比如:

#define DMA_MEM_CH                     GPDMA1_Channel0
#define DMA_MEM_LLS_CH              GPDMA1_Channel10
 楼主| Tom952331 发表于 2026-6-17 00:19 | 显示全部楼层
xch 发表于 2026-6-16 12:03
Tom952331 发表于 2026-6-15 13:45
谢谢!考进去一大堆错误。我找参考手册,没有找到DMA_MEM_CH这个寄存 ...

谢谢!这一句还有错误:

5.jpg

 楼主| Tom952331 发表于 2026-6-17 16:26 | 显示全部楼层
xch 发表于 2026-6-16 12:03
Tom952331 发表于 2026-6-15 13:45
谢谢!考进去一大堆错误。我找参考手册,没有找到DMA_MEM_CH这个寄存 ...

我改成这样定义,通过了。tDMA_LLS DMA_MEM_LLS[MAX_LLS_ARRAY_NUM];

我这样调用:DmaCopyHalfWordBlock (BUFFER_SIZE,(uint16_t *)aSRC_Const_Buffer1,aDST_Buffer1);
发现不灵,没拷贝过去。
xch 发表于 2026-6-17 16:52 | 显示全部楼层
Tom952331 发表于 2026-6-17 16:26
我改成这样定义,通过了。tDMA_LLS DMA_MEM_LLS[MAX_LLS_ARRAY_NUM];

我这样调用:DmaCopyHalfWordBlock ...

BUFFER_SIZE 是字节数。
MCU启动后先用这段代码先初始化一下。

  1.   handle_GPDMA1_Channel10.Instance = GPDMA1_Channel10;
  2.   handle_GPDMA1_Channel10.Init.Request = DMA_REQUEST_SW;
  3.   handle_GPDMA1_Channel10.Init.BlkHWRequest = DMA_BREQ_SINGLE_BURST;
  4.   handle_GPDMA1_Channel10.Init.Direction = DMA_MEMORY_TO_MEMORY;
  5.   handle_GPDMA1_Channel10.Init.SrcInc = DMA_SINC_FIXED;
  6.   handle_GPDMA1_Channel10.Init.DestInc = DMA_DINC_FIXED;
  7.   handle_GPDMA1_Channel10.Init.SrcDataWidth = DMA_SRC_DATAWIDTH_BYTE;
  8.   handle_GPDMA1_Channel10.Init.DestDataWidth = DMA_DEST_DATAWIDTH_BYTE;
  9.   handle_GPDMA1_Channel10.Init.Priority = DMA_LOW_PRIORITY_LOW_WEIGHT;
  10.   handle_GPDMA1_Channel10.Init.SrcBurstLength = 1;
  11.   handle_GPDMA1_Channel10.Init.DestBurstLength = 1;
  12.   handle_GPDMA1_Channel10.Init.TransferAllocatedPort = DMA_SRC_ALLOCATED_PORT0|DMA_DEST_ALLOCATED_PORT0;
  13.   handle_GPDMA1_Channel10.Init.TransferEventMode = DMA_TCEM_BLOCK_TRANSFER;
  14.   handle_GPDMA1_Channel10.Init.Mode = DMA_NORMAL;
  15.   if (HAL_DMA_Init(&handle_GPDMA1_Channel10) != HAL_OK)
  16.   {
  17.    // Error_Handler();
  18.   }
  19.   if (HAL_DMA_ConfigChannelAttributes(&handle_GPDMA1_Channel10, DMA_CHANNEL_NPRIV) != HAL_OK)
  20.   {
  21. //    Error_Handler();
  22.   }
xch 发表于 2026-6-17 16:55 | 显示全部楼层
  1. handle_GPDMA1_Channel0.Instance = GPDMA1_Channel0;
  2.   handle_GPDMA1_Channel0.Init.Request = DMA_REQUEST_SW;
  3.   handle_GPDMA1_Channel0.Init.BlkHWRequest = DMA_BREQ_SINGLE_BURST;
  4.   handle_GPDMA1_Channel0.Init.Direction = DMA_MEMORY_TO_MEMORY;
  5.   handle_GPDMA1_Channel0.Init.SrcInc = DMA_SINC_INCREMENTED;
  6.   handle_GPDMA1_Channel0.Init.DestInc = DMA_DINC_INCREMENTED;
  7.   handle_GPDMA1_Channel0.Init.SrcDataWidth = DMA_SRC_DATAWIDTH_BYTE;
  8.   handle_GPDMA1_Channel0.Init.DestDataWidth = DMA_DEST_DATAWIDTH_BYTE;
  9.   handle_GPDMA1_Channel0.Init.Priority = DMA_LOW_PRIORITY_LOW_WEIGHT;
  10.   handle_GPDMA1_Channel0.Init.SrcBurstLength = 1;
  11.   handle_GPDMA1_Channel0.Init.DestBurstLength = 1;
  12.   handle_GPDMA1_Channel0.Init.TransferAllocatedPort = DMA_SRC_ALLOCATED_PORT0|DMA_DEST_ALLOCATED_PORT0;
  13.   handle_GPDMA1_Channel0.Init.TransferEventMode = DMA_TCEM_BLOCK_TRANSFER;
  14.   handle_GPDMA1_Channel0.Init.Mode = DMA_NORMAL;
  15.   if (HAL_DMA_Init(&handle_GPDMA1_Channel0) != HAL_OK)
  16.   {
  17.     //Error_Handler();
  18.   }
  19.   if (HAL_DMA_ConfigChannelAttributes(&handle_GPDMA1_Channel0, DMA_CHANNEL_NPRIV) != HAL_OK)
  20.   {
  21.     //Error_Handler();
  22.   }
 楼主| Tom952331 发表于 2026-6-17 17:03 | 显示全部楼层
xch 发表于 2026-6-17 16:52
BUFFER_SIZE 是字节数。
MCU启动后先用这段代码先初始化一下。

还是不行,我都快放弃了。
xch 发表于 2026-6-17 17:11 | 显示全部楼层
Tom952331 发表于 2026-6-17 17:03
还是不行,我都快放弃了。

你是不是还保留一些残留的代码没去掉?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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