ARM32开发——LED点灯

2024-06-01 08:44
文章标签 led 开发 点灯 arm32

本文主要是介绍ARM32开发——LED点灯,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

🎬 秋野酱:《个人主页》
🔥 个人专栏:《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);}}

这篇关于ARM32开发——LED点灯的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1020524

相关文章

使用Python开发一个带EPUB转换功能的Markdown编辑器

《使用Python开发一个带EPUB转换功能的Markdown编辑器》Markdown因其简单易用和强大的格式支持,成为了写作者、开发者及内容创作者的首选格式,本文将通过Python开发一个Markd... 目录应用概览代码结构与核心组件1. 初始化与布局 (__init__)2. 工具栏 (setup_t

Spring Shell 命令行实现交互式Shell应用开发

《SpringShell命令行实现交互式Shell应用开发》本文主要介绍了SpringShell命令行实现交互式Shell应用开发,能够帮助开发者快速构建功能丰富的命令行应用程序,具有一定的参考价... 目录引言一、Spring Shell概述二、创建命令类三、命令参数处理四、命令分组与帮助系统五、自定义S

Python通过模块化开发优化代码的技巧分享

《Python通过模块化开发优化代码的技巧分享》模块化开发就是把代码拆成一个个“零件”,该封装封装,该拆分拆分,下面小编就来和大家简单聊聊python如何用模块化开发进行代码优化吧... 目录什么是模块化开发如何拆分代码改进版:拆分成模块让模块更强大:使用 __init__.py你一定会遇到的问题模www.

Spring Security基于数据库的ABAC属性权限模型实战开发教程

《SpringSecurity基于数据库的ABAC属性权限模型实战开发教程》:本文主要介绍SpringSecurity基于数据库的ABAC属性权限模型实战开发教程,本文给大家介绍的非常详细,对大... 目录1. 前言2. 权限决策依据RBACABAC综合对比3. 数据库表结构说明4. 实战开始5. MyBA

使用Python开发一个简单的本地图片服务器

《使用Python开发一个简单的本地图片服务器》本文介绍了如何结合wxPython构建的图形用户界面GUI和Python内建的Web服务器功能,在本地网络中搭建一个私人的,即开即用的网页相册,文中的示... 目录项目目标核心技术栈代码深度解析完整代码工作流程主要功能与优势潜在改进与思考运行结果总结你是否曾经

Spring Boot + MyBatis Plus 高效开发实战从入门到进阶优化(推荐)

《SpringBoot+MyBatisPlus高效开发实战从入门到进阶优化(推荐)》本文将详细介绍SpringBoot+MyBatisPlus的完整开发流程,并深入剖析分页查询、批量操作、动... 目录Spring Boot + MyBATis Plus 高效开发实战:从入门到进阶优化1. MyBatis

Python基于wxPython和FFmpeg开发一个视频标签工具

《Python基于wxPython和FFmpeg开发一个视频标签工具》在当今数字媒体时代,视频内容的管理和标记变得越来越重要,无论是研究人员需要对实验视频进行时间点标记,还是个人用户希望对家庭视频进行... 目录引言1. 应用概述2. 技术栈分析2.1 核心库和模块2.2 wxpython作为GUI选择的优

利用Python开发Markdown表格结构转换为Excel工具

《利用Python开发Markdown表格结构转换为Excel工具》在数据管理和文档编写过程中,我们经常使用Markdown来记录表格数据,但它没有Excel使用方便,所以本文将使用Python编写一... 目录1.完整代码2. 项目概述3. 代码解析3.1 依赖库3.2 GUI 设计3.3 解析 Mark

利用Go语言开发文件操作工具轻松处理所有文件

《利用Go语言开发文件操作工具轻松处理所有文件》在后端开发中,文件操作是一个非常常见但又容易出错的场景,本文小编要向大家介绍一个强大的Go语言文件操作工具库,它能帮你轻松处理各种文件操作场景... 目录为什么需要这个工具?核心功能详解1. 文件/目录存javascript在性检查2. 批量创建目录3. 文件

基于Python开发批量提取Excel图片的小工具

《基于Python开发批量提取Excel图片的小工具》这篇文章主要为大家详细介绍了如何使用Python中的openpyxl库开发一个小工具,可以实现批量提取Excel图片,有需要的小伙伴可以参考一下... 目前有一个需求,就是批量读取当前目录下所有文件夹里的Excel文件,去获取出Excel文件中的图片,并