flycamelaaa 发表于 2024-10-24 10:55

ADC采集DMA传输出现问题

我用ADC采集三路电压,然后用DMA传输,但是我对DMA传输一半和传输完成设置了中断,但是似乎并没有进入到中断函数中,以下是我的程序,大神们请看看哪里出错了?
NVIC_InitTypeDef NVIC_InitStructure;
DMA_InitTypeDef DMA_InitStructure;
      RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);      //ê1ÄüDMA′«êä
      
      NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel1_IRQn;//
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =1; //
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;            //
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;       //
NVIC_Init(&NVIC_InitStructure);
      
DMA_DeInit(DMA1_Channel1);   //½«DMAμÄí¨μà1¼Ä′æÆ÷ÖØéèÎaè±ê¡Öμ
      //DMA1_MEM_LEN=cndtr;
      DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&ADC1->DR;//DMAíaéè»ùμØÖ·
      DMA_InitStructure.DMA_MemoryBaseAddr = (u32)AD_Value;//DMAÄú′æ»ùμØÖ·
      DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;//êy¾Y′«êä·½Ïò£¬′óÄú′æ¶áè¡·¢Ëíμ½íaéè
      DMA_InitStructure.DMA_BufferSize = M*N;//DMAí¨μàμÄDMA»o′æμÄ′óD¡
      DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//íaéèμØÖ·¼Ä′æÆ÷2»±ä
      DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//Äú′æμØÖ·¼Ä′æÆ÷μYÔö
      DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;//êy¾Y¿í¶èÎa8λ
      DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word; //êy¾Y¿í¶èÎa8λ
      DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;//1¤×÷ÔúÕy3£Ä£ê½
      DMA_InitStructure.DMA_Priority = DMA_Priority_High; //DMAí¨μà xóμóDÖDóÅÏè¼¶
      DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;//DMAí¨μàxûóDéèÖÃÎaÄú′æμ½Äú′æ′«êä
      DMA_Init(DMA1_Channel1, &DMA_InitStructure);//¸ù¾YDMA_InitStructÖDÖ¸¶¨μÄ2Îêy3õê¼»ˉDMAμÄí¨μàUSART1_Tx_DMA_ChannelËù±êê¶μļÄ′æÆ÷

      DMA_ITConfig(DMA1_Channel1, DMA_IT_HT,ENABLE);//′«êä1y°ë
      DMA_ITConfig(DMA1_Channel1, DMA_IT_TC,ENABLE);//′«êäíê3éÖD¶Ï

       DMA_Cmd(DMA1_Channel1, ENABLE);
以上是我的DMA设置,
void DMA1_Channel1_IRQHandler(void)
{
      if(DMA_GetITStatus(DMA1_IT_HT1)!=RESET)
      {
                DMA_ClearITPendingBit(DMA1_IT_HT1);//′«êäò»°ë
                DMA_ClearFlag(DMA1_FLAG_HT1);
                flag=1;
      }
      if(DMA_GetITStatus(DMA1_IT_TC1)!=RESET)
      {
                DMA_ClearITPendingBit(DMA1_IT_TC1);//′«êäíê3é±êÖ¾
    DMA_ClearFlag(DMA1_FLAG_TC1);
                flag=2;
      }
               
}

这是我的中断函数,设置在STM32f10x_it.c.,然后adc我也都设置好了,但是这个flag似乎一直不变为1,我设置是传输到一半就变为1 啊

tpgf 发表于 2024-11-7 11:10

确保ADC的配置与DMA传输相匹配,特别是采样时间、分辨率、通道选择等参数

duo点 发表于 2024-11-7 13:31

DMA_DIR_PeripheralSRC实际上并不是STM32标准库或HAL库中定义的正确枚举值。正确的值应该是DMA_DIR_PeripheralToMemory。请检查您的库文档并更正这一点。

laocuo1142 发表于 2024-11-7 14:23

在循环模式下,当DMA到达缓冲区的末尾时,它会从缓冲区的开始继续传输。如果您的意图是处理固定数量的数据(如M*N个样本),则循环模式可能不是您想要的。通常,对于一次性传输,您应该使用正常模式(DMA_Mode_Normal)。

powerantone 发表于 2024-11-7 16:00

在中断处理函数中,您正确地清除了中断挂起位和标志位。但是,请确保这些操作与您的STM32库版本兼容。在某些版本中,可能只需要清除挂起位,而在其他版本中,可能需要同时清除标志位和挂起位。

stormwind123 发表于 2024-11-7 20:23

您设置了NVIC的中断优先级和抢占优先级。请确保这些设置与您的系统要求兼容,并且不会与其他中断产生冲突。

probedog 发表于 2024-11-7 22:00

确保您的ADC配置正确,并且已经启动了ADC转换。此外,您需要确保ADC的转换完成信号(如EOC标志)能够触发DMA请求。这通常需要在ADC的配置中启用DMA请求。

wakayi 发表于 2024-11-8 22:29

确保在中断向量表中正确配置了DMA传输一半和传输完成的中断处理程序

wowu 发表于 2024-11-9 08:45

检查中断优先级设置,确保DMA中断的优先级足够高,以便在发生中断时能够及时响应

xiaoqizi 发表于 2024-11-9 10:43

在初始化DMA时,需要确保开启了相应的中断使能位

木木guainv 发表于 2024-11-9 11:59

在中断服务程序中,需要清除中断标志位,以便下一次中断能够正常触发
页: [1]
查看完整版本: ADC采集DMA传输出现问题