调试中,为方便直观显示目前运行状态,一般会通过加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很方便的实现所需灯亮效果。
(来自爱小小真是太好了的图图)