首页 > 其他分享 >使用STM32实现按键控制LED

使用STM32实现按键控制LED

时间:2024-09-17 21:50:42浏览次数:10  
标签:NVIC LED void STM32 InitStructure 按键 GPIO EXTI

以下是一个使用STM32实现按键控制LED的代码示例,详细说明了每个步骤和代码的功能。

#include "stm32f4xx.h"

void GPIO_Configuration(void);
void EXTI_Configuration(void);
void LED_On(void);
void LED_Off(void);

int main(void)
{
    GPIO_Configuration();
    EXTI_Configuration();
    
    while(1)
    {
        // 无限循环,等待按键中断
    }
}

void GPIO_Configuration(void)
{
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);
    
    GPIO_InitTypeDef GPIO_InitStructure;
    
    // 配置PA0引脚为输入模式
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    
    // 配置PE0引脚为输出模式
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOE, &GPIO_InitStructure);
}

void EXTI_Configuration(void)
{
    EXTI_InitTypeDef EXTI_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;

    // 配置按键引脚触发外部中断
    GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);

    EXTI_InitStructure.EXTI_Line = EXTI_Line0;
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; // 上升沿触发
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    EXTI_Init(&EXTI_InitStructure);

    // 配置外部中断通道
    NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
}

void EXTI0_IRQHandler(void)
{
    if (EXTI_GetITStatus(EXTI_Line0) != RESET)
    {
        // 清除中断标志
        EXTI_ClearITPendingBit(EXTI_Line0);
        
        // 控制LED的开关状态
        if (GPIO_ReadOutputDataBit(GPIOE, GPIO_Pin_0))
        {
            LED_Off();
        }
        else
        {
            LED_On();
        }
    }
}

void LED_On(void)
{
    GPIO_SetBits(GPIOE, GPIO_Pin_0);
}

void LED_Off(void)
{
    GPIO_ResetBits(GPIOE, GPIO_Pin_0);
}

在这个示例中,我们使用了STM32F4系列的微控制器来实现按键控制LED的功能。以下是代码的详细说明:

  1. 首先,我们需要在 GPIO_Configuration 函数中对引脚进行配置。我们使用了A0作为输入引脚来连接按键,使用了E0作为输出引脚来控制LED。我们首先使能了GPIOA和GPIOE的时钟,然后使用 GPIO_InitTypeDef 结构体来配置引脚的模式、速率和上拉电阻。

  2. 接下来,在 EXTI_Configuration 函数中配置了外部中断。我们选择了A0引脚触发外部中断,配置了中断触发类型为上升沿触发,使能了外部中断。然后,我们还配置了NVIC(嵌套中断向量控制器)通道,优先级和使能外部中断中断通道。

  3. 然后,在 EXTI0_IRQHandler 函数中处理外部中断。我们首先检查是否是引脚0产生了中断,并清除中断标志位。然后根据当前LED的状态,选择打开或关闭LED。

  4. 最后,在 LED_OnLED_Off 函数中控制LED的开关状态。我们使用 GPIO_SetBitsGPIO_ResetBits 函数来设置和重置LED引脚的状态。

请注意,以上代码是一个简化版的示例,仅包含了按键中断和LED控制的核心代码。具体的STM32配置和引脚映射可能有所不同,需要根据具体的开发板和微控制器型号进行调整。此外,还需要在工程中包含相应的STM32库文件和配置文件。

标签:NVIC,LED,void,STM32,InitStructure,按键,GPIO,EXTI
From: https://blog.csdn.net/qq_34910341/article/details/142309601

相关文章

  • STM32智能小车--测距模块(舵机+HC_SR04超声波)
    大家好哇!我是湫湫,一个正在摸索嵌入式的普通大学生。进入正题,最近在做智能小车,想通过文章记录学习过程。本次文章主要使用 stm32F1C8T6实现小车测距。非常感谢大家的阅读,如果有不对的地方欢迎指正。目录一.实物图1.舵机2.HC_SR04:二.基本工作原理1.舵机工作原理2.......
  • STM32F407单片机编程入门(三)ADC详解及实战含源码
    文章目录一.概要二.STM32F407VET6单片机ADC外设特点三.STM32单片机ADC内部结构图1.ADC相关引脚说明2.ADC通道分类3.触发源4.转换周期5.电压转换计算6.更精确电压转换计算四.规则通道ADC采集信号流向1.单次转换模式2.连续转换模式五.CubeMX配置一个ADC采集例程六.CubeMX......
  • 蓝桥杯-STM32G431RBT6(串口)
    前言一、配置二、使用步骤1.串口发送代码逻辑效果展示2.串口接收单个字符代码逻辑中断回调函数3.串口接受字符串代码逻辑字符串函数中断回调函数声明代码开源前言一、配置二、使用步骤1.串口发送代码逻辑sprintf(tx_buf,"jinke\r\n"):这行代码使用......
  • 蓝桥杯—STM32G431RBT6按键的多方式使用(包含软件消抖方法精讲)从原理层面到实际应用(一)
    新建工程教程见http://t.csdnimg.cn/JySLg点亮LED教程见http://t.csdnimg.cn/Urlj5末尾含所有代码目录按键原理图一、按键使用需要解决的问题1.抖动   1.什么是抖动   2.抖动类型   3.如何去消除抖动FIRST.延时函数消抖(缺点:浪费CPU资源)SECOND.中......
  • LEDC Trigger 呼吸灯的工作原理
    LED的呼吸效果及其他触发器效果的实现通常涉及到内核线程或定时器,而不是直接依赖中断。下面详细说明这两种机制及其在LED触发器中的应用:###1.**内核线程**在Linux内核中,LED的呼吸效果或类似的周期性变化通常通过内核线程来实现。这些线程在内核中周期性地执行任务,比如调整LED......
  • stm32f103 MPU6050利用DMP进行姿态解算(硬件iic,hal库)
    ​最近在捣鼓平衡车,需要用到MPU6050进行姿态解算,参考了一些文章,也自己解决了一些问题参考:2_小学生都能搞定的MPU6050DMP库向STM32HAL库的移植_哔哩哔哩_bilibili由于在移植的时候用的DMP是官网下载,所以和视频的讲解有些许不同的地方,如果所有资料都是按照视频中来的话,理论上是......
  • error: rpmdb, failed: BDB1507 Thread died in Berkeley DB library,error(-30973) fro
    rpm数据库错误,一般原因:yum更新等rpm软件安装进程被异常终止[root@49bdfccd7f61~]#yuminstall-yxxxerror:rpmdb:BDB0113Thread/process22858/140222685267712failed:BDB1507ThreaddiedinBerkeleyDBlibraryerror:db5error(-30973)fromdbenv->failchk:BDB0......
  • Arduino uno 实现 oled机器表情
    突然想做个表情,但网上几乎没有代码只好自己做一个,如下://接线如下:oled-------arduinoGND    GNDVCC     5VSCL     A5SDA     A4/*OLED显示图片*/#include<Wire.h>#include<Adafruit_GFX.h>#include<Adafruit_SSD1306......
  • STM32入门教程:智能电机控制
    智能电机控制是STM32入门教程中的重要内容之一。本教程将以详细的代码案例来介绍如何使用STM32来控制智能电机。在开始之前,我们需要了解一些基本概念。智能电机通常由电机与控制器组成,控制器使用STM32等微控制器来实现对电机的控制。电机控制的最常见方式是使用PWM(脉宽调制)信......
  • STM32入门教程:身份证识别
    身份证识别是一种常见的图像处理应用,能够通过识别身份证上的文字信息,以获取身份证号码、姓名等重要个人信息。在本教程中,我们将使用STM32微控制器和相关的图像处理算法,来实现身份证识别功能。硬件准备首先,我们需要准备一块STM32开发板,以及相应的图像传感器。你可以选择使用......