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 啊 确保ADC的配置与DMA传输相匹配,特别是采样时间、分辨率、通道选择等参数 DMA_DIR_PeripheralSRC实际上并不是STM32标准库或HAL库中定义的正确枚举值。正确的值应该是DMA_DIR_PeripheralToMemory。请检查您的库文档并更正这一点。 在循环模式下,当DMA到达缓冲区的末尾时,它会从缓冲区的开始继续传输。如果您的意图是处理固定数量的数据(如M*N个样本),则循环模式可能不是您想要的。通常,对于一次性传输,您应该使用正常模式(DMA_Mode_Normal)。 在中断处理函数中,您正确地清除了中断挂起位和标志位。但是,请确保这些操作与您的STM32库版本兼容。在某些版本中,可能只需要清除挂起位,而在其他版本中,可能需要同时清除标志位和挂起位。 您设置了NVIC的中断优先级和抢占优先级。请确保这些设置与您的系统要求兼容,并且不会与其他中断产生冲突。 确保您的ADC配置正确,并且已经启动了ADC转换。此外,您需要确保ADC的转换完成信号(如EOC标志)能够触发DMA请求。这通常需要在ADC的配置中启用DMA请求。 确保在中断向量表中正确配置了DMA传输一半和传输完成的中断处理程序
检查中断优先级设置,确保DMA中断的优先级足够高,以便在发生中断时能够及时响应
在初始化DMA时,需要确保开启了相应的中断使能位
在中断服务程序中,需要清除中断标志位,以便下一次中断能够正常触发
页:
[1]