STM32开发03:切换LED亮灭状态

使用STM32CubeMX实现按键控制LED(中断方式) (本文是基于stm32f103c8t6加上LED组成的简易按键控制亮灯) 一、什么是中断 1、基础知识 cortex-m3支持256个中断,其中包含了16个内核中断,240个外部中断。(本博文只介绍60个外部可屏蔽中断) stm32只有84个中断,包括16个内核中断和68个可屏蔽中断 stm32f103上只有60个可屏蔽中断,f107上才有68个中断 先占优先级也就是抢占优先级,概念等同于51单片机中的中断。假设有两中断先后触发,已经在执行的中断先占优先级如果没有后触发的中断 先占优先级更高,就会先处理先 阅读详情

你好,这是我的第3篇原创分享,内容为实现LED的亮灭切换。

一、文章脉络

二、需求分析

本期博客实现的是一个比较简单的小功能,即通过GPIO引脚来点亮开发板上的三个LED灯,并切换亮灭状态。首先我们需要知道MCU和LED的电路连接:

开发中使用的MCU有着144个引脚,本期博客只截取部分,但也不难看出,其中有一个红灯是电源灯,通电即常亮,其他三个LED正极都接入3.3V,阴极分别接入PA0,PA1,PA8,由此可见,我们可以通过控制MCU向PA0,PA1,PA8发出低电平,使LED1,2,3点亮。

对于第二个需求:切换亮灭状态,则需要结合if()判断,即LED亮时,切换为灭,或者LED灭时,切换为亮,整体上并不难。

三、相关概念

3.1 GPIO

GPIO即 General Purpose Input/Output 的缩写,翻译成中文为通用功能输入输出引脚,本需求中只采用了其中的一种功能:通用推挽输出

3.2 模块化编程

模块化编程即在编写代码时将代码根据不同的层级分为一个个文件,没有统一标准,我在今后的文章中会采用以下的分类方法:分为Driver, Interface, Common, Application, Middle五个层级

Driver即驱动层,MCU内部的所有板块的功能选择都在这个层级中,如Cortex内核,GPIO,UART,IIC等模块,都封装在了MCU芯片内。

Interface即交互层,MCU和开发板上其他元器件之间的信息传输都在这个层级中,比如通过PA0向LED1传递高低电平就在这个层级下。

Common即通用层,所有常用的小工具都在这个层级中,比如延时,宏定义等等

Middle即中间层,主要放置和操作系统有关的代码。

Application即应用层,所有功能模块都放在这个层级中,随着代码的复杂,实现一个功能往往需要开发板上的许多模块一起配合,这些配合而成的功能就放在这个文件中。

四、代码实现

4.1 相关寄存器

实现LED亮灭切换用到了GPIO,并且需要通过寄存器的方式来控制GPIOA三个引脚的输出,下面是一些涉及到的寄存器及其标志位功能:

寄存器标志位
RCC-> APB2ENRIOPAEN:开启GPIOA模块的时钟
GPIOA->CRLCNF0[1:0],MODE0[1:0] : 设置PA0为通用推挽输出
CNF1[1:0],MODE1[1:0] : 设置PA1为通用推挽输出
GPIOA-> CRHCNF8[1:0],MODE8[1:0] : 设置PA8为通用推挽输出
GPIOA->ODRODR0:设置PA0输出高低电平
ODR1:设置PA1输出高低电平
ODR8:设置PA8输出高低电平
GPIOA->IDRIDR0:获取PA0引脚的电平值
IDR1:获取PA1引脚的电平值
IDR8:获取PA8引脚的电平值

4.2函数分解

在分析完需求之后,现在我们可以开始根据MCU手册编写我们的程序了,要做的第一件事情就是在Interface文件夹下创建Interface_LED.c &.h文件,并在Keil中添加C文件:

接下来在Interface_LED.h文件中声明函数原型:

#ifndef __INTERFACE_LED_H__

#define __INTERFACE_LED_H__

#define LED1 GPIO_ODR_ODR0

#define LED2 GPIO_ODR_ODR1

#define LED3 GPIO_ODR_ODR8

#define LED_GPIO GPIOA

  
#include <stdint.h>

#include "stm32f10x.h"

  
//LED初始化

void Interface_LED_Init(void);

  

//点亮指定的LED

void Interface_LED_On(uint16_t led);

  

//熄灭指定的LED

void Interface_LED_Off(uint16_t led);

  

//切换指定LED的亮灭状态

void Interface_LED_Toggle(uint16_t led);

  

//同时点亮多个LED

void Interface_LED_OnAll(uint16_t *leds,uint8_t len);

  

//同时熄灭多个LED

void Interface_LED_OffAll(uint16_t *leds,uint8_t len);

  
  
  

#endif /* __INTERFACE_LED_H__ */

第一个功能是时钟使能GPIOA,并将PA0设置为通用推挽输出,在这里将其封装为Interface_LED_Init()。

需要说明一点,GPIO本是MCU内部的模块,但单独设置它没有意义,它的任务是和外界做交互,所以它通常会作为其他功能的一部分,但不会单独设置。

void Interface_LED_Init(void)

{

        //1.时钟使能

    //*(uint32_t *)(0x40021000 + 0x18) = 0x0004;

    RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;

    //2.设置引脚的模式

    //*(uint32_t *)(0x40010800 + 0x00) = 0x44444443;

    //全部设置为通用推挽输出

    //PA8

    LED_GPIO->CRH &= ~GPIO_CRH_CNF8;

    LED_GPIO->CRH |= GPIO_CRH_MODE8;

    //PA1 + PA0

    LED_GPIO->CRL &= ~(GPIO_CRL_CNF1 | GPIO_CRL_CNF0);

    LED_GPIO->CRL |= (GPIO_CRL_MODE1 | GPIO_CRL_MODE0);

    //3.设置LED对应的引脚电平

    //起始时全都不亮

    LED_GPIO->ODR |=(LED1 | LED2 | LED3);

}

第二个功能是将某个LED点亮,设置函数的参数为led,在函数内部让对应的引脚输出低电平:

void Interface_LED_On(uint16_t led){

    LED_GPIO->ODR &= ~led;

}

第三个功能是将某个LED熄灭,和功能一就一点不同,即输出高电平:

void Interface_LED_Off(uint16_t led){

    LED_GPIO->ODR |= led;

}

第四个功能是点亮多个LED,提前将LED1,LED2,LED3这三个宏定义存在一个数组中,在函数内循环调用LED_On()即可:

uint16_t leds[3] = {LED1,LED2,LED3};

void Interface_LED_OnAll(uint16_t *leds,uint8_t len){

    for (uint8_t i = 0; i < len; i++)

    {

        Interface_LED_On(leds[i]);

    }

}

第五个功能是熄灭多个LED,在函数内循环调用LED_Off()即可,数组不必重复定义


void Interface_LED_OffAll(uint16_t *leds,uint8_t len){

    for(uint8_t i = 0; i < len; i++){

        Interface_LED_Off(leds[i]);

    }

}

最后一个功能稍难,即切换LED灯的亮灭状态,需要根据当前GPIOA引脚的状态进行if()条件判断:

void Interface_LED_Toggle(uint16_t led){

    //引脚如果是1则LED为熄灭状态

    if(LED_GPIO->IDR & led){

        //点亮LED

        Interface_LED_On(led);

    }else{
		//熄灭LED

        Interface_LED_Off(led);

    }

}

五、附录

编程环境烧录方式
VSCode + Keil MDKST-LINK

往期文章:

STM32开发02:创建第一个工程文件

STM32开发01:开发前的准备工作

STM32F407学习笔记——GPIO_按键控制LED亮灭 #include #include "stm32f4xx_conf.h" #include "delay.h" GPIO_TypeDef* io_led=GPIOC; const u16 pin_led=GPIO_Pin_1; GPIO_TypeDef* io_key=GPIOC; const u16 pin_key=GPIO_Pin_0; void Led_Init() { GPIO_I 阅读详情

相关推荐

【stm32----按键中断实验,按键控制LED灯】

1、按下KEY1,LED1亮,再次按下KEY1,LED1灭;2、按下KEY2,LED2亮,再次按下KEY2,LED2灭;3、按下KEY3,LED3亮,再次按下KEY3,LED3灭;依次按下key3、key2、key1、key2。结果应该为LED3、LED1亮,LED2灭;二、初始化函数及功能函数。

a1379292747的博客 9348

简单的LED交替闪烁程序

使STM32单片机LED交替闪烁 创建一个main.c 编入: #include "stm32f10x.h" #include "led.h" #include "delay.h" int main(void) { LED_Init(); Delay_Init(); while(1) { GPIO_ResetBits(GPIOB,GPIO_Pin_5); GPIO_SetBits(GPIOE,GPIO_Pin_5); DelayMs(500); G

qq_63192657的博客 4659

TX522与STM32串口通信(控制LED灯亮灭)

TX522与STM32串口通信(控制LED灯亮灭) TX522是mifare卡的读取模块,频率为13.56MHz,读取距离在0-10cm范围内。它的特点是只要有卡接近读取模块,就可以主动地通过UART的方式向上位机发送卡号。而网上关于TX522的使用说明都比较少,而关于TX522与STM32方面的使用更是难以寻找。这篇文章将通过一个串口通信的小程序,使STM32读取TX522发送过来的卡号控制LED灯亮灭。 TX522相关资料 mifare卡读写模块TX522B应用指南_V1.06 这是TX522的模块资料

weixin_44317461的博客 1405

【STM32】跑马灯实验

本文介绍了跑马灯实验中用到的一些寄存器,还有库函数版本,寄存器版本以及位带操作版本三种编程方式

weixin_63726869的博客 1万+

STM32入坑教程(二)让你的LED灯闪烁起来

单片机入坑教程(二)让你的LED灯闪烁起来 唠唠两句 上一个博客已经说了点亮一个LED灯的具体方法了,本次来说说如何让你的LED灯闪烁起来。 LED灯无非只有亮和灭两种状态,这两种状态其实我们都已经会了:给它加所需要的电压即亮,撤去电压即灭。这个可以根据实际电路给LED灯高低电平就可以了。一个小的LED灯,3.3v20ms足够了,直接用单片机的IO口就可以了。但是如果是大功率的小灯或者LED灯的数量比较多,还是建议外接驱动电路,不然会烧坏单片机。驱动电路无非就是搞个三极管搭一下电路,如果不会百度搜一下,有很

m0_46195580的博客 4789

02讲 | STM32单片机实现LED灯反转

点灯

小Y的博客 1万+

【STM32】基础篇 1.定时器TIM2计数翻转LED实验

讲解STM32基本定时器计数功能并以LED闪烁实验作为实践。

weixin_45540638的博客 4468

Windows系统的Mamba环境配置详细教程(状态空间模型)

causal_conv1d也是安装mamba的依赖必须库。安装完成后,通过pip list可以查看到安装的库。Triton是安装mamba的依赖,需要先安装。上述工作准备好后,按下面步骤安装。直接根据离线文件安装即可。是自己的虚拟环境名字。

2301_77831163的博客 3676

STM32——led灯的点亮+闪烁+流水灯的实现

其方式有两种一种是寄存器方式一种是库函数方式,但其原理都是一样的。如原理图所示,与LED相连接的IO口置低电平即可点亮led灯。原理:让连接的IO口先置零再置1可以使其先亮再灭,我们先使灯置1,然后宏定义让灯反转,delay一个时间,代码如下。使这四个灯轮流亮起-代码如下。

老王的博客 1万+

QuickFix Java 讲解(五)消息的收发与查看

本系列力求手把手教你怎样利用QuickFix Java 搭建自己的 FIX 协议收发平台,以及其中的注意事项。 所有源码的地址(免费): https://github.com/zongzhec/QuickFixPractise 这节我们讨论将Acceptor和Initiator启动以后,收到的消息极其查看方式。 6. 收发双方的通信 6.1. 启动后的通信和登录 为方便起见,这里我们使用统一的源码:https://github.com/zongzhec/QuickFixPractise ..

2246

高斯投影坐标正反算算法(python)

高斯坐标正反算算法,在正算的时候,y的第一个数字表示是用几度带换算的,第二个数字和第三个数字表示带号。该程序是根据武汉大学出版社出版的第三版的《大地测量学基础》编写, 用于课程实验学习。

weixin_64338372的博客 4588

stm32按键控制LED灯亮灭(中断法)

用按键控制STM32上的LED灯亮灭,可以采用轮询法和中断法。轮询法需要不断检测按键的状态,消耗MCU;而中断法只是在按下的那一刻触发中断,控制灯亮灭。轮询法相对于更常规,容易操作。因此我们这里讲的用中断法。关于中断的概述,这里不作介绍,只讲操作,分析代码,可以的话,欢迎上车。使用HAL库,不讲标准库的使用中断点灯就此结束,上述内容由我一个人整理,难免有疏漏。有问题欢迎留言讨论!

weixin_51772979的博客 1万+

【实战指南】Green Hills MULTI-IDE 从零安装到工程创建全流程

本文详细介绍了Green Hills MULTI-IDE从零安装到工程创建的全流程,包括系统要求检查、安装步骤、工程配置及调试技巧。特别适合嵌入式开发新手快速上手这款专业IDE工具,提升开发效率。

weixin_28740299的博客 474

按键控制LED的亮灭之stm32

读取数据寄存器的某一位,一般用于输出模式下,看自己输出的是什么。uint16_t GPIO_Pin:指定端口。用来读取输入数据的寄存器某个端口的输入值。uint16_t :每一位代表一个端口值。uint8_t:读取按键的高低电平。读取整个输入数据寄存器。读取整个输出数据寄存器。GPIOx:指定外设。

jjl24860的博客 5734

【胡学长 带你学 Global Mapper 】如何将影像地图转换为国家2000坐标系

多部门联合开展工作坐标数据不匹配怎么办?Hi,我是胡学长!今天教大家如何利用Global Mapper将谷歌影像数据转换为国家2000坐标系影像数据 。

一起来交流学习吧 1万+

AIOps智能运维:从数据治理到故障自愈的实践指南

AIOps(智能运维)通过融合人工智能与运维管理,构建了感知-决策-执行的闭环体系。其核心技术包括多维度数据采集、机器学习算法和自动化执行,显著提升了告警治理、故障定位和容量预测的效率。在数据层,全量性、实时性的数据采集是基础,而算法层的异常检测和根因分析则依赖统计方法、孤立森林和LSTM等模型。AIOps尤其适用于处理告警风暴和复杂系统故障,如在电商大促中通过K-Means聚类减少92%的告警量。随着云原生和边缘计算的普及,AIOps正逐步实现与Service Mesh、Serverless等技术的深度集

weixin_30175731的博客 288

STM32按键长按短按控制LED灯闪烁 同时可以按一下键切换一下状态

STM32程序:按键长按和短按的判断,用来控制LED灯,有借鉴了其他程序,但是有细节上的不同。 (因为这里做的按键是速度,所以写的SP,根据自己情况自己定义就好) 用定时器中断定时,配置部分就不写了,都差不多 time_key.c void TIM3_IRQHandler(void) //TIM3ÖÐ¶Ï { if (TIM_GetITStatus(TIM3, TIM_IT_Updat...

qq_43255107的博客 1万+

Ubuntu18.04环境搭建与疑难解析:从零复现YOLO-6D姿态估计算法

本文详细介绍了在Ubuntu18.04环境下从零开始复现YOLO-6D姿态估计算法的完整流程,包括系统配置、Conda环境搭建、PyTorch安装、依赖项管理、源代码获取、数据集准备以及训练验证过程。针对Singleshotpose算法的特殊需求,提供了详细的疑难解析和性能优化技巧,帮助开发者高效完成算法复现和应用部署。

weixin_30369041的博客 456

基于STM32hal库的按键检测+控制LED亮灭

针对WK_UP这种按键电路,按键按下时,单片机的引脚接到VCC,因此在未按下的情况下该引脚的默认电平为低电平,也就是要把IO设置为输入下拉模式。同理,对于K2和K3这种连接方式,对应IO应该配置为输入上拉模式,使得按键未被按下时,引脚处于高电平状态。首先,我们从原理图可以得到三个按键接单片机的引脚分别为PA0、PC15、PA15,所以我们要把这三个引脚配置为GPIO输入模式。两个LED一端接地,另一端分别接单片机的PA8和PD2引脚,所以我们要把这两个引脚配置成GPIO输出模式。

qq_65105107的博客 1766

海波龙(Hyperion,现属 Oracle)合并报表以 HFM(Hyperion Financial Management)为核心系统,方法论核心是以控制为基础确定合并范围,通过维度建模统一数据口径

摘要:海波龙合并报表系统(HFM)采用"规则驱动、维度建模"的方法论,通过四个核心环节实现自动化合并:确定合并范围、数据标准化、自动抵销调整及报表生成。系统支持多会计准则,以控制为基础划分合并方法(完全合并/权益法/成本法),通过维度建模统一数据口径,自动处理内部交易抵销、外币折算等复杂操作。业务操作流程涵盖数据采集、转换、抵销调整到报表生成全过程,关键控制点包括内部交易匹配、股权变动处理等。最终输出合规合并报表及完整审计线索,满足监管与管理需求。(150字)

金牌架构师 1304

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

土木本科生的STM32探索之旅:按键控 LED 的 “亮灭 + 翻转” 实战

摘要:本文介绍了STM32开发中从基础LED控制升级到按键交互控制的实践过程。通过STM32F103VET6开发板,实现了按键A控制LED0亮灭(按下亮/松开灭)和按键B控制LED1状态翻转的功能。文章详细讲解了硬件原理图分析、GPIO模式设置(上拉输入)、软件消抖处理等关键步骤,并分享了调试过程中遇到的典型问题及解决方法。作者作为土木专业学生,通过实践加深了对GPIO输入输出逻辑、硬件软件协同工作的理解,为后续传感器联动开发打下基础。实验采用了STM32CubeIDE开发环境,借助AI辅助代码编写和调试。

TMD_Forever的博客 1264

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

通过按键控制stm32最小系统板上LED的亮灭状态

通过按键控制stm32最小系统板上LED的亮灭状态

qq_61134394的博客 746

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

【STM32F10x串口通信控制LED输出模式以及亮灭】

实现简单的上位机控制单片机的功能 1. 默认状态:key0->绿灯翻转 key1->红灯翻转 2. 串口输入1:key0->红灯翻转 key1->绿灯翻转 3. 串口输入2:key0->全灯灭 key1->全灯灭 4. 串口输入3:测试用——> 红灯翻转 5. 串口输入4:测试用——> 绿灯翻转 6. 串口输入5:led流水灯......

m0_50629392的博客 5653

stm32按键反转led的亮灭

这个小实验主要还是利用到GPIO: 下面这个bsp_led.h文件使用寄存器版本写的 #ifndef __LED_H #define __LED_H #include"stm32f10x.h" //定义端口,时钟,引脚 #define red_PORT GPIOB #define red_PIN GPIO_Pin_5 #define red_LCK RCC_APB2P...

weixin_30326745的博客 2005

【免费下载】 基于STM32的红外人体感应器控制LED灯状态

基于STM32的红外人体感应器控制LED灯状态 【下载地址】基于STM32的红外人体感应器控制LED灯状态 本项目基于STM32微控制器,通过红外人体感应器实现对LED灯的控制。当红外传感器检测到人体时,LED灯会自动点亮;当人体离开感应范围时,LED灯会自动熄灭。此项目适用于智能家居、安防系统等场景,具有较高的实用价值...

gitblog_06524的博客 1139

【STM32学习笔记3---- 按键控制LED亮灭】

按键:常用输出设备,按下导通,松手断开。按键抖动:按键内部是机械式弹簧片,在按下和松手瞬间有抖动。一般按键都是低电平导通,也有高电平导通的,我这里使用的是低电平导通的按键。关键字:#define用途: 用一个字符代替一个数字,便于理解防出错,提取程序中常出现的参数,便于快速修改。12345//用ABC字符串代替12345//等效为 int a = 12345。

2201_76116332的博客 4412
上一篇: STM32开发02:创建第一个工程文件
_孙浩天_
博客等级 码龄4年 43粉丝 3原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值