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

这篇具有很好参考价值的文章主要介绍了【stm32----按键中断实验,按键控制LED灯】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

实验要求

1、按下KEY1,LED1亮,再次按下KEY1,LED1灭;
2、按下KEY2,LED2亮,再次按下KEY2,LED2灭;
3、按下KEY3,LED3亮,再次按下KEY3,LED3灭;

实验代码实现

一、头文件
1、gpio.h

#ifndef __GPIO_H__
#define __GPIO_H__
#define RCC_AHB4_ENSETR (*(volatile unsigned int*)0x50000A28)
typedef struct{
	volatile unsigned int MODER; 	//00
	volatile unsigned int OTYPER; 	//04
	volatile unsigned int OSPEEDR; 	//08
	volatile unsigned int PUPDR; 	//0C
	volatile unsigned int IDR; 		//10
	volatile unsigned int ODR; 		//14
}gpio_t;
#define GPIOE ((gpio_t*)0x50006000)
#define GPIOF ((gpio_t*)0x50007000)
//引脚封装
#define GPIO_PIN_0 0
#define GPIO_PIN_1 1
#define GPIO_PIN_2 2
#define GPIO_PIN_3 3
#define GPIO_PIN_4 4
#define GPIO_PIN_5 5
#define GPIO_PIN_6 6
#define GPIO_PIN_7 7
#define GPIO_PIN_8 8
#define GPIO_PIN_9 9
#define GPIO_PIN_10 10
#define GPIO_PIN_11 11
#define GPIO_PIN_12 12
#define GPIO_PIN_13 13
#define GPIO_PIN_14 14
#define GPIO_PIN_15 15

//封装模式寄存器
typedef enum{
	INPUT,
	OUTPUT,
	ALT,
	ANALOG,
}gpio_mode_t;
 
//封装输出类型寄存器
typedef enum{
	PP,
	OD,
}gpio_otyper_t;
 
//封装输出速度寄存器
typedef enum{
	LOW,
	MED,
	HIGH,
	VERY_HIGH,
}gpio_ospeedr_t;
 
//封装是否需要上下拉电阻
typedef enum{
	NO_PUPD,
	PU,
	PD,
}gpio_pupdr_t;
 
//封装输出高低电平
typedef enum{
	GPIO_RESET,
	GPIO_SET,
}gpio_status_t;

//封装初始化结构体
typedef struct{
	gpio_mode_t moder;	//模式
	gpio_otyper_t otyper;	//输出类型
	gpio_ospeedr_t speed;	//速率
	gpio_pupdr_t pupdr;		//是否需要上下拉电阻
}gpio_init_t;

//函数功能:初始化GPIO
void hal_gpio_init(gpio_t* gpiox,gpio_init_t* init,unsigned int pin);
//函数功能:操作GPIO引脚,实现亮灭
void hal_gpio_write(gpio_t* gpiox,unsigned int pin,gpio_status_t status);
void hal_gpio_turn(gpio_t* gpiox,unsigned int pin);

#endif


2、key.h

#ifndef __KEY_H__
#define __KEY_H__
//#include "stm32mp1xx_gpio.h"
#include "gpio.h"
#include "stm32mp1xx_rcc.h"
#include "stm32mp1xx_exti.h"
#include "stm32mp1xx_gic.h"

//PF9 key1初始化
void key1_gpio_init();      //GPIO章节初始化
void key1_exti_init();      //EXIT章节初始化
void key1_gicd_init();      //GICD层章节初始化
void key1_gicc_init();      //GICC层章节初始化
//PF7 key2初始化
void key2_gpio_init();      //GPIO章节初始化
void key2_exti_init();      //EXIT章节初始化
void key2_gicd_init();      //GICD层章节初始化
void key2_gicc_init();      //GICC层章节初始化
//PF8 key3初始化
void key3_gpio_init();      //GPIO章节初始化
void key3_exti_init();      //EXIT章节初始化
void key3_gicd_init();      //GICD层章节初始化
void key3_gicc_init();      //GICC层章节初始化
#endif

二、初始化函数及功能函数
1、gpio.c

#include "gpio.h"
//初始化GPIO
void hal_gpio_init(gpio_t* gpiox,gpio_init_t* init,unsigned int pin)
{
    //设置输出模式
    gpiox->MODER &=(~(0x3<<(pin*2)));
    gpiox->MODER |=(init->moder<<(pin*2));
    //设置输出类型
    gpiox->OTYPER &=(~(0x1<<pin));
    gpiox->OTYPER |=(init->otyper<<pin);
    //设置输出速率
    gpiox->OSPEEDR &=(~(0x3<<(pin*2)));
    gpiox->OSPEEDR |=(init->speed<<(pin*2));
    //是否上下拉电阻
    gpiox->PUPDR &=(~(0x3<<(pin*2)));
    gpiox->PUPDR |=(init->pupdr<<(pin*2));
}
//函数功能:操作GPIO引脚,实现亮灭
void hal_gpio_write(gpio_t* gpiox,unsigned int pin,gpio_status_t status)
{
    if(status==GPIO_SET)
    {
        gpiox->ODR |=(0x1<<pin);
    }
    else
    {
        gpiox->ODR &=(~(0x1<<pin));
    }
}
//按键交替亮灭
void hal_gpio_turn(gpio_t* gpiox,unsigned int pin)
{
    if((gpiox->ODR & (0x1<<pin))==0)
    {
        gpiox->ODR |=(0x1<<pin);
    }
    else
    {
        gpiox->ODR &=(~(0x1<<pin));
    }
}

2、key.c

#include "key.h"
/************key1初始化*************/
void key1_gpio_init()
{
    /****RCC章节初始化*******/
	//1.设置GPIOF组时钟使能
	RCC->MP_AHB4ENSETR |= (0x1 << 5);
	/****GPIO章节初始化*******/
	//1.设置PF9引脚为输入模式
	GPIOF->MODER &= (~(0x3 << 18));
}
void key1_exti_init()
{
    //设置PF9引脚与EXTI9控制器连接
    EXTI->EXTICR3 &=(~(0xff)<<8);
    EXTI->EXTICR3 |=(0x5<<8);
    //设置PF9引脚下降沿触发
    EXTI->FTSR1 |=(0x1<<9);
    //设置PF9引脚中断不屏蔽
    EXTI->C1IMR1 |=(0x1<<9);
}
void key1_gicd_init()
{
    //设置全局使能寄存器
    GICD->CTRL |=(0x1<<0);
    //设置中断使能寄存器
    GICD->ISENABLER[3] |=(0x1<<3);
    //设置GICD层中断优先级寄存器
    GICD->IPRIORITYR[24] &=(0x1f<<27);
    GICD->IPRIORITYR[24] |=(0x1<<27);
    //设置中断目标分配寄存器
    GICD->ITARGETSR[24] |=(0x3<<24);
}
void key1_gicc_init()
{
    //设置全局使能寄存器
    GICC->CTRL |=(0x1<<0);
    //设置GICC层中断优先级值
    GICC->PMR &=(~(0x1f)<<3);
    GICC->PMR |=(0x4<<3);
}
/************key2初始化*************/
void key2_gpio_init()
{
    //1.设置PF7引脚为输入模式
	GPIOF->MODER &= (~(0x3 << 14));
}
void key2_exti_init()
{
    //设置PF7引脚与EXTI7控制器连接
    EXTI->EXTICR2 &=(~(0xff<<24));
    EXTI->EXTICR2 |=(0x5<<24);
    //设置PF7引脚下降沿触发
    EXTI->FTSR1 |=(0x1<<7);
    //设置PF7引脚中断不屏蔽
    EXTI->C1IMR1 |=(0x1<<7);
}
void key2_gicd_init()
{
    //设置全局使能寄存器
    GICD->CTRL |=(0x1<<0);
    //设置中断使能寄存器
    GICD->ISENABLER[3] |=(0x1<<1);
    //设置GICD层中断优先级寄存器
    GICD->IPRIORITYR[24] &=(0x1f<<11);
    GICD->IPRIORITYR[24] |=(0x2<<11);
    //设置中断目标分配寄存器
    GICD->ITARGETSR[24] |=(0x3<<8);
}
void key2_gicc_init()
{
    //设置全局使能寄存器
    GICC->CTRL |=(0x1<<0);
    //设置GICC层中断优先级值
    GICC->PMR &=(~(0x1f)<<3);
    GICC->PMR |=(0x5<<3);
}
/************key3初始化*************/
void key3_gpio_init()
{
    //1.设置PF8引脚为输入模式
	GPIOF->MODER &= (~(0x3 << 16));
}
void key3_exti_init()
{
    //设置PF8引脚与EXTI9控制器连接
    EXTI->EXTICR3 &=(~(0xff)<<0);
    EXTI->EXTICR3 |=(0x5<<0);
    //设置PF8引脚下降沿触发
    EXTI->FTSR1 |=(0x1<<8);
    //设置PF8引脚中断不屏蔽
    EXTI->C1IMR1 |=(0x1<<8);
}
void key3_gicd_init()
{
    //设置全局使能寄存器
    GICD->CTRL |=(0x1<<0);
    //设置中断使能寄存器
    GICD->ISENABLER[3] |=(0x1<<2);
    //设置GICD层中断优先级寄存器
    GICD->IPRIORITYR[24] &=(0x1f<<19);
    GICD->IPRIORITYR[24] |=(0x3<<19);
    //设置中断目标分配寄存器
    GICD->ITARGETSR[24] |=(0x3<<16);
}
void key3_gicc_init()
{
    //设置全局使能寄存器
    GICC->CTRL |=(0x1<<0);
    //设置GICC层中断优先级值
    GICC->PMR &=(~(0x1f)<<3);
    GICC->PMR |=(0x6<<3);
}

三、中断处理函数
do_irq.c

#include "key.h"
extern void printf(const char *fmt, ...);
extern void delay_ms(int ms);
unsigned int i = 0;
void do_irq(void)
{
    unsigned int num = 0;
    // 获取中断号
    num = GICC->IAR;
    switch (num)
    {
    case 97:
        delay_ms(500);
        printf("key2 is pressed  \n");
        hal_gpio_turn(GPIOF, GPIO_PIN_10);
        // 清除EXTI层中断挂起标志位
        EXTI->FPR1 |= (0x1 << 7);
        // 清除GICD层中断挂起标志位
        GICD->ICPENDR[3] |= (0x1 << 1);
        break;

    case 98:
        delay_ms(500);
        printf("key3 is pressed  \n");
        hal_gpio_turn(GPIOE, GPIO_PIN_8);
        // 清除EXTI层中断挂起标志位
        EXTI->FPR1 |= (0x1 << 8);
        // 清除GICD层中断挂起标志位
        GICD->ICPENDR[3] |= (0x1 << 2);
        break;
    case 99:
        delay_ms(500);
        printf("key1 is pressed  \n");
        hal_gpio_turn(GPIOE, GPIO_PIN_10);
        // 清除EXTI层中断挂起标志位
        EXTI->FPR1 |= (0x1 << 9);
        // 清除GICD层中断挂起标志位
        GICD->ICPENDR[3] |= (0x1 << 3);
        break;
    }
    // 清除中断号
    GICC->EOIR &= (0x3ff << 0);
    GICC->EOIR |= num;
}

四、主函数
main.c

#include "key.h"
extern void printf(const char *fmt, ...);
void delay_ms(int ms)
{
	int i,j;
	for(i = 0; i < ms;i++)
		for (j = 0; j < 1800; j++);
}

void LED_init()
{
	//时钟使能
	RCC_AHB4_ENSETR |=(0x3<<4);
	//RCC_AHB4_ENSETR |=(0x1<<5);
	//初始化结构体
	gpio_init_t init={OUTPUT,PP,LOW,NO_PUPD};
	//LED初始化
	hal_gpio_init(GPIOE,&init,GPIO_PIN_10);		//LED1
	hal_gpio_init(GPIOF,&init,GPIO_PIN_10);		//LED2
	hal_gpio_init(GPIOE,&init,GPIO_PIN_8);		//LED3
}
int main()
{
	LED_init();
	/**********key1初始化************/
	key1_exti_init();
	key1_gicc_init();
	key1_gicd_init();
	key1_gpio_init();
	/**********key2初始化************/
	key2_exti_init();
	key2_gicc_init();
	key2_gicd_init();
	key2_gpio_init();
	/**********key3初始化************/
	key3_exti_init();
	key3_gicc_init();
	key3_gicd_init();
	key3_gpio_init();
	while(1)
	{
		
	}
	return 0;
}

实验结果

依次按下key3、key2、key1、key2
按键中断方式控制led灯实验报告,stm32,嵌入式硬件
结果应该为LED3、LED1亮,LED2灭;
按键中断方式控制led灯实验报告,stm32,嵌入式硬件文章来源地址https://www.toymoban.com/news/detail-767232.html

到了这里,关于【stm32----按键中断实验,按键控制LED灯】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【STM32】控制LED灯和蜂鸣器的按键实验

    🐱作者:一只大喵咪1201 🐱专栏:《STM32学习》 🔥格言: 你只管努力,剩下的交给时间! 本喵这次介绍的实验是按键实验,同样使用STM32F103ZE型号的芯片,在开发板上有4个按键,实验目的是每按一个按键就会让LED灯或者是蜂鸣器的工作状态发生反转,下面本喵来详细介绍。

    2024年02月03日
    浏览(45)
  • STM32G030C8T6:使用按键控制LED亮灭(外部中断)

    本专栏记录STM32开发各个功能的详细过程,方便自己后续查看,当然也供正在入门STM32单片机的兄弟们参考; 本小节的目标是,系统主频64 MHZ,采用高速外部晶振,通过KEY1 按键的PA0 引脚配置成中断输入引脚,PB9引脚配置成输出,每次按键,PA0 引脚就会进入一次外部中断,每进

    2024年02月05日
    浏览(31)
  • 驱动——按键中断控制LED灯实验

    要求:按键按一下灯亮,再按一下灯灭 注:由于开发板位置,为了方便一一对应观察,采用key1控制LED3,key2控制LED2,key3控制LED1 0、添加相关设备树节点信息 ①按键相关引脚,通过原理图可得: key1------gpiof9; key2------gpiof7; key3------gpiof8 ②LED灯相关引脚: led1-----gpioe10; led2---

    2023年04月18日
    浏览(25)
  • stm32单片机开关控制LED灯(中断方式)(proteus电路图)

      补充一点:拼多多上面LED额定电流20mA,额定电压2V,额定电阻100欧姆,后边这个是STM32 如果只是用面包板做实验,输入输出都不是很多,就直接用灌电流的方式把LED直接接到STM32了,即使是设计产品,如果能够直接接,那么肯定也是不会浪费钱去买额外的原件的,所以只有

    2024年02月11日
    浏览(31)
  • 2.外部中断方式检测按键输入并控制LED示例

    打断CPU执行正常的程序,转而处理紧急程序,然后返回原暂停的程序继续运行,就叫中断。 其中,系统中断表 及对应的说明 如下图所示: 我们可以按住 Ctrl 点击中断向量表中的 ISR 函数名,可以进入该函数,可以发现,这些系统函数虽然都定义了,但是没有编写其工作方式

    2024年04月13日
    浏览(30)
  • LED灯闪烁拓展实验——单按键控制LED灯不同闪烁方式

    实现平台:Vivado2018.3 1. 使用按键KEY0和KEY_1分别控制LED0和LED1两个LED灯的闪烁方式; 2. 当没有按键按下时,两个LED灯均不亮; 3. 当按键KEY0按下后,LED0灯闪烁,当按键KEY0再次按下后则LED1灯闪烁,如此循环往复; 4. 当按键KEY1按下后,LED0和LED1交替闪烁,当按键KEY1再次按下后则

    2024年01月23日
    浏览(31)
  • STM32按键控制LED

    1.利用模块化编程对LED 2.设置LED的几种状态(亮,灭,和利用按键反转电平) 3.按键 (1)按键初始化 (2)如果按键按下做什么(这里是控制LED) 4,主函数

    2024年02月12日
    浏览(30)
  • STM-32:按键控制LED灯 程序详解

    左边是STM322里电路每一个端口均可以配置的电路部分,右边部分是外接设备 电路图。 配置为 上拉输入模式的意思就是,VDD开关闭合,VSS开关断开。 浮空输入模式的意思就是,VDD开关断开,VSS开关断开。 下拉输入模式的意思就是,VDD开关断开,VSS开关闭合。 在 按键控制LE

    2024年02月12日
    浏览(31)
  • STM32之通过按键控制LED灯亮灭

    之前我们已经实现了LED灯的亮灭,我们对LED灯的结构应该有一个大致的了解。接下来我们对按键控制led进行学习。 首先我们要了解一下按键的结构。按键结构如图。  由此可知,此处我们有两种按键,一种是普通的按键KEY0, KEY1(KEY2),他们连接的串口分别是PE4, PE3(PE2),对应

    2024年02月08日
    浏览(34)
  • 【STM32】STM32学习笔记-按键控制LED 光敏传感器控制蜂鸣器(08)

    led.h led.c key.h key.c main.c 电路图: 实物图: buzzer.h buzzere.c lightsensor.h lightsensor.cpp main.c 04-Key控制LED.rar 05-光敏传感器控制蜂鸣器.rar 参考: 【STM32】江科大STM32学习笔记汇总

    2024年04月23日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包