设置按键中断,按键1按下,LED亮,再按一次,灭,按键2按下,蜂鸣器响。再按一次,不响,按键3按下,风扇转,再按一次,风扇停。

2023-10-13 03:45

本文主要是介绍设置按键中断,按键1按下,LED亮,再按一次,灭,按键2按下,蜂鸣器响。再按一次,不响,按键3按下,风扇转,再按一次,风扇停。,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1、key.h

#ifndef __KEY_H__
#define __KEY_H__
#include "../common/include/stm32mp1xx_exti.h"
#include "../common/include/stm32mp1xx_gpio.h"
#include "../common/include/stm32mp1xx_rcc.h"
#include "../common/include/stm32mp1xx_gic.h"
void key_config();
void key3_config();
#endif

2、led.h

#ifndef __LED_H__
#define __LED_H__
#include "../common/include/stm32mp1xx_exti.h"
#include "../common/include/stm32mp1xx_gpio.h"
#include "../common/include/stm32mp1xx_rcc.h"
#include "../common/include/stm32mp1xx_gic.h"
//延时
void delay(int ms);
//给RCC使能
void rcc_start();
//GPIO初始化
void gpio_start();
#endi

3、key.c

#include"key.h"
//按键3的配置
void key3_config()
{//RCC使能GPIOF时钟RCC->MP_AHB4ENSETR |= (0x1<<5);//设置PF8 GPIO输入GPIOF->MODER &= (~(0x3<<16));//设置PF8产生EXTI事件 EXTI_EXTICRxEXTI->EXTICR3 &=(~(0xFF<<0));EXTI->EXTICR3 |= (0x5<<0);//设置事件触发方式为下降沿触发EXTI_FTSR1EXTI->FTSR1 |= (0x1<<8);//设置EXTI事件触发不屏蔽EXTI_IMR1EXTI->C1IMR1 |= (0x1<<8);//使能中断能转发到特定的CPU接口层GICD_ISENABLERxGICD->ISENABLER[3] |= (0X1<<2); // GICD_ISENABLERx设置中断优先级GICD->IPRIORITYR[24] &= (~(0X1F<<19)); //设置当前中断被转发到哪一个CPU处理GICD_ITARGETSRxGICD->ITARGETSR[24]  &= (~(0X3<<16));GICD->ITARGETSR[24] |= (0X1<<16);//设置中断优先级掩码GICC_PMRGICC->PMR |= (0x1F<<3);//使能CPU可以处理组0转发的中断GICC_CTLRGICC->CTRL |= 0X1;
}
//按键1 按键2以及GICC层的配置
void key_config()
{//RCC使能GPIOF时钟RCC->MP_AHB4ENSETR |= (0x1<<5);//设置PF9 PF7GPIO输入//PF9GPIOF->MODER &= (~(0x3<<18));//pf7GPIOF->MODER &= (~(0x3<<14));//设置PF9 PF7 产生EXTI事件 EXTI_EXTICRx//pf7EXTI->EXTICR2 &=(~(0xFF<<24));EXTI->EXTICR2 |= (0x5<<24);//pf9EXTI->EXTICR3 &=(~(0xFF<<8));EXTI->EXTICR3 |= (0x5<<8);//设置事件触发方式为下降沿触发EXTI_FTSR1//pf7EXTI->FTSR1 |= (0x1<<7);//pf9EXTI->FTSR1 |= (0x1<<9);//设置EXTI事件触发不屏蔽EXTI_IMR1//PF7EXTI->C1IMR1 |= (0x1<<7);//PF9EXTI->C1IMR1 |= (0x1<<9);//使能中断能转发到特定的CPU接口层GICD_ISENABLERx//PF7 97号中断GICD->ISENABLER[3] |= (0X1<<1); //PF9 99号中断GICD->ISENABLER[3] |= (0X1<<3); // GICD_ISENABLERx设置中断优先级//PF7GICD->IPRIORITYR[24] &= (~(0X1F<<11)); //PF9GICD->IPRIORITYR[24] &= (~(0X1F<<27)); //设置当前中断被转发到哪一个CPU处理GICD_ITARGETSRx//pf7 97中断GICD->ITARGETSR[24]  &= (~(0X3<<8));GICD->ITARGETSR[24] |= (0X1<<8);//pf9 99中断GICD->ITARGETSR[24]  &= (~(0X3<<24));GICD->ITARGETSR[24] |= (0X1<<24);//使能组0转发中断GICD_CTLRGICD->CTRL |= 0X1;//设置中断优先级掩码GICC_PMRGICC->PMR |= (0x1F<<3);//使能CPU可以处理组0转发的中断GICC_CTLRGICC->CTRL |= 0X1;  
}

4、led.c

#include "led.h"
//延时
void delay(int ms)
{int i,j;for(i = 0;i < ms;i++){for(j = 0;j < 2000;j++);}
}
//给RCC使能
void rcc_start()
{RCC->MP_AHB4LPENSETR |= (0x3<<4);RCC->MP_AHB4LPENSETR |= (0x1<<1);
}
//GPIO初始化
void gpio_start()
{//PE10 PE9 PE8设置为输出模式GPIOE->MODER &= (~(0x3f<<16));GPIOE->MODER |= (0x15<<16);//PF10设置为输出模式GPIOF->MODER &= (~(0x3<<20));GPIOF->MODER |= (0x1<<20);//PB6设置为输出模式GPIOB->MODER &= (~(0x3<<12));GPIOB->MODER |= (0x1<<12);//PE10 PE9 PE8设置为推挽输出GPIOE->OTYPER &= (~(0x7<<8));//PF10设置为推挽输出GPIOF->OTYPER &= (~(0x1<<10));//PB6设置为推挽输出GPIOB->OTYPER &= (~(0x1<<6));//PE10 PE9 PE8设置为低速输出GPIOE->OSPEEDR &= (~(0x3f<<16));//PF10设置为低速输出GPIOF->OSPEEDR &= (~(0x3<<20));//PB6设置为低速输出GPIOB->OSPEEDR &= (~(0x3<<12));//PE10 PE9 PE8设置为无上拉下拉电阻GPIOE->PUPDR &= (~(0x3f<<16));//PF10设置为无上拉下拉电阻GPIOF->PUPDR &= (~(0x3<<20));//PB6设置为无上拉下拉电阻GPIOB->PUPDR &= (~(0x3<<16));
}

5、do_irq.c

#include"key.h"
#include"led.h"
//extern void printf(const char *fmt, ...);unsigned int num1 = 0, num2 = 0, num3 = 0; 	//记录按键按下的次数void do_irq(void) 
{int irqno;//保存中断号irqno=GICC->IAR & 0X3FF;switch(irqno){case 99://key1//按键1中断处理//printf("KEY1 INT\n");//灯亮if(num1 == 0){//PF10GPIOF->ODR |= (0x1<<10);//PE10 PE8GPIOE->ODR |= (0x5<<8);num1++;}//灯灭else if(num1 > 0){//PF10GPIOF->ODR &= ~(0x1<<10);//PE10 PE8GPIOE->ODR &= ~(0x5<<8);num1 = 0;}//清除挂起中断标志位GICD_ICPENDRxGICD->ICPENDR[3] |= (0x1<<3);//清除中断触发标志位EXTI_FPR1EXTI->FPR1 |= (0x1<<9);break;case 97://key2//按键2中断处理//printf("KEY2 INT\n");//蜂鸣器转if(num2 == 0){//PB6GPIOB->ODR |= (0x1<<6);num2++;}//蜂鸣器停else if(num2 > 0){//PB6GPIOB->ODR &= ~(0x1<<6);num2 = 0;}//清除挂起中断标志位GICD_ICPENDRxGICD->ICPENDR[3] |= (0x1<<1);//清除中断触发标志位EXTI_FPR1EXTI->FPR1 |= (0x1<<7);break;case 98://key3//按键3中断处理//printf("KEY3 INT\n");//风扇转if(num3 == 0){//PE9GPIOE->ODR |= (0x1<<9);num3++;}//风扇停else if(num3 > 0){//PE9GPIOE->ODR &= ~(0x1<<9);num3 = 0;}//清除挂起中断标志位GICD_ICPENDRxGICD->ICPENDR[3] |= (0x1<<2);//清除中断触发标志位EXTI_FPR1EXTI->FPR1 |= (0x1<<8);break;}//清除处理完的中断号GICC_EOIRGICC->EOIR =irqno;
}

6、main.c

#include "key.h"
#include "led.h"int main()
{//中断初始化key_config();key3_config();//GPIO串口初始化gpio_start();while(1){}return 0;
}

这篇关于设置按键中断,按键1按下,LED亮,再按一次,灭,按键2按下,蜂鸣器响。再按一次,不响,按键3按下,风扇转,再按一次,风扇停。的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

第10章 中断和动态时钟显示

第10章 中断和动态时钟显示 从本章开始,按照书籍的划分,第10章开始就进入保护模式(Protected Mode)部分了,感觉从这里开始难度突然就增加了。 书中介绍了为什么有中断(Interrupt)的设计,中断的几种方式:外部硬件中断、内部中断和软中断。通过中断做了一个会走的时钟和屏幕上输入字符的程序。 我自己理解中断的一些作用: 为了更好的利用处理器的性能。协同快速和慢速设备一起工作

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

uniapp设置微信小程序的交互反馈

链接:uni.showToast(OBJECT) | uni-app官网 (dcloud.net.cn) 设置操作成功的弹窗: title是我们弹窗提示的文字 showToast是我们在加载的时候进入就会弹出的提示。 2.设置失败的提示窗口和标签 icon:'error'是设置我们失败的logo 设置的文字上限是7个文字,如果需要设置的提示文字过长就需要设置icon并给

Tomcat性能参数设置

转自:http://blog.csdn.net/chinadeng/article/details/6591542 Tomcat性能参数设置 2010 - 12 - 27 Tomcat性能参数设置 博客分类: Java Linux Tomcat 网络应用 多线程 Socket 默认参数不适合生产环境使用,因此需要修改一些参数   1、修改启动时内存参数、并指定J

(function() {})();只执行一次

测试例子: var xx = (function() {     (function() { alert(9) })(); alert(10)     return "yyyy";  })(); 调用: alert(xx); 在调用的时候,你会发现只弹出"yyyy"信息,并不见弹出"10"的信息!这也就是说,这个匿名函数只在立即调用的时候执行一次,这时它已经赋予了给xx变量,也就是只是

FreeRTOS学习笔记(四)Freertos的中断管理及临界保护

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、Cortex-M 中断管理1.1 中断优先级分组1.2 相关寄存器1.3 相关宏定义1.4 FreeRTOS 开关中断 二、临界段及其保护2.1 taskENTER_CRITICAL( ) 和 taskEXIT_CRITICAL( )2.2 taskENTER_CRITICAL_FROM_ISR( )

flume系列之:记录一次flume agent进程被异常oom kill -9的原因定位

flume系列之:记录一次flume agent进程被异常oom kill -9的原因定位 一、背景二、定位问题三、解决方法 一、背景 flume系列之:定位flume没有关闭某个时间点生成的tmp文件的原因,并制定解决方案在博主上面这篇文章的基础上,在机器内存、cpu资源、flume agent资源都足够的情况下,flume agent又出现了tmp文件无法关闭的情况 二、

物联网之流水LED灯、正常流水灯、反复流水灯、移动流水灯

MENU 硬件电路设计软件程序设计正常流水LED灯反复流水LED灯移动流水LED灯 硬件电路设计 材料名称数量直插式LED1kΩ电阻杜邦线(跳线)若干面包板1 每一个LED的正极与开发板一个GPIO引脚相连,并串联一个电阻,负极接GND。 当然也可以选择只使用一个电阻。 软件程序设计 正常流水LED灯 因为要用到多个GPIO引脚,所以最好把所有的GPI

linux下非标准波特率的设置和使用

通常,在linux下面,设置串口使用终端IO的相关函数设置,如tcsetattr等函数,linux内部有一个对常用波特率列表的索引,根据设置的波特率用底层驱动来设置异步通信芯片的寄存器 对于非标准的任意波特率需要用ioctl(fd, TIOCGSERIAL, p)和ioctl(fd, TIOCSSERIAL, p)的配合,ioctl的最后一个参数是struct serial_struct *

什么是LED智能会议一体机?COB超微小间距LED会议一体机大势所趋

LED智能会议一体机,作为现代会议室革新的核心装备,正逐步颠覆传统会议模式的界限。它不仅仅是一台集成了高清显示、触控互动、音视频处理及远程协作等功能于一体的智能设备,更是推动会议效率与体验双重飞跃的关键力量。随着技术的不断进步,特别是COB(Chip On Board)超微小间距LED技术的引入,LED智能会议一体机正迎来前所未有的发展机遇,成为大势所趋。 COB技术通过将LED芯片直接封装在基