🎬 秋野酱:《个人主页》
🔥 个人专栏:《Java专栏》《Python专栏》
⛺️心若有所向往,何惧道阻且长
文章目录
点灯的两种方式
不同颜色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
为了能够应对批量初始化的需求,我们可以定义结构体来描述参数:
csharp
// 声明gpio初始化所需参数的结构体
typedef struct {
rcu_periph_enum rcu;
uint32_t port;
uint32_t pin;
} Led_GPIO_t;
进而声明出所有的GPIO对应参数
csharp
// 声明所有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
};
完整实现
头文件声明
csharp
#ifndef __BSP_LEDS_H__
#define __BSP_LEDS_H__
#include "gd32f4xx.h"
#define LED1 1
#define LED2 2
#define LED3 3
#define LED4 4
void bsp_leds_init();
void bsp_led_turn_on(uint8_t led_index);
void bsp_led_turn_off(uint8_t led_index);
#endif
c文件实现
csharp
#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);
}
主文件调用
csharp
#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);
// 休眠500ms
delay_1ms(500);
bsp_led_turn_off(LED1);
bsp_led_turn_off(LED2);
bsp_led_turn_off(LED3);
bsp_led_turn_off(LED4);
// 休眠1000ms
delay_1ms(500);
}
}