2016-12-17 80 views
0

我有smt32l1xx板,下面的代码不起作用。调试器显示pinA5已设置,但连接到此引脚的二极管仍然不亮。我不知道为什么。即使我在设置位后添加延迟,它不起作用。二极管连接到板上的PA5和GND。smt32中断。为什么我的二极管不闪烁?

#include <stm32l1xx.h> 

#define ENABLE 1 
#define DISABLE 0 


void TIM2_IRQHandler() //interrupt 
{ 
if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET) 
{ 
TIM_ClearITPendingBit(TIM2, TIM_IT_Update); 

if (GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_5)) 
GPIO_ResetBits(GPIOA, GPIO_Pin_5); //LED OFF 
else 
GPIO_SetBits(GPIOA, GPIO_Pin_5); //LED ON <- im here and still nothing 

} 
} 

int main(void) 
{ 
    /* gpio init struct */ 
    GPIO_InitTypeDef gpio; 
    TIM_TimeBaseInitTypeDef tim; 
    NVIC_InitTypeDef nvic; 
    /* reset rcc */ 
    RCC_DeInit(); 


    RCC_APB2PeriphClockCmd(RCC_AHBENR_GPIOAEN, ENABLE); 
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); 

    GPIO_StructInit(&gpio); 
     /* use pin 0 */ 
     gpio.GPIO_Pin = GPIO_Pin_5; 
     /* mode: output */ 
     gpio.GPIO_Mode = GPIO_Mode_OUT; 
     /* apply configuration */ 
     GPIO_Init(GPIOA, &gpio); 

    TIM_TimeBaseStructInit(&tim); //timer 
    tim.TIM_CounterMode = TIM_CounterMode_Up; 
    tim.TIM_Prescaler = 64000 - 1; 
    tim.TIM_Period = 1000 - 1; 
    TIM_TimeBaseInit(TIM2, &tim); 

    TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); 
    TIM_Cmd(TIM2, ENABLE); 

    nvic.NVIC_IRQChannel = TIM2_IRQn; //interrupt 
    nvic.NVIC_IRQChannelPreemptionPriority = 0; 
    nvic.NVIC_IRQChannelSubPriority = 0; 
    nvic.NVIC_IRQChannelCmd = ENABLE; 
    NVIC_Init(&nvic); 


    while (1) 
    { 

    } 
    /* never reached */ 
    return 0; 
} 
+0

需要尝试两件事,首先您可以在正常(非中断代码)下切换LED,以检查您的IO配置是否正确?其次是中断实际发生?你可以重复地在中断中打断点吗?尝试缩小问题的范围。 –

回答

1

要确保您的硬件已正确初始化,您应该使用STM32CubeMX。 看来,GPIOA时钟在AHB总线上,但是您可以拨打RCC_APB2PeriphClockCmd这是APB2。因此,尝试使用相当于AHB的东西,例如RCC_AHBPeriphClockCmd

+0

您不必使用STM32CubeMX。对初学者来说可能更容易,但我个人不喜欢使用它。尽管它们在旧版本和新版本之间有点混乱,但我倾向于使用HAL驱动程序。 –