ADC采集DMA传输出现问题
时间:10-02
整理:3721RD
点击:
我用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 啊
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工作了没有
