Featured image of post LED

LED

LED

分析原理图

image-20260417011201950

image-20260417011252534

1
2
LED1   => 		PB1
LED2   => 		PB9    

image-20260417011504575

两个灯,想要实现多个功能,有点复杂,就是逻辑要弄好

目前:

  • 刚上电就闪烁 双灯慢闪 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);
    }

}
最后更新于 2026-04-18 01:45