打印
[STM32F4]

ADC_DMA传输完成后无法进入中断

[复制链接]
4684|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xmu_stm|  楼主 | 2014-8-12 15:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
STM32F4做AD的采集,一共有10个通道,每采集完成3次就DMA中断一次,对采集到的数据进行处理,DMA工作是正常的,因为可以在目标数组中看到采集的值,但是现在程序无法进入DMA中断进行其他处理,ADC以及DMA配置代码如下,求大神挑错,万分感谢
void ADC_DMA_Configration(void)
{
          DMA_InitTypeDef DMA_InitStructure;
    DMA_DeInit(DMA2_Stream0);
   
    DMA_InitStructure.DMA_Channel = DMA_Channel_0;
    DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_CDR_ADDR; //ADC1_CDR 地址
    DMA_InitStructure.DMA_Memory0BaseAddr = (unsigned int)ADC_Value;//!!!!!!!!!
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
       
    DMA_InitStructure.DMA_BufferSize = 30;      //每3次采集完成后中断一次
    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;  //!!!!!关于DMA工作模式
    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;
    DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;                        //循环模式开启,Buf写满后,自动回到初始地址开始传输
    DMA_InitStructure.DMA_Priority = DMA_Priority_High;   
    DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;
    DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;
    DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
    DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;   
    DMA_Init(DMA2_Stream0, &DMA_InitStructure);
    DMA_ITConfig(DMA2_Stream0, DMA_IT_TC, ENABLE);
    DMA_Cmd(DMA2_Stream0, ENABLE);
}void ADC_Configration(void)
{
        ADC_CommonInitTypeDef ADC_CommonInitStructure;
  ADC_InitTypeDef ADC_InitStructure;
       
        /* ADC Common Init */
  ADC_CommonInitStructure.ADC_Mode = ADC_DualMode_RegSimult;
  ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div2;
  ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_1;              //每完成一次转换产生一个DMA请求
  ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;  //两个采样阶段之间的延迟
  ADC_CommonInit(&ADC_CommonInitStructure);
       
       
         /* ADC1 regular channel  configuration ************************************/
  ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
  ADC_InitStructure.ADC_ScanConvMode = ENABLE;                               //!!!!!!!!!!!!!主义
  ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
  ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
  ADC_InitStructure.ADC_NbrOfConversion = 5;
  ADC_Init(ADC1, &ADC_InitStructure);

  ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 1, ADC_SampleTime_3Cycles);
        ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 2, ADC_SampleTime_3Cycles);
  ADC_RegularChannelConfig(ADC1, ADC_Channel_12, 3, ADC_SampleTime_3Cycles);
        ADC_RegularChannelConfig(ADC1, ADC_Channel_13, 4, ADC_SampleTime_3Cycles);
        ADC_RegularChannelConfig(ADC1, ADC_Channel_14, 5, ADC_SampleTime_3Cycles);

         /* ADC2 regular channel configuration ************************************/
  ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
  ADC_InitStructure.ADC_ScanConvMode = ENABLE;                               //!!!!!!!!!!!!!主义
  ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
  ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
  ADC_InitStructure.ADC_NbrOfConversion = 5;
  ADC_Init(ADC2, &ADC_InitStructure);

  ADC_RegularChannelConfig(ADC2, ADC_Channel_0, 1, ADC_SampleTime_3Cycles);
  ADC_RegularChannelConfig(ADC2, ADC_Channel_5, 2, ADC_SampleTime_3Cycles);
  ADC_RegularChannelConfig(ADC2, ADC_Channel_6, 3, ADC_SampleTime_3Cycles);
  ADC_RegularChannelConfig(ADC2, ADC_Channel_7, 4, ADC_SampleTime_3Cycles);
  ADC_RegularChannelConfig(ADC2, ADC_Channel_15, 5, ADC_SampleTime_3Cycles);
       
       
  ADC_DMARequestAfterLastTransferCmd(ADC1, ENABLE);
  ADC_DMARequestAfterLastTransferCmd(ADC2, ENABLE);
  ADC_MultiModeDMARequestAfterLastTransferCmd(ENABLE);

  ADC_DMACmd(ADC1, ENABLE);//使能ADC1_DMA
  ADC_DMACmd(ADC2, ENABLE);
//ADC_ITConfig(ADC1, ADC_IT_EOC, ENABLE);
            
  ADC_Cmd(ADC1, ENABLE);  
  ADC_Cmd(ADC2, ENABLE);
  }





沙发
mmuuss586| | 2014-8-12 18:34 | 只看该作者
DMA中断配置了吗?

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
xmu_stm + 1 淡定
板凳
xmu_stm|  楼主 | 2014-8-12 23:48 | 只看该作者
mmuuss586 发表于 2014-8-12 18:34
DMA中断配置了吗?

这是配置函数,你看看对不
void DMA2_Stream0_IRQHandler(void){
        int i=0;
        if(DMA_GetITStatus(DMA2_Stream0,DMA_IT_TCIF0))
        {
                for(i=0;i<10;i++)
                {
                  local_size=(ADC_Value+ADC_Value[10+i]+ADC_Value[20+i])/3;
    }
          flag_PID=1;
          DMA_ClearITPendingBit(DMA2_Stream0,DMA_IT_TCIF0);
        }
}

使用特权

评论回复
地板
mmuuss586| | 2014-8-13 08:33 | 只看该作者
本帖最后由 mmuuss586 于 2014-8-13 08:35 编辑
xmu_stm 发表于 2014-8-12 23:48
这是配置函数,你看看对不
void DMA2_Stream0_IRQHandler(void){
        int i=0;


你这是中断程序;
中断初始化呢?
比如定时器中断:
* Descirbe  :
* Input     :
* Output    :
* Attention :
* author  :
***************************************************/
void NVIC_Config(void)
{
NVIC_InitTypeDef NVIC_InitStructure;       //¸´Î»NVIC¼Ä´æÆ÷ΪĬÈÏÖµ
/* Configure the NVIC Preemption Priority Bits */  
//  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);           //ÉèÖÃÖжÏÓÅÏȼ¶×é
/*ÅäÖÃEXTIÖжϼ°´¦ÀíÓÅÏȼ¶*/
NVIC_InitStructure.NVIC_IRQChannel = TIM1_TRG_COM_IRQn;//¿ªTIM1´¥·¢ÖжÏ
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  //¿ªTIM3ÖжÏ
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;   
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}

使用特权

评论回复
5
xmu_stm|  楼主 | 2014-8-13 09:24 | 只看该作者
本帖最后由 xmu_stm 于 2014-8-13 09:32 编辑
mmuuss586 发表于 2014-8-13 08:33
你这是中断程序;
中断初始化呢?
比如定时器中断:

void NVIC_Configuration(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;
  
#ifdef  VECT_TAB_RAM
  /* Set the Vector Table base location at 0x20000000 */
  NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
#else  /* VECT_TAB_FLASH  */
  /* Set the Vector Table base location at 0x08000000 */
  NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
#endif
  
  /* Configure the NVIC Preemption Priority Bits */  
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
  
  //USART1中断
  NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;              //
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
  
         //DMA 中断设置  
        // DMA_ClearFlag(DMA2_Stream0,DMA_FLAG_TCIF0);
  NVIC_InitStructure.NVIC_IRQChannel=DMA2_Stream0_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;               
  NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;
  NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
  NVIC_Init(&NVIC_InitStructure);   
}

使用特权

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

本版积分规则

11

主题

32

帖子

0

粉丝