定时器实现灯快慢闪烁

 LEDFLAG = 1 对应红蓝快闪,300ms变化一次

 LEDFLAG = 2 对应蓝灯常量

 LEDFLAG = 3 对应红蓝慢闪,600ms变化一次

 LEDFLAG = 4

……

#define LED1 GPIOA5
#define LED2 GPIOA6
#define LED3 GPIOA7

uint8_t LEDFLAG = 0;//控制LED闪烁

void userled_Init(void)//共阳接法
{
	GPIO_PortAModeSet(LED1, 0);// 0 设置普通模式
	GPIO_RegOneBitClear(GPIO_A_PD, LED1);//清除下拉
	GPIO_RegOneBitSet(GPIO_A_PU, LED1);//设置上拉
	GPIO_RegOneBitSet(GPIO_A_OUT, LED1);//设置输出

	GPIO_PortAModeSet(LED2, 0);// 0 设置普通模式
	GPIO_RegOneBitClear(GPIO_A_PD, LED2);//清除下拉
	GPIO_RegOneBitSet(GPIO_A_PU, LED2);//设置上拉
	GPIO_RegOneBitSet(GPIO_A_OUT, LED2);//设置输出

	GPIO_PortAModeSet(LED3, 0);// 0 设置普通模式
	GPIO_RegOneBitClear(GPIO_A_PD, LED3);//清除下拉
	GPIO_RegOneBitSet(GPIO_A_PU, LED3);//设置上拉
	GPIO_RegOneBitSet(GPIO_A_OUT, LED3);//设置输出

}
void usergreenled(uint8_t userledflag)// 0 off   1 on
{
	if(userledflag == 1){
	GPIO_RegOneBitClear(GPIO_A_OUT, GPIOA5);
	APP_DBG("green open\n");
		}else{
	GPIO_RegOneBitSet(GPIO_A_OUT, GPIOA5);
	APP_DBG("green close\n");
	}
}
void userredled(uint8_t userledflag)// 0 off   1 on
{
	if(userledflag == 1){
	GPIO_RegOneBitClear(GPIO_A_OUT, GPIOA6);
	APP_DBG("red open\n");
		}else{
	GPIO_RegOneBitSet(GPIO_A_OUT, GPIOA6);
	APP_DBG("red close\n");
	}
}

void userblueled(uint8_t userledflag)// 0 off   1 on
{
	if(userledflag == 1){
	GPIO_RegOneBitClear(GPIO_A_OUT, GPIOA7);
	APP_DBG("blue open\n");
		}else{
	GPIO_RegOneBitSet(GPIO_A_OUT, GPIOA7);
	APP_DBG("blue close\n");
	}
}

//300ms定时器
void Timer6Interrupt(void)
{
	static uint8_t index = 0;//控制开关灯,快闪
	static uint8_t index2 = 0;//控制开关灯,慢闪
	index++;
	
	switch (LEDFLAG)
	{
		case 0: break;
		case 1: userredled(index % 2);userblueled((index + 1) % 2);usergreenled(0); break;//红蓝快闪
		case 2: LEDFLAG = 0;userblueled(1);userredled(0);usergreenled(0); break;//蓝灯常量
		case 3: //红蓝慢闪
			if(index % 2)
			{
				index2++;

				userredled(index2 % 2);
				userblueled((index2 + 1) % 2);
				usergreenled(0);
			}
			break;
		case 4: LEDFLAG = 0;userblueled(0);userredled(0);usergreenled(1); break;//绿灯常亮
		case 5: LEDFLAG = 0;userblueled(0);userredled(0);usergreenled(0); break;//关灯
		default: break;
	}
}

uint8_t    等价于   unsigned char  0-255

index % 2  的结果一次0,一次1

index    index%2

 252,           0
 253,           1
 254,           0
 255,           1
     0,           0
     1,           1
     2,           0
     3,           1
     4,           0
     5,           1

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32是一款广泛应用于嵌入式系统的微控制器,通过定时器可以方便地实现LED闪烁功能。 首先,我们需要配置一个定时器来控制LED闪烁间隔。定时器可以选择使用内部的系统时钟作为时基,也可以通过外部时钟源提供时基。在本例中,我们选择使用内部时钟作为时基。 接下来,我们需要配置GPIO引脚来控制LED。STM32有多个GPIO引脚可以用来控制LED的亮灭状态。我们将一个GPIO引脚配置为输出模式,并连接到LED。 然后,我们需要编写代码来配置定时器和GPIO引脚,并实现LED闪烁。 首先,我们使用CubeMX来配置STM32的时钟源和GPIO引脚。我们选择一个合适的时钟源作为定时器的时基,同时将一个GPIO引脚配置为输出模式,并连接到LED。 然后,我们打开Keil或其他编程软件,编写C语言代码来实现LED闪烁。在代码中,我们使用定时器的中断功能来控制LED的亮灭状态。 首先,我们初始化定时器并配置定时器的参数,如定时器的预分频值和计数器的重载值。然后,我们使能定时器的中断,并编写一个中断服务函数来处理定时器中断。 在中断服务函数中,我们使用一个计数变量来记录中断的次数。当计数变量达到我们需要的闪烁间隔时,我们改变LED的状态,即改变GPIO引脚的电平状态,使LED闪烁。 最后,我们在主函数中启动定时器,并进入一个无限循环来保持程序的运行。在无限循环中,我们不需要做任何操作,因为LED闪烁将由定时器中断来实现。 通过上述步骤,我们成功实现了STM32通过定时器来控制LED闪烁功能。这样,每当定时器中断触发时,LED的状态就会改变,从而实现了LED闪烁效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值