🎬 秋野醬:《個人主頁》
🔥 個人專欄:《Java專欄》《Python專欄》
??心若有所向往,何懼道阻且長
文章目錄
- 點燈的兩種方式
- 灌入電流法
- 輸出電流法
- 擴展板點燈
- 點燈方式
- 點亮LED1-4
- 完整實現
點燈的兩種方式
不同顏色LED,達到相同亮度,對應的電壓不同,通常需要接入220Ω到10KΩ的限流電阻,阻值越小,LED越亮,反之LED越暗,以下兩種方式皆可。
灌入電流法
灌入電流接法:LED亮燈供電VCC由芯片外部提供,灌入MCU的GPIO_PIN引腳
● 優點:可提供較大電壓電流,讓燈更亮
● 缺點:外部電源大幅變化時,可能導致MCU引腳燒毀。
輸出電流法
輸出電流法:由MCU提供正極供電,使用推挽輸出模式可以讓一般LED亮起。通常接小LED用這種接法。
● 優點:安全可控
● 缺點:驅動能力有限
擴展板點燈
LED驅動包含什么功能?
- 初始化4個LED燈
- 打開某一個燈
- 關閉某一個燈
點燈方式
● 初始化所有IO為推挽輸出模式
● 默認將總開關LED_SW拉高,總開關關閉
● 默認將所有LED1-8拉高,為關閉狀態
● LED_SW總開關拉低導通(三極管為PNP型),所有LED陽極可有供電。
● 在總開關拉低導通時,任意LED直接拉低自己的IO即可點亮
點亮LED1-4
為了能夠應對批量初始化的需求,我們可以定義結構體來描述參數:
// 聲明gpio初始化所需參數的結構體
typedef struct {rcu_periph_enum rcu;uint32_t port;uint32_t pin;
} Led_GPIO_t;
進而聲明出所有的GPIO對應參數
// 聲明所有gpio對應參數的數組
Led_GPIO_t g_gpio_list[] = {{RCU_GPIOC, GPIOC, GPIO_PIN_6}, // LED_SW{RCU_GPIOD, GPIOD, GPIO_PIN_8}, // LED1{RCU_GPIOD, GPIOD, GPIO_PIN_9}, // LED2{RCU_GPIOD, GPIOD, GPIO_PIN_10}, // LED3{RCU_GPIOD, GPIOD, GPIO_PIN_11}, // LED4
};
完整實現
頭文件聲明
#ifndef __BSP_LEDS_H__
#define __BSP_LEDS_H__#include "gd32f4xx.h"#define LED1 1
#define LED2 2
#define LED3 3
#define LED4 4void bsp_leds_init();void bsp_led_turn_on(uint8_t led_index);void bsp_led_turn_off(uint8_t led_index);#endif
c文件實現
#include "bsp_leds.h"// 聲明gpio初始化所需參數的結構體
typedef struct {rcu_periph_enum rcu;uint32_t port;uint32_t pin;
} Led_GPIO_t;// 聲明所有gpio對應參數的數組
Led_GPIO_t g_gpio_list[] = {{RCU_GPIOC, GPIOC, GPIO_PIN_6}, // LED_SW{RCU_GPIOD, GPIOD, GPIO_PIN_8}, // LED1{RCU_GPIOD, GPIOD, GPIO_PIN_9}, // LED2{RCU_GPIOD, GPIOD, GPIO_PIN_10}, // LED3{RCU_GPIOD, GPIOD, GPIO_PIN_11}, // LED4
};// 用于計算數組長度的宏
#define MAX_LED_COUNT (sizeof(g_gpio_list) / sizeof(Led_GPIO_t))/*********************************************************** @brief LED GPIO初始化**********************************************************/
static void GPIO_config(rcu_periph_enum rcu, uint32_t port, uint32_t pin){// 初始化為推挽輸出模式rcu_periph_clock_enable(rcu);gpio_mode_set(port, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, pin);gpio_output_options_set(port, GPIO_OTYPE_PP, GPIO_OSPEED_MAX, pin);
}void bsp_leds_init(){uint8_t count = MAX_LED_COUNT;for(uint8_t i = 0; i < count; i++){Led_GPIO_t gpio = g_gpio_list[i];// 初始化GPIO_config(gpio.rcu,gpio.port, gpio.pin);// 默認全部拉高(關閉)gpio_bit_write(gpio.port, gpio.pin, SET);}// 總開關拉低(打開)gpio_bit_write(g_gpio_list[0].port, g_gpio_list[0].pin, RESET);
}// 開燈
void bsp_led_turn_on(uint8_t led_index){Led_GPIO_t gpio = g_gpio_list[led_index];gpio_bit_write(gpio.port, gpio.pin, RESET);
}// 關燈
void bsp_led_turn_off(uint8_t led_index){Led_GPIO_t gpio = g_gpio_list[led_index];gpio_bit_write(gpio.port, gpio.pin, SET);
}
主文件調用
#include "gd32f4xx.h"
#include "systick.h"
#include <stdio.h>#include "bsp_leds.h"/*********************
任務目標:點亮LED1-4**********************/int main(void) {// 系統滴答定時器初始化systick_config();// IO引腳初始化bsp_leds_init();while(1) {bsp_led_turn_on(LED1);bsp_led_turn_on(LED2);bsp_led_turn_on(LED3);bsp_led_turn_on(LED4);// 休眠500msdelay_1ms(500);bsp_led_turn_off(LED1);bsp_led_turn_off(LED2);bsp_led_turn_off(LED3);bsp_led_turn_off(LED4);// 休眠1000msdelay_1ms(500);}}