2017-11-25 202 views
0

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

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){ 


    } 

} 
+0

我会建议裸体注册方法,而不是这个英国媒体报道。你在这里有一个非常好的波兰教程:https://www.elektroda.pl/rtvforum/topic3111562.html –

回答

0

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

DCD ADC_IRQHandler; ADC1,ADC2和ADC3s

在您的代码,您有:

void ADC1_1_IRQHandler() 

它永远不会被调用。所以你的变量保持在0.

因此,将ADC1_1_IRQHandler重命名为ADC_IRQHandler,那应该工作。

如果这不保存您的问题,请分享ADC_Config的代码。

0

这里是工作代码。我已经解决了这个问题。调用IRQ就像我做的主要是一个坏主意。:/

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); 

    } 

    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_NVIC_Config(){ 

     NVIC_InitTypeDef NVIC_InitStructure; 


        NVIC_InitStructure.NVIC_IRQChannel = ADC_IRQn; 
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00; 
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00; 
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 
        NVIC_Init(&NVIC_InitStructure); 

        ADC_ClearITPendingBit(ADC1,ADC_IT_EOC); 
        ADC_ITConfig(ADC1, ADC_IT_EOC, ENABLE); 



    } 




    void ADC_IRQHandler(){ 

     if(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) != RESET){ 
     ADC_Result = ADC_GetConversionValue(ADC1); 


      //ADC_ClearITPendingBit(ADC1,ADC_FLAG_EOC);//<--clear automatically 
     } 
    } 

    int main(){ 



     ADC_Config(); 
     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); 
     ADC1_1_NVIC_Config(); 
     InitializeTimer_OnehundredthSecond(); 
     TIM4_NVIC_Config(); 
     TIM_Cmd(TIM4, ENABLE); 
     while(1){ 



     } 

    }