首先,我们知道,比如我们要去实现灯的一秒一次的亮灭,一开始想到的办法肯定是加延时啦!大多数人想的肯定是:
OPEN_LED();
DELAY_MS(1000);
CLOSE_LED();
DELAY_MS(1000);
这种方法肯定可行啦,但是有没考虑一个后果,在delay的时候整个单片机的CPU都给你卡住了,系统就不会去运行别的代码,就死死卡在这里,所以,下面介绍一种用定时器卡LED灯反转的方法。配置TIM1定时器我就不说啦,省一点,其实也很简单。
主函数为:
if(LEDFlag == 0) //置个全局变量标志位
{
Time_Led = 1;//计算时间,比如我配置的TIM1是0.5秒进入一次中断,那么就是0.5秒溢出一次
LEDFlag = 1;
}
中断配置:
void TIM1_UP_IRQHandler(void)
{
if (TIM_GetITStatus(TIM1,TIM_IT_Update) != RESET)
{
TIM_ClearITPendingBit(TIM1,TIM_IT_Update);
Time_Led--;
if(Time_Led == 0 && LEDFlag == 1)
{
LED_TOGGLE; //LED反转,也就是亮变灭,灭变亮
LEDFlag = 0;
}
}
}
反转函数:
//需要自己找对应的引脚哦,这个我的开发板的引脚
#define digitalToggle(p,i) {p->ODR ^=i;} //输出反转状态
#define LED_TOGGLE digitalToggle(GPIOB,GPIO_Pin_5)
这样就大功告成啦,总的来说,使用定时器计数的方法去进行灯的频闪(还有很多示例啦)的好处就是,我这边的灯达到0.5秒操作一次,另外,我在别的.c文件我依旧可以去控制另外的事件,如果使用delay的话,你就不可以去跑别的程序了,整个CPU都会卡在灯这个亮灭这里。