STM32系统滴答定时器控灯

调试中,为方便直观显示目前运行状态,一般会通过加LED灯的方法,根据运行状态以不同颜色和闪烁频率呈现。
最开始我是把LED内三个灯分别用宏定义写了打开关闭反转等操作,然后实际用的时候就打开哪些灯关闭哪些灯,但想让灯闪烁就比较麻烦了,需要以固定频率关闭对应的灯,如果还以原先方法控制不同频率和颜色就更麻烦了。状态一旦多了每次得重复加且不利于维护,还有可能影响系统运行,所以这次准备彻底把这个问题解决,把led控制封装起来,这次用到了系统滴答定时器提供固定频率,普通定时器同理,特此记录一下。
直接上代码

/*******************************************
* Function Name : led_ctrl
* Description   : led控制
* Input         : color:颜色     blink_freq: 频率\ms
* Output        : None
* Author        : 
* Date          : 2023年4月13日
* Notes         : 
*******************************************/
void led_ctrl(LED_Struct_t LED_Struct_temp)
{
	if(sys_cnt >= LED_Struct_temp.frequency)//间隔时间大于等于设定值
	{
		if(blink_flag == 0)
		{
			switch(LED_Struct_temp.color)
			{
				case white:
					LED_ALL_ON();
					break;
				case red:
					LED_R_ON();
					LED_G_OFF();
					LED_B_OFF();
					break;
				case green:
					LED_R_OFF();
					LED_G_ON();
					LED_B_OFF();
					break;
				case blue:
					LED_R_OFF();
					LED_G_OFF();
					LED_B_ON();
					break;
				case cyan:
					LED_R_OFF();
					LED_G_ON();
					LED_B_ON();
					break;
				case purple:				
					LED_R_ON();
					LED_G_OFF();
					LED_B_ON();
					break;
				case yellow:
					LED_R_ON();
					LED_G_ON();
					LED_B_OFF();
					break;
				case close:
					LED_ALL_OFF();
					break;
					
				default:
					break;	
			}			
			blink_flag = 1;		
		}	
		else if(blink_flag == 1)
		{
			if(LED_Struct_temp.frequency != 0)
			{
				LED_ALL_OFF();
			}				
			blink_flag = 0;
		}			
		sys_cnt = 0;
	}		
}

这个函数放在定时器中,根据设定颜色和频率值去控制灯状态。
首先定义一个全局变量sys_cnt ,定时器每1ms中断一次时sys_cnt 加1。
led_ctrl输入为LED_Struct_t 类型结构体,包含颜色color和频率frequency(单位ms,表示多久闪烁一次),如下

typedef enum
{
	white = 0x00,
	red,
	green,
	blue,
	cyan,
	purple,
	yellow,
	close,
}color_enum;

typedef struct
{
	color_enum color;
	uint16_t frequency;
}LED_Struct_t;

当sys_cnt 累计到frequency以上时则会根据blink_flag 这个标志位决定灯是亮还是灭,blink_flag则每次亮灭后切换。每次闪烁后sys_cnt 清零,这样可避免另外定义一个变量去记录上一次计数值。
特别的当frequency为0时表示灯常亮,此时可不执行blink_flag为1时的关灯动作,否则灯亮度会减弱。

最后定义一个函数设定所需值方便在任何地方可以直接调用

/*******************************************
* Function Name : LED_Struct_Addr
* Description   : 返回LED_Struct
* Input         : 
* Output        : None
* Author        : 
* Date          : 2023年4月13日
* Notes         : 
*******************************************/
LED_Struct_t LED_Struct;
LED_Struct_t *LED_Struct_Addr()
{
	return &LED_Struct;
}
/*******************************************
* Function Name : led_blink
* Description   : 设定灯闪烁状态
* Input         : color_temp:灯颜色   freq_temp:闪烁频率
* Output        : None
* Author        : 
* Date          : 2023年4月13日
* Notes         : 
*******************************************/
void led_blink(color_enum color_temp,uint32_t freq_temp)
{
	LED_Struct_Addr()->color = color_temp;
	LED_Struct_Addr()->frequency = freq_temp;
}

此时在程序任意位置均可通过调用led_blink很方便的实现所需灯亮效果。
(来自爱小小真是太好了的图图)

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值