定时器触发ADC ADC中断问题 开了ADC中断就卡死了

2019-10-15 22:37发布

ADC配置
void ADC_Configuration(void)
{
        GPIOA->CRL&=0XFFFFF0Ff;   //PA2êäèë         
        RCC->APB2ENR|=1<<2|1<<9;  //&#191;a&#198;&#244Aê±&#214;ó  ADCê±&#214;ó
        RCC->APB2RSTR|=1<<9;      //&#184;′&#206;&#187;ADC1
        RCC->APB2RSTR&=~(1<<9);   // &#184;′&#206;&#187;íê3é &#189;&#171;&#184;′&#206;&#187;1&#216;±&#213;
        RCC->CFGR|=2<<14;         // éè&#214;&#195;&#206;a4·&#214;&#198;μ&#184;&#248;ADC 12M

        ADC1->CR1|=1<<8;      //&#191;a&#198;&#244;é¨&#195;è&#196;£ê&#189;
        ADC1->CR1|=1<<5;      //&#212;êDí&#214;D&#182;&#207;
        ADC1->CR2|=1<<0;      //&#191;a&#198;&#244;ad
        ADC1->CR2|=0<<1;      //μ¥′&#206;×a&#187;&#187;
        ADC1->CR2|=1<<2;      //adD£×&#188;
        while(ADC1->CR2&1<<2);//
        ADC1->CR2|=1<<3;      //
        while(ADC1->CR2&1<<3);//
        ADC1->CR2|=1<<8;      //ê1&#196;üDMA
        ADC1->CR2|=3<<17;     //
        ADC1->CR2|=1<<20;     //
        ADC1->SMPR2|=0<<6;    //


        ADC1->SQR1|=0<<20;    //
        ADC1->SQR3&=0xFFFFFFE0;                //1&#230;&#212;òDòáD1 í¨μàch
        ADC1->SQR3|=2;
       
        MY_NVIC_Init(1,3,ADC1_2_IRQn,2);//&#199;à&#213;&#188;1£&#172;×óó&#197;&#207;è&#188;&#182;3£&#172;×é2       
}
void ADC_IRQHandler(void)
{
        ADC_ClearITPendingBit(ADC1, ADC_IT_EOC);
        FFT_IN[ADC_Count]= ADC_ConvertedValue;
        if(ADC_Count<=255)ADC_Count++;
        else
        {
                        TIM2->CR1&=~(1<<0);   //1&#216;±&#213;&#182;¨ê±&#198;÷2
                        ADC_Count=0;
                        adc_over=1;
        }       
}
定时器配置
void TIM_Configuration(void)
{
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;  
       
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 ,ENABLE);
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3 ,ENABLE);

        RCC->APB1ENR|=1<<0;   
        TIM2->CCMR1|=7<<12;  
        TIM2->CCMR1|=1<<11;   
        TIM2->ARR=1900;     
        TIM2->SC=0;         
        TIM2->CCR2=0x23;   
        TIM2->CR1=0x8000;   

        TIM2->CCER|=1<<4;
        TIM2->CR1|=0x01;  

       
        TIM_TimeBaseStructure.TIM_Period = 800;                        //&#188;&#198;êy&#214;μ   
        TIM_TimeBaseStructure.TIM_Prescaler = 72-1;            //&#212;¤·&#214;&#198;μ,′&#203;&#214;μ+1&#206;a·&#214;&#198;μμ&#196;3yêy        &#188;&#198;êy&#203;ù&#182;è1000K
        TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;          //
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;         //&#207;òé&#207;&#188;&#198;êy
       
        TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
       
        /*ê1&#196;ü&#212;¤×°&#212;&#216;*/
        TIM_ARRPreloadConfig(TIM3, ENABLE);
        /*&#212;¤&#207;è&#199;&#229;3y&#203;ùóD&#214;D&#182;&#207;&#206;&#187;*/
        TIM_ClearITPendingBit(TIM3, TIM_IT_Update);

        /* ò&#231;3&#246;&#182;&#188;&#197;&#228;&#214;&#195;&#214;D&#182;&#207;*/
          TIM_ITConfig( TIM3,TIM_IT_Update, ENABLE);
       
        /* &#212;êDíTIM3&#191;aê&#188;&#188;&#198;êy */
        TIM_Cmd(TIM3, ENABLE);
        MY_NVIC_Init(1,3,TIM2_IRQn,2);//&#199;à&#213;&#188;0£&#172;×óó&#197;&#207;è&#188;&#182;3£&#172;×é2       
        MY_NVIC_Init(1,3,TIM3_IRQn,2);//&#199;à&#213;&#188;3£&#172;×óó&#197;&#207;è&#188;&#182;3£&#172;×é2       
}
DMA配置

void ADC_DMA_Configuration(void)
{
       
        DMA_InitTypeDef DMA_InitStructure;
        /* Enable DMA1 clock */
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
        //(2) 3&#245;ê&#188;&#187;ˉ DMA oí ADC &#196;£&#191;éó&#235;ó|ó&#195;3ìDò
        /* DMA channel1 configuration &#161;a&#161;a&#161;a&#161;a&#161;a&#161;a&#161;a&#161;a&#161;a&#161;a&#161;a&#161;a&#161;a&#161;a&#161;a-*/
        DMA_DeInit(DMA1_Channel1);
        DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;  // íaéèμ&#216;&#214;·
        DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADC_ConvertedValue; // &#196;ú′&#230;μ&#216;&#214;·
        DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;  // DMA ′&#171;ê&#228;·&#189;&#207;òμ¥&#207;ò
        DMA_InitStructure.DMA_BufferSize = 1;   // éè&#214;&#195;DMA&#212;ú′&#171;ê&#228;ê±&#187;o3&#229;&#199;&#248;μ&#196;3¤&#182;è word
        DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //éè&#214;&#195;DMAíaéèμY&#212;&#246;&#196;£ê&#189;
        DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable; // éè&#214;&#195;DMA&#196;ú′&#230;μY&#212;&#246;&#196;£ê&#189;
        DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;  // íaéèêy&#190;Y×&#214;3¤
        DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; //&#196;ú′&#230;êy&#190;Y×&#214;3¤
        DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;  // éè&#214;&#195;′&#171;ê&#228;&#196;£ê&#189;á&#172;D&#248;2&#187;&#182;&#207;μ&#196;&#209;-&#187;·&#196;£ê&#189;
        DMA_InitStructure.DMA_Priority = DMA_Priority_High; // éè&#214;&#195;DMAμ&#196;ó&#197;&#207;è&#188;&#182;±e
        DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; // éè&#214;&#195;DMAμ&#196;2&#184;&#246;memory&#214;Dμ&#196;±&#228;á&#191;&#187;¥&#207;à·&#195;&#206;ê
        DMA_Init(DMA1_Channel1, &DMA_InitStructure);

          /* Enable DMA1 channel1 */
    DMA_Cmd(DMA1_Channel1, ENABLE);

}

帮忙看下什么原因   谢谢  开了ADC中断程序就卡了  不开ADC中断  ADC采集的值是正确的  程序用库函数与寄存器混合的



友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。