ARM32开发——LED点灯

server/2024/9/23 4:29:41/

🎬 秋野酱:《个人主页》
🔥 个人专栏:《Java专栏》《Python专栏》

⛺️心若有所向往,何惧道阻且长

文章目录

    • 点灯的两种方式
    • 灌入电流法
    • 输出电流法
    • 扩展板点灯
    • 点灯方式
    • 点亮LED1-4
    • 完整实现

点灯的两种方式

不同颜色LED,达到相同亮度,对应的电压不同,通常需要接入220Ω到10KΩ的限流电阻,阻值越小,LED越亮,反之LED越暗,以下两种方式皆可。

灌入电流法

在这里插入图片描述

灌入电流接法:LED亮灯供电VCC由芯片外部提供,灌入MCU的GPIO_PIN引脚
● 优点:可提供较大电压电流,让灯更亮
● 缺点:外部电源大幅变化时,可能导致MCU引脚烧毁。

输出电流法

在这里插入图片描述

输出电流法:由MCU提供正极供电,使用推挽输出模式可以让一般LED亮起。通常接小LED用这种接法。
● 优点:安全可控
● 缺点:驱动能力有限

扩展板点灯

在这里插入图片描述
LED驱动包含什么功能?

  1. 初始化4个LED灯
  2. 打开某一个灯
  3. 关闭某一个灯

在这里插入图片描述

点灯方式

● 初始化所有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);}}

http://www.ppmy.cn/server/46267.html

相关文章

.Net 基于MiniExcel的导入功能接口示例

/// <summary>/// 导入/// </summary>/// <param name"formFile"></param>/// <returns></returns>[HttpPost("Import")]public async Task<ExecResult> Import(IFormFile formFile){try{if (formFile null) t…

【计算Nei遗传距离】

报错 Warning message: In adegenet::df2genind(t(x), sep sep, ...) : Markers with no scored alleles have been removed 原因&#xff1a; 直接用plink转换为VCF&#xff0c;丢失了等位基因分型&#xff08;REF ALT&#xff09; &#xff08;plink编码的规则&…

题目:一个偶数总能表示为两个素数之和。

题目&#xff1a;一个偶数总能表示为两个素数之和。 There is no nutrition in the blog content. After reading it, you will not only suffer from malnutrition, but also impotence. The blog content is all parallel goods. Those who are worried about being cheated …

Oracle RAC 集群配置共享目录ACFS

Oracle RAC 集群配置共享目录ACFS 应用场景&#xff1a;创建的ACFS文件系统用于部署OGG做数据同步使用。 1、创建共享磁盘组 create diskgroup OGG external redundancy disk /dev/mapper/ASM08, /dev/mapper/ASM09; 2、创建 acfs 文件系统 ACFS文件系统 在ASM磁盘组中通过A…

利用映射算子打印菱形

文章目录 一、利用RDD完成&#xff08;一&#xff09;右半菱形&#xff08;二&#xff09;左半菱形&#xff08;三&#xff09;完整菱形&#xff08;四&#xff09;输出任意大菱形 二、利用Java完成&#xff08;一&#xff09;右半菱形&#xff08;二&#xff09;左半菱形&…

JDBC入门基础

目录 JDBC的基本概念 快速入门&#xff08;基本步骤&#xff09; 创建数据库 注册驱动&#xff08;可以省略不写&#xff09; 获取连接对象 获取执行SQL语句的对象 编写SQL语句&#xff0c;并执行&#xff0c;以及接收返回的结果 处理结果&#xff0c;遍历结果集和 释放资源&…

C语言王国——杨氏矩阵

目录 1. 引言 2. 了解杨氏矩阵 3. 思路分析 4. 代码 5. 总结 1. 引言 最近在做二维数组的训练的时候发现了一个很有意思的题&#xff1a; 一看这不是杨氏矩阵嘛&#xff0c;接下来就由姜糖我带大家了解一下这个著名的矩阵。 2. 了解杨氏矩阵 通过查阅百度得知&#xff1a; …

jenkins插件之plot

plot是一个生成图表的插件&#xff0c;这里我用于可视化phploc统计的数据 插件安装 进入 Dashboard --> 系统管理 --> 插件管理 --> Available plugins 搜索plot安装生成phploc分析数据 Dashboard --> 您的项目 --> Configuration点击 Build Steps点击 增加构…