按键中断封装

news/2025/2/21 8:25:27/

RCC和GPIO初始化函数:

EXTI初始化函数:通用的函数,对KEY1/KEY2/KEY3进行使用

void hal_exti_init(事件编号,GPIOF组对应编号,触发方式)

GIC层初始化函数:通用的函数,对KEY1/KEY2/KEY3进行使用

void hal_GIC_init(中断id,优先级)

实验现象: 当按键1按下之后,

1)打印一句话,并且需要打印出中断号 2)

LED1灯的状态进行取反 当按键2按下之后,1)打印一句话,并且需要打印出中断号 2)LED2灯的状态进行取反

当按键3按下之后,1)打印一句话,并且需要打印出中断号 2)LED3灯的状态进行取反

main.c

#include "key.h"#include "led.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++);}#define EXTI7_INPUT_EVENT 7#define EXTI8_INPUT_EVENT 8#define EXTI9_INPUT_EVENT 9#define GPIOGROUP 0x05#define KEY1_ID 99#define KEY2_ID 97#define KEY3_ID 98#define IPR_EXTI7 7#define IPR_EXTI8 8#define IPR_EXTI9 9int main(){all_led_init();key_gpio_rcc_init();//KEY1hal_exti_key_init(EXTI9_INPUT_EVENT,GPIOGROUP,Falling);hal_gic_key_init(KEY1_ID,IPR_EXTI9);//KEY2hal_exti_key_init(EXTI7_INPUT_EVENT,GPIOGROUP,Falling);hal_gic_key_init(KEY2_ID,IPR_EXTI7);//KEY3hal_exti_key_init(EXTI8_INPUT_EVENT,GPIOGROUP,Falling);hal_gic_key_init(KEY3_ID,IPR_EXTI8);while(1){}return 0;}

led.h:

#ifndef __LED_H__
#define __LED_H__
#include "stm32mp1xx_gpio.h"
#include "stm32mp1xx_rcc.h"
//定义寄存器组织结构体

//定义GPIOE和GPIOF


 void all_led_init();
 

#endif
 

 key.h:

#ifndef __KEY_H__
#define __KEY_H__#include "stm32mp1xx_rcc.h"
#include "stm32mp1xx_gpio.h"
#include "stm32mp1xx_exti.h"
#include "stm32mp1xx_gic.h"
typedef enum//枚举
{Rising =0, //上升沿Falling, //下降沿
}triger_t;
//GPIO章节和RCC章节初始化
void key_gpio_rcc_init();
//EXTI章节初始化
void hal_exti_key_init(unsigned int input_event,unsigned int gpiogroup,triger_t trigger);
//GIC章节初始化
void hal_gic_key_init(unsigned int id,unsigned int ipr);#endif

key.c

#include "key.h"
void key_gpio_rcc_init()
{ //KEY1->PF9//KEY2->PF7//KEY3->PF8//设置GPIOF使能 MP_AHB4ENSETR[5]=1RCC->MP_AHB4ENSETR |=(0x1<<5);//设置PF9为输入模式 MODER[19:18]=00GPIOF->MODER&=(~(0x3<<18));//设置PF7为输入模式 MODER[15:14]=00GPIOF->MODER&=(~(0x3<<14));//设置PF8为输入模式 MODER[17:16]=00GPIOF->MODER&=(~(0x3<<16));}//EXIT章节初始化
//input_event:事件编号
//gpiogroup:gpio对应组的编号
//trigger:触发方式
void hal_exti_key_init(unsigned int input_event,unsigned int gpiogroup,triger_t trigger){//设置GPI引脚和EXTI进行连接switch (input_event/4){case 1:EXTI->EXTICR2 &=(~(0xff<<(input_event%4*8)));EXTI->EXTICR2 |=(gpiogroup<<(input_event%4*8));break;case 2:EXTI->EXTICR3 &=(~(0xff<<(input_event%4*8)));EXTI->EXTICR3 |=(gpiogroup<<(input_event%4*8));break;case 3:break;}//设置中断触发方式if(trigger==Falling)//触发方式为下降沿触发{EXTI->FTSR1|=(0x1<<input_event);}else//触发方式为上升沿触发{EXTI->RTSR1 |=(0x1<<input_event);}//设置中断不屏蔽EXTI->C1IMR1 |=(0x1<<input_event);}//GIC章节初始化
//中断id
//优先级
void hal_gic_key_init(unsigned int id,unsigned int ipr)
{//设置GICD层中断使能寄存器GICD->ISENABLER[id/32]&=(~(0x1<<(id%32)));GICD->ISENABLER[id/32] |=(0x1<<(id%32));//设置GICD层中断优先级寄存器GICD->IPRIORITYR[id/4] &=(~(0x1f<<(id%4 *8 +3)));GICD->IPRIORITYR[id/4] |=(ipr<<(id%4 *8 +3));//设置GICD层中断目标分配寄存器GICD->ITARGETSR[id/4] &=(~(0x3<<(id%4*8)));GICD->ITARGETSR[id/4] |=(0x1<<(id%4*8));
//设置GICD层中断全局控制器
GICD->CTRL |=(0x1<<0);
//设置GICC层中断优先级寄存器
GICC->PMR |=(0x1f<<3);
//设置GICC层中断全局控制器
GICC->CTRL |= (0x1<<0);}

do_irq.c:

#include "key.h"
#include "led.h"
extern void delay_ms(int ms);
extern void printf(const char *fmt, ...);
//按键按下之后,打印一句话
void do_irq(void) 
{unsigned int num;//获取中断号num=GICC->IAR &0x3ff;//判断中断号switch (num){case 97:// KEY2 ---->LED2---->PF10GPIOF->ODR ^= (0x1 << 10);printf("key2 interrupt id = %d\n",num);EXTI->FPR1 |= (0x1 << 7);GICD->ICPENDR[3] |= (0x1 << 1);break;case 98:// KEY3 ---->LED3--->PE8GPIOE->ODR ^= (0x1 << 8);printf("key3interrupt id = %d\n",num);EXTI->FPR1 |= (0x1 << 8);GICD->ICPENDR[3] |= (0x1 << 2);break;case 99://KEY1 ---->LED1---->PE10GPIOE->ODR ^= (0x1 << 10);printf("key1 interrupt id = %d\n",num);delay_ms(500);EXTI->FPR1 |= (0x1 << 9);GICD->ICPENDR[3] |= (0x1 << 3);break;}//5.清除中断号EOIRGICC->EOIR = num;
}


http://www.ppmy.cn/news/405837.html

相关文章

Linux(CentOS 7)下安装配置Maven3.9.2

Linux&#xff08;CentOS 7&#xff09;下安装配置Maven3.9.2 环境 JDK 1.8OS:Centos 7.5 tar包安装 下载 apache-maven-3.9.2-bin.tar.gz https://maven.apache.org/download.cgi 安装步骤 公共服务&#xff0c;将maven安装在root用户下。 创建maven安装地址解压安装…

大面积无线WIFI覆盖 H3C WX3010E(AC+PoE三层交换机)+ H3C WA2620E、WA4320无线AP +华为USG6310S防火墙

一、适用场景&#xff1a; 1、跨复杂区域覆盖WIFI。支持多房间、多栋、多层复式楼、别墅、自建房的无线WIFI覆盖。 2、强大的漫游功能。楼上楼下移动使用WIFI时&#xff0c;需要支持WIFI的信号漫游&#xff0c;更换地理位置不掉线、不中断。 3、用户量或网络流量的负载均衡功…

蓝牙ble的常见概念

蓝牙广播 包组成结构 低功耗蓝牙一共有40个信道&#xff0c;频段范围从2402Mhz-2480Mhz&#xff0c;每2Mhz一个信道&#xff0c;37 38 39 是广播信道&#xff0c;其余为数据信道 一个广播信道最长37字节&#xff0c;有6字节用作蓝牙设备的MAC地址&#xff0c;我们只需要关注剩…

精读笔记 - Attack of the Tails: Yes, You Really Can Backdoor Federated Learning

文章目录 精读笔记 - Attack of the Tails: Yes, You Really Can Backdoor Federated Learning1. 基本信息2. 核心贡献 与 基本原理2.1 edge-case 形式化定义2.2 edge-case backdoor基本模块2.2.1 黑盒攻击2.2.2 PGD攻击2.3 算法基本步骤3. 实验验证 与 结果分析3.1 实验设置(…

Nucleo-F411RE (STM32F411)LL库体验 3 - 滴嗒定时器的配置

Nucleo-F411RE &#xff08;STM32F411&#xff09;LL库体验 3 - 滴嗒定时器的配置 1、LL库延时 LL库初始化时钟的时候调用了LL_Init1msTick(100000000)函数&#xff0c;这个函数其实就是初始化了系统的滴答定时器。 LL_InitTick原型如下&#xff1a; load值 sysclk/1000&a…

字符设备驱动内部实现

只要文件存在&#xff0c;就会有唯一对应的inode号&#xff0c;且相应的会存在一个struct inode结构体.,在应用层通过open&#xff08;&#xff09;打开一个设备文件&#xff0c;会对应产生一个inode号&#xff0c;通过inode号可以找到文件的inode结构体&#xff0c;inode结构体…

【linux网络配置】多个网卡一起使用,一个网卡连内网,一个网卡连外网

一、问题背景 因为有一个工作站在内网中&#xff0c;但是没有办法联网&#xff08;校园网账户有限&#xff09;。 虽然工作站没有联网&#xff0c;但是我仍然可以通过局域网远程控制工作站&#xff0c;使其访问校园网验证页面实现上网。 当给工作站安装软件或依赖项时&#…

Python Virtualenv:隔离和管理Python项目的利器

引言: 为什么要用虚拟环境 我看到很多python的初学者同学&#xff0c;使用最新版的pycharm&#xff0c;新建一个工程时候默认就是venu虚拟环境。 然后在使用cmd里面pip安装第三方包的时候&#xff0c;在工程里面死活导入不成功&#xff0c;搞的开始怀疑人生。&#xff08;你给…