stm32 ADC中断

时间:2017-11-25 16:34:54

标签: stm32f4discovery stm32f4

我在STM32 F407 Discovery上学习ADC编程,从最简单的情况开始 - 单次转换。 (连接到ADC1) 我正在使用StdPeriph正常情况下,当我没有使用中断并且在(1)在main()中执行它时,一切正常,但是当我想通过测量的输入值触发模数转换器时设为0

 void ADC_Config(){
   //purposly ommited
    }

void InitializeTimer_OnehundredthSecond(){
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
        TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;


    TIM_TimeBaseStructure.TIM_Period =99;
    TIM_TimeBaseStructure.TIM_Prescaler = 8399;
    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
    TIM_TimeBaseStructure.TIM_CounterMode =  TIM_CounterMode_Up;
    TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
    TIM_Cmd(TIM4, ENABLE);
}

void TIM4_NVIC_Config(){
    NVIC_InitTypeDef NVIC_InitStructure;
            // numer przerwania
            NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;
            // priorytet główny
            NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00;
            // subpriorytet
            NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;
            // uruchom dany kanał
            NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
            // zapisz wypełnioną strukturę do rejestrów
            NVIC_Init(&NVIC_InitStructure);

            // wyczyszczenie przerwania od timera 4 (wystąpiło przy konfiguracji timera)
            TIM_ClearITPendingBit(TIM4, TIM_IT_Update);
            // zezwolenie na przerwania od przepełnienia dla 4
            TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE);
}
int j=0;
int volatile ADC_Result=0;
void TIM4_IRQHandler(void)
{

    if(TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET)
    {

        ADC_SoftwareStartConv(ADC1);


        TIM_ClearITPendingBit(TIM4, TIM_IT_Update);
    }
}


void ADC1_1_IRQHandler(){

            while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);
            ADC_Result = ADC_GetConversionValue(ADC1);

}

int main(){


     ADC_Config();
     InitializeTimer_OnehundredthSecond();
     TIM4_NVIC_Config();
     TIM4_IRQHandler();
     ADC1_1_IRQHandler();
    while(1){


    }

}

1 个答案:

答案 0 :(得分:0)

我认为你的ADC中断处理程序永远不会被调用。 如果查看启动文件(startup_stm32f407xx.s),可以看到中断处理程序是:

  

DCD ADC_IRQHandler; ADC1,ADC2和ADC3s

在您的代码中,您有:

void ADC1_1_IRQHandler()

从未被调用过。所以你的变量保持为0。

ADC1_1_IRQHandler重命名为ADC_IRQHandler,这应该有用。

如果这不能解决您的问题,请分享ADC_Config

的代码