[STM32H7] H743 DMA传输错误中断的问题

[复制链接]
 楼主| 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 | 显示全部楼层
9856565961968c3167.png

这个错误主要是总线访问过程中出现的,你把内部SRAM换个地方试试,比方换到SRAM1,0x30000000~0x3001ffff.
lihuami 发表于 2024-1-4 17:03 | 显示全部楼层
DMA传输有多种模式,如字节传输、字传输等,如果传输模式设置不正确,可能会导致传输错误。
backlugin 发表于 2024-1-4 17:23 | 显示全部楼层
查阅H743单片机的官方文档和教程,了解其他用户在使用DMA时遇到的常见问题及解决方法。
eefas 发表于 2024-1-5 10:01 | 显示全部楼层
DMA配置正确,包括外设地址、主存储器地址、数据传输方向、数据传输长度等。错误的DMA配置可能导致传输错误。
burgessmaggie 发表于 2024-1-5 10:15 | 显示全部楼层
没有遗漏或错误。错误的中断和回调函数配置可能导致DMA传输错误。
mickit 发表于 2024-1-5 10:33 | 显示全部楼层
检查中断服务例程是否正确实现,并且在ISR中调用正确的函数来处理DMA传输错误中断。
plsbackup 发表于 2024-1-5 16:55 | 显示全部楼层
在STM32H743微控制器中,使用DMA(直接存储器访问)进行数据传输时,可能会遇到传输错误中断的问题。
qiufengsd 发表于 2024-1-5 18:03 | 显示全部楼层
DMA无法访问目标地址导致传输错误。需要检查RAM地址映射是否正确。
mnynt121 发表于 2024-1-5 19:36 | 显示全部楼层
确保DMA时钟使能,并且DMA传输相关的配置参数正确,例如传输方向、数据宽度、增量模式、传输模式等。
dspmana 发表于 2024-1-5 19:55 | 显示全部楼层
RAM地址映射错误              
ulystronglll 发表于 2024-1-5 20:15 | 显示全部楼层
DMA的时钟需要与外设的时钟相匹配,否则会导致传输错误。
biechedan 发表于 2024-1-6 19:05 | 显示全部楼层
确认内存缓冲区的分配和访问权限,确保数据传输的源地址和目标地址有效。
phoenixwhite 发表于 2024-1-6 19:27 | 显示全部楼层
检查是否存在硬件故障,如DMA通道故障、UART故障或其他相关硬件组件的问题。
wwppd 发表于 2024-1-6 19:51 | 显示全部楼层
在DMA传输过程中,实时监测数据传输情况,如信号强度、误码率等。当发现传输错误时,及时采取措施进行处理。
everyrobin 发表于 2024-1-6 21:36 | 显示全部楼层
这可能是由于传输数据时发生错误,导致TEIF标志被设置。
ccook11 发表于 2024-1-6 22:26 | 显示全部楼层
检查DMA传输模式的设置是否正确。
qiufengsd 发表于 2024-1-7 22:04 | 显示全部楼层
如果程序试图访问无效的内存地址或未初始化的缓冲区,就可能引发中断。这可能是由于编译器设置、RAM配置或内存布局问题引起的。
iyoum 发表于 2024-1-8 13:02 | 显示全部楼层
如果一次性要接收的数据超过DMA缓冲区大小,就无法正确处理。需要调整DMA缓冲区大小或者使用循环模式。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

940

主题

11975

帖子

6

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