打印
[STM32H7]

H743 DMA传输错误中断的问题

[复制链接]
503|44
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jiajs|  楼主 | 2023-3-8 19:14 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
调试H743 DMA传输的时候,每次中断都是因为传输错误标志(TEIF)置位引起的。
我的目的是从外部FIFO(片选FMC_NE2,地址0X64000000),把16000个半字(16位)搬移到内部RAM(起始地址0X24001000)。
程序如下:
/**
   * Enable DMA controller clock
   * Configure DMA for memory to memory transfers
   *   hdma_memtomem_dma1_stream0
   */
static void MX_DMA_Init(void)
{
   // DMA controller clock enable
   __HAL_RCC_DMA1_CLK_ENABLE();
   // Configure DMA request hdma_memtomem_dma1_stream0 on DMA1_Stream0
   hdma_memtomem_dma1_stream0.Instance = DMA1_Stream0;
   hdma_memtomem_dma1_stream0.Init.Request = DMA_REQUEST_MEM2MEM;         //内存到内存
  hdma_memtomem_dma1_stream0.Init.Direction = DMA_MEMORY_TO_MEMORY;        //内存到内存
  hdma_memtomem_dma1_stream0.Init.PeriphInc = DMA_PINC_DISABLE;          //外设地址不变
  hdma_memtomem_dma1_stream0.Init.MemInc = DMA_MINC_ENABLE;            //内存地址自动增加
  hdma_memtomem_dma1_stream0.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD; //半字
  hdma_memtomem_dma1_stream0.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;   //半字
  hdma_memtomem_dma1_stream0.Init.Mode = DMA_NORMAL;               //普通DMA传输
  hdma_memtomem_dma1_stream0.Init.Priority = DMA_PRIORITY_HIGH;          //优先级高
  hdma_memtomem_dma1_stream0.Init.FIFOMode = DMA_FIFOMODE_ENABLE;         //FIFO使能
  hdma_memtomem_dma1_stream0.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_1QUARTERFULL;
   hdma_memtomem_dma1_stream0.Init.MemBurst = DMA_MBURST_SINGLE;          //单次突发传输
  hdma_memtomem_dma1_stream0.Init.PeriphBurst = DMA_PBURST_SINGLE;        //单次突发传输
  if (HAL_DMA_Init(&hdma_memtomem_dma1_stream0) != HAL_OK)
   {
     Error_Handler( );
   }
   // DMA interrupt init
   // DMA1_Stream0_IRQn interrupt configuration
   HAL_NVIC_SetPriority(DMA1_Stream0_IRQn, 0, 0);
   HAL_NVIC_EnableIRQ(DMA1_Stream0_IRQn);
}

//FIFO中断 外部中断1 PB1
void EXTI1_IRQHandler(void)
{
   /* USER CODE BEGIN EXTI1_IRQn 0 */
   /* USER CODE END EXTI1_IRQn 0 */
DisADsample();  //停止AD数据往FIFO里写
  HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_1);
   /* USER CODE BEGIN EXTI1_IRQn 1 */
HAL_DMA_Start_IT(&hdma_memtomem_dma1_stream0, 0x64000000, 0x24001000, 16000);//启动传输,源地址为0x64000000,
         
   /* USER CODE END EXTI1_IRQn 1 */
}
// dma传输完成中断处理
void DMA1_Stream0_IRQHandler(void)
{
      HAL_DMA_IRQHandler(&hdma_memtomem_dma1_stream0);
      /* USER CODE BEGIN DMA1_Stream0_IRQn 1 */
     if(__HAL_DMA_GET_FLAG(&hdma_memtomem_dma1_stream0,DMA_FLAG_TCIF0_4))//判断是否为DMA传输完成中断
    {
   
            __HAL_DMA_CLEAR_FLAG(&hdma_memtomem_dma1_stream0,DMA_FLAG_TCIF0_4);//清除中断标志位
          HAL_DMA_Abort_IT(&hdma_memtomem_dma1_stream0);      //传输完成以后关闭DMA
     }
}

问题描述:
1、H743可以采集到FIFO输出半满中断信号,并可以触发EXTI1中断。
2、EXTI1中断处理程序EXTI1_IRQHandler里启动DMA传输,传输完成触发中断。
3、DMA中断每次由TEIF0触发。

请各位老师帮忙解决一下这个问题!谢谢!

使用特权

评论回复
沙发
Undshing| | 2023-3-8 19:51 | 只看该作者
外部中断比较适合

使用特权

评论回复
板凳
香水城| | 2024-1-4 10:36 | 只看该作者


这个错误主要是总线访问过程中出现的,你把内部SRAM换个地方试试,比方换到SRAM1,0x30000000~0x3001ffff.

使用特权

评论回复
地板
lihuami| | 2024-1-4 17:03 | 只看该作者
DMA传输有多种模式,如字节传输、字传输等,如果传输模式设置不正确,可能会导致传输错误。

使用特权

评论回复
5
backlugin| | 2024-1-4 17:23 | 只看该作者
查阅H743单片机的官方文档和教程,了解其他用户在使用DMA时遇到的常见问题及解决方法。

使用特权

评论回复
6
eefas| | 2024-1-5 10:01 | 只看该作者
DMA配置正确,包括外设地址、主存储器地址、数据传输方向、数据传输长度等。错误的DMA配置可能导致传输错误。

使用特权

评论回复
7
burgessmaggie| | 2024-1-5 10:15 | 只看该作者
没有遗漏或错误。错误的中断和回调函数配置可能导致DMA传输错误。

使用特权

评论回复
8
mickit| | 2024-1-5 10:33 | 只看该作者
检查中断服务例程是否正确实现,并且在ISR中调用正确的函数来处理DMA传输错误中断。

使用特权

评论回复
9
plsbackup| | 2024-1-5 16:55 | 只看该作者
在STM32H743微控制器中,使用DMA(直接存储器访问)进行数据传输时,可能会遇到传输错误中断的问题。

使用特权

评论回复
10
qiufengsd| | 2024-1-5 18:03 | 只看该作者
DMA无法访问目标地址导致传输错误。需要检查RAM地址映射是否正确。

使用特权

评论回复
11
mnynt121| | 2024-1-5 19:36 | 只看该作者
确保DMA时钟使能,并且DMA传输相关的配置参数正确,例如传输方向、数据宽度、增量模式、传输模式等。

使用特权

评论回复
12
dspmana| | 2024-1-5 19:55 | 只看该作者
RAM地址映射错误              

使用特权

评论回复
13
ulystronglll| | 2024-1-5 20:15 | 只看该作者
DMA的时钟需要与外设的时钟相匹配,否则会导致传输错误。

使用特权

评论回复
14
biechedan| | 2024-1-6 19:05 | 只看该作者
确认内存缓冲区的分配和访问权限,确保数据传输的源地址和目标地址有效。

使用特权

评论回复
15
phoenixwhite| | 2024-1-6 19:27 | 只看该作者
检查是否存在硬件故障,如DMA通道故障、UART故障或其他相关硬件组件的问题。

使用特权

评论回复
16
wwppd| | 2024-1-6 19:51 | 只看该作者
在DMA传输过程中,实时监测数据传输情况,如信号强度、误码率等。当发现传输错误时,及时采取措施进行处理。

使用特权

评论回复
17
everyrobin| | 2024-1-6 21:36 | 只看该作者
这可能是由于传输数据时发生错误,导致TEIF标志被设置。

使用特权

评论回复
18
ccook11| | 2024-1-6 22:26 | 只看该作者
检查DMA传输模式的设置是否正确。

使用特权

评论回复
19
qiufengsd| | 2024-1-7 22:04 | 只看该作者
如果程序试图访问无效的内存地址或未初始化的缓冲区,就可能引发中断。这可能是由于编译器设置、RAM配置或内存布局问题引起的。

使用特权

评论回复
20
iyoum| | 2024-1-8 13:02 | 只看该作者
如果一次性要接收的数据超过DMA缓冲区大小,就无法正确处理。需要调整DMA缓冲区大小或者使用循环模式。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

940

主题

11975

帖子

6

粉丝