STM32 多功能按键中断

key1 开关实现led1亮灭,key2开关实现蜂鸣器开关,key3开关实现风扇开关

main.c

#include "uart.h"
#include "key_it.h"
#include "led.h"
int main()
{char c;char *s;uart4_init();//串口初始化all_led_init();key_it_config();fengshan_init();key3_it_config();while(1){}return 0;
}

 按键功能函数 

#include"key_it.h"
void key3_it_config()
{	RCC->MP_AHB4ENSETR |= (0x1<<5);//PF8GPIOF->MODER &= (~(0x3<<16));//PF8EXTI->EXTICR3 &= (~(0xFF<<0));EXTI->EXTICR3 |= (0x5<<0);//设置触发方式为下降沿触发EXTI_FTSR1EXTI->FTSR1 |= (0x1<<8);//设置EXTI事件触发不屏蔽 EXTI_IMR1EXTI->C1IMR1 |=(0x1<<8);GICD->IPRIORITYR[24] &= (~(0x1F<<19));GICD->ITARGETSR[24] &= (~(0x3<<16));GICD->ITARGETSR[24] |= (0x1<<16);
}
void key_it_config()
{//RCC使能GPIOF时钟RCC->MP_AHB4ENSETR |= (0x1<<5);RCC->MP_AHB4ENSETR |= (0x1<<1);RCC->MP_AHB4ENSETR |= (0x1<<4);//设置PF9 PF7 PF8 GPIO_MODER输入//PF9GPIOF->MODER &= (~(0x3<<18)); //PF7GPIOF->MODER &= (~(0x3<<14));GICD->ISENABLER[3] |= (0x1<<2);   //PF8 98号中断 //PB6 蜂鸣器GPIOB->MODER &= (~(0x3<<12));GPIOB->MODER |=(0x1<<12);GPIOB->OTYPER &=(~(0x1<<6));GPIOB->OSPEEDR &= (~(0x3<<12));GPIOB->PUPDR &= (~(0x3<<12));//设置PF9 PF7 PF8产生EXTI事件 EXTI_EXTICRx//PF7EXTI->EXTICR2 &= (~(0xFF<<24));EXTI->EXTICR2 |= (0x5<<24);//pF9EXTI->EXTICR3 &= (~(0xFF)<<8);EXTI->EXTICR3 |= (0x5<<8);	//设置触发方式为下降沿触发EXTI_FTSR1EXTI->FTSR1 |= (0x7<<7);//设置EXTI事件触发不屏蔽 EXTI_IMR1EXTI->C1IMR1 |=(0x7<<7);//使能组0转发中断GICD_CTRLGICD->CTRL |=(0x1);//使能中断能转发到特定的CPU接口层GICD->ISENABLER[3] |= (0x1<<3);   //PF9 99号中断 GICD->ISENABLER[3] |= (0x1<<1);   //PF7 97号中断//GICD_IPRIOITYR设置中断优先级GICD->IPRIORITYR[24] &= (~(0x1F)<<11);//PF9GICD->IPRIORITYR[24] &= (~(0x1F<<27));//设置当前中断被转发特定的CPU接口层GICO_ITARGETSRxGICD->ITARGETSR[24] &= (~(0x3<<8));GICD->ITARGETSR[24] |= (0x1<<8);GICD->ITARGETSR[24] &= (~(0x3<<24));GICD->ITARGETSR[24] |= (0x1<<24);//使能CPU可以处理组0转发的中断GICD_CTLRGICC->CTRL |= 0x1;//设置中断优先级掩码GICC_CTKRGICC->PMR |= (0x1F<<3);GICC->CTRL |= (0x1);}
void fengshan_init()
{RCC->MP_AHB4ENSETR |= (0x1<<4);//PB9GPIOE->MODER &= (~(0x3<<18));GPIOE->MODER |= (0x1<<18);GPIOE->OTYPER &=(~(0x1<<9));GPIOE->OSPEEDR &= (~(0x3<<18));GPIOE->PUPDR &= (~(0x3<<18));
}

 头文件 key_it.h

#ifndef __KEY_IT_H__
#define __KEY_IT_H__
#include "stm32mp1xx_exti.h"
#include "stm32mp1xx_gic.h"
#include "stm32mp1xx_gpio.h"
#include "stm32mp1xx_rcc.h"
void key_it_config();
void key3_it_config();
void fengshan_init();
#endif

 led的功能函数 led.c

#include"led.h"
//延时函数
void delay(int ms)
{int i,j;for(i=0;i<ms;i++){for(j=0;j<2000;j++);}
}//GPIO初始化
void all_led_init()
{//RCC使能RCC->MP_AHB4ENSETR |= (0x3<<20);//设置PE10 PF10 PE8为输出GPIOE->MODER &= (~(0x3<<20));GPIOE->MODER |= (0x1<<20);GPIOF->MODER &= (~(0x3<<20));GPIOF->MODER |= (0x1<<20);GPIOE->MODER &= (~(0x3<<16));GPIOE->MODER |= (0x1<<16);//设置推挽输出GPIOE->OTYPER &= (~(0x1<<10));GPIOF->OTYPER &= (~(0x1<<10));GPIOE->OTYPER &= (~(0x1<<8));//设置三个管脚低速输出GPIOE->OSPEEDR &= (~(0x3<<20));GPIOF->OSPEEDR &= (~(0x3<<20));GPIOE->OSPEEDR &= (~(0x3<<16));//设置三个管脚输出时无上拉电阻和下拉电阻GPIOE->PUPDR &= (~(0x3<<20));GPIOE->PUPDR &= (~(0x3<<20));GPIOE->PUPDR &= (~(0x3<<20));}

中断处理函数实现do_irq.c

#include "key_it.h"
#include "led.h"
extern void printf(const char *fmt, ...);
unsigned int i = 0;
int flag=0;
void do_irq(void) 
{int irqno; //保存中断号irqno=GICC->IAR & 0x3FF;switch(irqno){case 99://key1//按键1中断处理printf("key1\n");printf("key1 ID =%d\n",irqno);//LED亮if(flag==0){GPIOE->ODR |=(0x1<<10);flag=1;//GPIOE.odr &=(~(0x1<<10));//GPIOE.odr &= (~(0x1<<8));}else{flag=0;GPIOE->ODR &=(~(0x1<<10));}//清除挂起中断标志位GICD_ICPENDRxGICD->ICPENDR[3] |=(0x1<<3);//清除中断触发标志位EXTI_FPR1EXTI->FPR1 |= (0x1<<9);break;case 97://按键2中断处理printf("key2\n");printf("key2 ID =%d\n",irqno);if(flag==0){GPIOB->ODR |=(0x1<<6);flag=1;}else{flag=0;GPIOB->ODR &= (~(0x1<<6));}//清除挂起中断标志位GICD_ICPENDRxGICD->ICPENDR[3] |=(0x1<<1);//清除中断触发标志位EXTI_FPR1EXTI->FPR1 |= (0x1<<7);break;case 98://按键3中断处理printf("key3\n");printf("key3 ID =%d\n",irqno);if(flag==0){GPIOE->ODR |=(0x1<<9);flag=1;}else{flag=0;GPIOE->ODR &= (~(0x1<<9));}
//清除挂起中断标志位GICD_ICPENDRxGICD->ICPENDR[3] |=(0x1<<2);//清除中断触发标志位EXTI_FPR1EXTI->FPR1 |= (0x1<<8);}//清除处理完的中断号GICC->EOIR=irqno;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/158424.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

oracle 与mysql兼容日期(格式:YYYY年MM月DD日)

日期类型&#xff1a;date 查询sql&#xff1a; select concat(concat(concat(to_char(END_DATE,YYYY),年),concat(to_char(END_DATE,MM),月)),concat(to_char(END_DATE,DD),日)) AS dateInfo from test显示结果&#xff1a;

Unity中Shader的光照衰减

文章目录 前言一、衰减原理1、使用一张黑白渐变贴图用于纹理采样2、把模型从世界坐标转化为灯光坐标&#xff08;即以灯光为原点的坐标系&#xff09;3、用转化后的模型坐标&#xff0c;对黑白渐变纹理进行纹理采样4、最后&#xff0c;把采样后的结果与光照模型公式的结果相乘输…

论文阅读》用语义解耦改进共情对话生成 2022 IJCKG

《论文阅读》用语义解耦改进共情对话生成 前言简介相关知识对抗学习模型架构Semantics DecouplerEmpathetic Generator损失函数前言 论文阅读不迷路! 今天为大家带来的是《Improving Empathetic Dialogue Generation with Semantics Decoupling》 出版:IJCKG(International…

AI 律助 Alpha GPT 线上实操发布会,重磅发布!

数字化时代,随着人工智能的迅猛发展,各行各业都在积极探索通过智能化工具实现工作效率翻升的可能性。“ ChatGPT 类产品”是未来办公应用软件发展的重要趋势之一,但如何将 ChatGPT 真正应用于法律人的工作,赋能效率提升?法律行业同样面临着新的挑战和机遇。 破局的关键是实现技…

Kafka 开启SASL/SCRAM认证 及 ACL授权(一)认证

Kafka 开启SASL/SCRAM认证 及 ACL授权(一)认证。 kafka安全涉及3部份:传输加密,用户认证与授权,ZK开启ACL(Zookeeper存储了kafka的元数据以及用户信息,默认不开启acl所有用户可改,内网环境机器不对外开放可考虑使用默认不开启ZK ACL)。 官网地址:https://kafka.ap…

Spring Boot中的JdbcTemplate是什么,如何使用

Spring Boot中的JdbcTemplate是什么&#xff0c;如何使用 Spring Boot是一个流行的Java应用程序开发框架&#xff0c;它简化了Java应用程序的开发过程&#xff0c;并提供了丰富的功能和工具。在Spring Boot中&#xff0c;JdbcTemplate是一个强大的数据库访问工具&#xff0c;它…

RT-Thread SMP介绍与移植(学习)

RT-Thread SMP介绍与移植 SMP&#xff1a;对称多处理&#xff08;Symmetrical Multi-Processing&#xff09;简称SMP&#xff0c;是指在一个计算机上汇集了一组处理器&#xff08;多CPU&#xff09;&#xff0c;各CPU之间共享内存子系统以及总线结构。 RT-Thread自4.0.0版本开…

198、RabbitMQ 的核心概念 及 工作机制概述; Exchange 类型 及 该类型对应的路由规则;了解什么是JMS。

目录 JMS 讲解★ RabbitMQ的核心概念★ RabbitMQ工作机制★ Connection&#xff08;连接&#xff09; 与 Channel&#xff08;通信信道&#xff09;★ Exchange★ Exchange与Queue★ Exchange的类型&#xff08;4种&#xff09;及 该类型对应的路由规则 看RabbitMQ 之前&#x…

POI、Easy Excel操作Excel

文章目录 1.常用的场景2.基本功能3.Excel在Java中是一个对象4. 简单的写&#xff08;07版本&#xff08;.xlsx&#xff09;Excel&#xff09;大文件写HSSF大文件写XSSF大文件写SXSSF 5. Excel读5.1 读取遇到类型转化问题该怎么解决5.2 遇到Excel公式怎么办 6. Easy Excel6.1简单…

【软件测试】性能测试工具Loadrunner

文章目录 一. Loadrunner是什么二. LoadRunner的安装三. LoadRunner的使用1. Virtual User Generator(LoadRunner脚本录制)1.1 了解WebTours系统1.2 脚本录制1.3 编译1.4 运行(回放)脚本加强1. 事务插入2. 插入集合点3. 参数化4. 打印日志 2. Controller(设计测试场景)2.1 Cont…

云上攻防-云原生篇Docker安全系统内核版本漏洞CDK自动利用容器逃逸

文章目录 云原生-Docker安全-容器逃逸&内核漏洞云原生-Docker安全-容器逃逸&版本漏洞-CVE-2019-5736 runC容器逃逸-CVE-2020-15257 containerd逃逸 云原生-Docker安全-容器逃逸&CDK自动化 云原生-Docker安全-容器逃逸&内核漏洞 细节部分在权限提升章节会详解&…

DocCMS keyword SQL注入

漏洞描述 DocCMS keyword参数存在 SQL注入漏洞&#xff0c;攻击者通过漏洞可以获取数据库信息 漏洞复现 访问url&#xff1a; 漏洞证明&#xff1a; 文笔生疏&#xff0c;措辞浅薄&#xff0c;望各位大佬不吝赐教&#xff0c;万分感谢。 免责声明&#xff1a;由于传播或利…

【HTML+REACT+ANTD 表格操作】处理(改变)数据,改变DOM

博主&#xff1a;_LJaXi 专栏&#xff1a; React | 前端框架 主要是一些表格DOM操作&#xff0c;数据更换 个人向 HTML <!DOCTYPE html> <html lang"en"> <link> <meta charset"UTF-8" /> <meta name"viewport" con…

flutter入门实践2——将完成的flutter软件打包为apk

将完成的flutter软件打包为apk&#xff1a; 视频版&#xff1a; 【前端教程-Flutter篇-flutter之打包安卓版本的APP】https://www.bilibili.com/video/BV11K4y1S7Sg?vd_sourcec008a8e3bd95154e374408adc754394a 文字版&#xff1a;Flutter 打包APP &#xff08;Android &am…

JUnit5 【最实用最简洁】

JUnit5 文章目录 JUnit5一、JUnit 的相关技术二、参数化三、给测试用例指定顺序四、断言五、测试套件 安装依赖&#xff1a;在Maven库中安装 为什么学了 Selenium 还要学 JUnit&#xff1f; 1、JUnit5 是单元测试框架&#xff0c;拿着一个技术写自动化测试用例&#xff08;Sele…

想要精通算法和SQL的成长之路 - 连续的子数组和

想要精通算法和SQL的成长之路 - 连续的子数组和 前言一. 连续的子数组和1.1 最原始的前缀和1.2 前缀和 哈希表 前言 想要精通算法和SQL的成长之路 - 系列导航 一. 连续的子数组和 原题链接 1.1 最原始的前缀和 如果这道题目&#xff0c;用前缀和来算&#xff0c;我们的思路…

vue 本地上传Excel文件并读取内容

陌路遇见&#xff0c;陌路告别&#xff0c;陌路问好&#xff0c;九月再见&#xff0c;十月重现! 首先我来讲解一下我的思路&#xff1a; 首先&#xff0c;在模板部分&#xff0c;我们有以下元素&#xff1a; <input type“file” change“handleFileUpload” accept“.xlsx…

ODrive移植keil(七)—— 插值算法和偏置校准

目录 一、角度读取1.1、硬件接线1.2、程序演示1.3、代码说明 二、锁相环和插值算法2.1、锁相环2.2、插值2.3、角度补偿 三、偏置校准3.1、硬件接线3.2、官方代码操作3.3、移植后的代码操作3.4、代码说明3.5、SimpleFOC的偏置校准对比 ODrive、VESC和SimpleFOC 教程链接汇总&…

蓝桥杯(等差素数列,C++)

思路&#xff1a; 1、因为找的是长度为10&#xff0c;且公差最小的等差素数列&#xff0c;直接用枚举即可。 2、枚举用三重循环&#xff0c;第一重枚举首项&#xff0c;第二重枚举公差&#xff0c;第三重因为首项算一个&#xff0c;所以枚举九个等差素数。 代码&#xff1a;…

《从菜鸟到大师之路 正则表达式 篇》

《从菜鸟到大师之路 正则表达式 篇》 正则表达式是一个强大的文本匹配工具。但是&#xff0c;对于前端初学者来说&#xff0c;众多的符号和规则可能让人难以理解。其实&#xff0c;你不需要记住所有的正则表达式语法&#xff01;本文将分享一些简单而实用的技巧&#xff0c;帮…