【问题标题】:stm32 ADC interruptstm32 ADC中断
【发布时间】:2017-11-25 16:34:54
【问题描述】:

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


    }

}

【问题讨论】:

标签: stm32f4discovery stm32f4


【解决方案1】:

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

DCD ADC_IRQHandler ; ADC1、ADC2和ADC3s

在您的代码中,您有:

void ADC1_1_IRQHandler()

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

所以将ADC1_1_IRQHandler 重命名为ADC_IRQHandler,这样应该可以。

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

【讨论】:

    【解决方案2】:

    这是工作代码。我已经解决了这个问题。像我在 main 中那样调用 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){
    
    
    
            }
    
        }
    

    【讨论】:

      猜你喜欢
      • 2020-02-08
      • 2021-11-20
      • 2020-07-08
      • 2020-11-12
      • 2014-09-07
      • 2016-05-10
      • 2015-04-03
      • 2022-01-03
      • 2018-06-20
      相关资源
      最近更新 更多