打印
[其他ST产品]

ADC采集DMA传输出现问题

[复制链接]
452|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
flycamelaaa|  楼主 | 2024-10-24 10:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我用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)。

使用特权

评论回复
5
powerantone| | 2024-11-7 16:00 | 只看该作者
在中断处理函数中,您正确地清除了中断挂起位和标志位。但是,请确保这些操作与您的STM32库版本兼容。在某些版本中,可能只需要清除挂起位,而在其他版本中,可能需要同时清除标志位和挂起位。

使用特权

评论回复
6
stormwind123| | 2024-11-7 20:23 | 只看该作者
您设置了NVIC的中断优先级和抢占优先级。请确保这些设置与您的系统要求兼容,并且不会与其他中断产生冲突。

使用特权

评论回复
7
probedog| | 2024-11-7 22:00 | 只看该作者
确保您的ADC配置正确,并且已经启动了ADC转换。此外,您需要确保ADC的转换完成信号(如EOC标志)能够触发DMA请求。这通常需要在ADC的配置中启用DMA请求。

使用特权

评论回复
8
wakayi| | 2024-11-8 22:29 | 只看该作者
确保在中断向量表中正确配置了DMA传输一半和传输完成的中断处理程序

使用特权

评论回复
9
wowu| | 2024-11-9 08:45 | 只看该作者
检查中断优先级设置,确保DMA中断的优先级足够高,以便在发生中断时能够及时响应

使用特权

评论回复
10
xiaoqizi| | 2024-11-9 10:43 | 只看该作者
在初始化DMA时,需要确保开启了相应的中断使能位

使用特权

评论回复
11
木木guainv| | 2024-11-9 11:59 | 只看该作者
在中断服务程序中,需要清除中断标志位,以便下一次中断能够正常触发

使用特权

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

本版积分规则

655

主题

2728

帖子

0

粉丝