LED
分析原理图
1
2
|
LED1 => PB1
LED2 => PB9
|
两个灯,想要实现多个功能,有点复杂,就是逻辑要弄好
目前:
- 刚上电就闪烁 双灯慢闪 500ms闪烁一次
- 通信成功就 双灯常亮
- 发生故障就 双灯快闪 200ms闪烁一次
程序
这个程序更简单
点亮就设置高电平 熄灭就设置低电平
使用HAL库自带的反转电平的函数,用来准备实现状态切换
Int_led.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
#include "Int_led.h"
/**
* @brief 点亮LED
*/
void Int_Led_On(LED_Struct_T *led){
HAL_GPIO_WritePin(led->port, led->pin, GPIO_PIN_SET);
}
/**
* @brief 关闭LED
*/
void Int_Led_Off(LED_Struct_T *led){
HAL_GPIO_WritePin(led->port, led->pin, GPIO_PIN_RESET);
}
/**
* @brief 切换LED状态
*/
void Int_Led_Toggle(LED_Struct_T *led){
HAL_GPIO_TogglePin(led->port, led->pin);
}
|
Int_led.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
#ifndef INT_LED_H
#define INT_LED_H
#include "main.h"
typedef struct{
GPIO_TypeDef *port;
uint16_t pin;
}LED_Struct_T;
/**
* @brief 点亮LED
*/
void Int_Led_On(LED_Struct_T *led);
/**
* @brief 关闭LED
*/
void Int_Led_Off(LED_Struct_T *led);
/**
* @brief 切换LED状态
*/
void Int_Led_Toggle(LED_Struct_T *led);
#endif // INT_LED_H
|
任务调用
LED的任务的优先级越低,只要LED灯能够正常闪烁,说明比它高的优先级也可以使用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
|
//LED结构体
LED_Struct_T led_1 = {
.port = LED1_GPIO_Port,
.pin = LED1_Pin,
};
LED_Struct_T led_2 = {
.port = LED2_GPIO_Port,
.pin = LED2_Pin,
};
//LED任务
void led_task( void * arg );
#define LED_CONTROL_STACK_SIZE 128
#define LED_CONTROL_PRIORITY 1
TaskHandle_t led_task_handle;
#define LED_TASK_PERIOD 100 //100ms
void led_task( void * arg ){
//获取基准时间
TickType_t xLastWakeTime = xTaskGetTickCount();
uint8_t count = 0;
while (1) {
count++;
//根据遥控器状态切换LED状态
if (remote_state == REMOTE_CONNECT) {
Int_Led_On(&led_1); //连接成功,双灯常亮
Int_Led_On(&led_2);
} else if(remote_state == REMOTE_DISCONNECT) {
if(count % 5 == 0) {
Int_Led_Toggle(&led_1); //连接失败,双灯慢闪 500ms闪烁一次
Int_Led_Toggle(&led_2);
}
}
if(flight_state == IDLE){
if(count % 5 == 0) {
Int_Led_Toggle(&led_1); //空闲,双灯慢闪 500ms闪烁一次
Int_Led_Toggle(&led_2);
}
} else if(flight_state == NORMAL){
Int_Led_On(&led_1); //正常,双灯常亮
Int_Led_On(&led_2);
}else if( flight_state == FIX_HEIGHT){
Int_Led_On(&led_1); //定高,双灯常亮
Int_Led_On(&led_2);
}else if( flight_state == FAIL){
if(count % 2 == 0) {
Int_Led_Toggle(&led_1); //故障,双灯块闪 200ms闪烁一次
Int_Led_Toggle(&led_2);
}
}
if(count == 10) {
count = 0; //
}
vTaskDelayUntil(&xLastWakeTime, LED_TASK_PERIOD);
}
}
|