ARM 10.12

news2025/6/27 4:34:55

设置按键中断,按键1按下,LED亮,再按一次,灭

按键2按下,蜂鸣器响。再按一次,不响

按键3按下,风扇转,再按一次,风扇停

src/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_EXTICRx
    EXTI->EXTICR3 &=(~(0xFF<<0));
    EXTI->EXTICR3 |= (0x5<<0);
    //设置事件触发方式为下降沿触发EXTI_FTSR1
    EXTI->FTSR1 |= (0x1<<8);
    //设置EXTI事件触发不屏蔽EXTI_IMR1
    EXTI->C1IMR1 |= (0x1<<8);
    //使能中断能转发到特定的CPU接口层GICD_ISENABLERx
    GICD->ISENABLER[3] |= (0X1<<2); 
    // GICD_ISENABLERx设置中断优先级
    GICD->IPRIORITYR[24] &= (~(0X1F<<19)); 
    //设置当前中断被转发到哪一个CPU处理GICD_ITARGETSRx
    GICD->ITARGETSR[24]  &= (~(0X3<<16));
    GICD->ITARGETSR[24] |= (0X1<<16);
    //设置中断优先级掩码GICC_PMR
    GICC->PMR |= (0x1F<<3);
    //使能CPU可以处理组0转发的中断GICC_CTLR
    GICC->CTRL |= 0X1;
}
//按键1 按键2以及GICC层的配置
void key_config()
{
    //RCC使能GPIOF时钟
    RCC->MP_AHB4ENSETR |= (0x1<<5);
    //设置PF9 PF7GPIO输入
    //PF9
    GPIOF->MODER &= (~(0x3<<18));
    //pf7
    GPIOF->MODER &= (~(0x3<<14));
    //设置PF9 PF7 产生EXTI事件 EXTI_EXTICRx
    //pf7
    EXTI->EXTICR2 &=(~(0xFF<<24));
    EXTI->EXTICR2 |= (0x5<<24);
    //pf9
    EXTI->EXTICR3 &=(~(0xFF<<8));
    EXTI->EXTICR3 |= (0x5<<8);
    //设置事件触发方式为下降沿触发EXTI_FTSR1
    //pf7
    EXTI->FTSR1 |= (0x1<<7);
    //pf9
    EXTI->FTSR1 |= (0x1<<9);
    //设置EXTI事件触发不屏蔽EXTI_IMR1
    //PF7
    EXTI->C1IMR1 |= (0x1<<7);
    //PF9
    EXTI->C1IMR1 |= (0x1<<9);
    //使能中断能转发到特定的CPU接口层GICD_ISENABLERx
    //PF7 97号中断
    GICD->ISENABLER[3] |= (0X1<<1); 
    //PF9 99号中断
    GICD->ISENABLER[3] |= (0X1<<3); 
    // GICD_ISENABLERx设置中断优先级
    //PF7
    GICD->IPRIORITYR[24] &= (~(0X1F<<11)); 
    //PF9
    GICD->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_CTLR
    GICD->CTRL |= 0X1;
    //设置中断优先级掩码GICC_PMR
    GICC->PMR |= (0x1F<<3);
    //使能CPU可以处理组0转发的中断GICC_CTLR
    GICC->CTRL |= 0X1;

}
//延时
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);
}
//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));
}

src/do_irq.c

#include "key.h"
extern void printf(const char *fmt, ...);
unsigned int i = 0;
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)
            {
                //PF10
                GPIOF->ODR |= (0x1<<10);
                //PE10 PE8
                GPIOE->ODR |= (0x5<<8);
                num1++;
            }
            //灯灭
            else if(num1 > 0)
            {
                //PF10
                GPIOF->ODR &= ~(0x1<<10);
                //PE10 PE8
                GPIOE->ODR &= ~(0x5<<8);
                num1 = 0;
            }
            //清除挂起中断标志位GICD_ICPENDRx
            GICD->ICPENDR[3] |= (0x1<<3);
            //清除中断触发标志位EXTI_FPR1
            EXTI->FPR1 |= (0x1<<9);
            break;
        case 97://key2
            //按键2中断处理
            printf("KEY2 INT\n");
            //蜂鸣器转
            if(num2 == 0)
            {
                //PB6
                GPIOB->ODR |= (0x1<<6);
                num2++;
            }
            //蜂鸣器停
            else if(num2 > 0)
            {
                //PB6
                GPIOB->ODR &= ~(0x1<<6);
                num2 = 0;
            }
            //清除挂起中断标志位GICD_ICPENDRx
            GICD->ICPENDR[3] |= (0x1<<1);
            //清除中断触发标志位EXTI_FPR1
            EXTI->FPR1 |= (0x1<<7);
            break;
        case 98://key3
            //按键3中断处理
            printf("KEY3 INT\n");
            //风扇转
            if(num3 == 0)
            {
                //PE9
                GPIOE->ODR |= (0x1<<9);
                num3++;
            }
            //风扇停
            else if(num3 > 0)
            {
                //PE9
                GPIOE->ODR &= ~(0x1<<9);
                num3 = 0;
            }
            //清除挂起中断标志位GICD_ICPENDRx
            GICD->ICPENDR[3] |= (0x1<<2);
            //清除中断触发标志位EXTI_FPR1
            EXTI->FPR1 |= (0x1<<8);
            break;
    }
    //清除处理完的中断号GICC_EOIR
    GICC->EOIR =irqno;
}

include/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();
//延时
void delay(int ms);
//给RCC使能
void rcc_start();
//GPIO初始化
void gpio_start();

#endif


main.c

#include "key.h"

int main()
{
    //中断初始化
    key_config();
	key3_config();
	//GPIO串口初始化
	gpio_start();
    while(1)
    {
        //保证主程序不结束
    }
    return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SXSSFWorkbook-MinIo-大数据-流式导出

文章目录 前言业务现状架构思路技术细节生成摘要IDSXSSFWorkbookMinIomybatis 流查询PipedInputStream 保存到minio 总结 前言 由于业务涉及到数据比较大&#xff0c;用户对导出功能使用频繁&#xff0c;每次导出数据两10万以上。 为了减少数据库压力&#xff0c;及应用服务器…

TSINGSEE青犀智慧城市数字基座解决方案,助力城市数字化转型

一、行业背景 我国“十四五”规划纲要中提出&#xff0c;分级分类推进新型智慧城市建设&#xff0c;将物联网感知设施、通信系统等纳入公共基础设施统一规划建设&#xff0c;推进市政公用设施、建筑等物联网应用和智能化改造。完善城市信息模型平台和运行管理服务平台&#xf…

基于 ACK Fluid 的混合云优化数据访问(四):将第三方存储目录挂载到 Kubernetes,提升效率和标准化

作者&#xff1a;车漾 前文回顾&#xff1a; 本系列将介绍如何基于 ACK Fluid 支持和优化混合云的数据访问场景&#xff0c;相关文章请参考&#xff1a; -基于 ACK Fluid 的混合云优化数据访问&#xff08;一&#xff09;&#xff1a;场景与架构 -基于 ACK Fluid 的混合云优…

基于STM32_DS18B20单总线传感器驱动

基于STM32_DS18B20单总线传感器驱动 文章目录 基于STM32_DS18B20单总线传感器驱动前言一、BS18B20&#xff1f;二、原理1.复位与检验2.基本命令3.唯一ROM识别码4.温度转换 三、驱动代码四、注意事项 前言 本文以一款典型的单总线传感器及其驱动——DS18B20为例&#xff0c;简单…

Day 5 C++

#include <iostream> //多继承 using namespace std; //封装沙发 类 class Sofa { private:string sitting; public:Sofa(){cout<< "父类sofa无参构造函数" << endl;}Sofa(string s):sitting(s){cout << "父类sofa有参构造函数" &…

不做决策的“RPA机器人”,不是合格的“数字化劳动力”

01 RPA机器人向“数字劳动力”的转变 随着 RPA 技术被广泛应用各行业的不同场景中&#xff0c;再结合以深度学习为代表的 AI 人工智能技术的新一轮发展&#xff0c;RPA 机器人目前已经从仅能处理“单一、重复和标准化的流程”向智能流程自动化的方向发展&#xff0c;从而具备处…

简单的数学运算如何改变算法

简单的数学运算如何影响事物 当你坐在无人驾驶汽车上行驶时&#xff0c;突然发现前面有一个问题。一个亚马逊快递司机将他们的货车开到了一辆双停的UPS卡车旁边&#xff0c;然后才意识到无法通过。现在他们卡住了&#xff0c;你也卡住了。 街道太窄&#xff0c;无法实现U型转弯…

什么!复杂环境下的编队控制问题还能这样解决?

恭喜南京航空航天大学-王志伟同学&#xff0c;在参与阿木实验室校园赞助-Prometheu技术文章创作活动中成功入选&#xff0c;将获得阿木实验室现金奖励500元&#xff01;现将相关文章内容分享给大家&#xff0c;鼓励更多的同学加入到我们校园赞助活动中来&#xff01; 近年来&a…

自学(黑客)技术——网络安全篇

如果你想自学网络安全&#xff0c;首先你必须了解什么是网络安全&#xff01;&#xff0c;什么是黑客&#xff01;&#xff01; 1.无论网络、Web、移动、桌面、云等哪个领域&#xff0c;都有攻与防两面性&#xff0c;例如 Web 安全技术&#xff0c;既有 Web 渗透2.也有 Web 防…

MySQL报错 table “xxx” doesn‘t exit

问题描述 以前项目的数据库部署在云端Windows Server系统上&#xff0c;最近有需求要把数据库移到CentOS7的服务器上&#xff0c;数据转移到时候一切正常&#xff0c;并且使用Navicat for MySQL访问数据库的时候也没有异常&#xff0c;但是项目实际运行起来的时候接口一直在报…

第十三更---大家都在那里查找资料??

今天聊点题外话。大家都在那里查找资料呢&#xff0c;如今的资源网站太多了&#xff0c;眼花缭乱。今天我把一些常见的平台罗列一下 大家还有什么宝藏网站的话多多评论区分享吧 目录 一.CSDN 二.掘金 三.菜鸟教程 四.MDN 五.牛客 六.博客园 七.b站 八.微信读书 一.CSD…

VMWare 安装CentOS7镜像

安装CentOS 7 整个安装过程分两大步&#xff0c;第一步装机器&#xff0c;第二步装系统. 第一步: 装机器 检查物理机虚拟化支持是否开启&#xff0c;需要进入到BIOS中设置&#xff0c;因各种电脑型号进入BIOS 方式不同&#xff0c;同学们自行查找对应品牌电脑如何进入BIOS 建…

IIS 解析漏洞复现

文章目录 IIS 解析漏洞复现1. 漏洞描述2. 漏洞复现3. 漏洞原因4. 安全加固5. 安全防护 IIS 解析漏洞复现 1. 漏洞描述 说明内容漏洞编号漏洞名称IIS 解析漏洞漏洞评级高危影响范围IIS 6.0及以前版本IIS 7.0IIS 7.5漏洞描述IIS 解析漏洞是指在 IIS 服务器上存在的安全漏洞&…

Webmin远程命令执行漏洞复现报告

漏洞编号 CVE-2019-15107 漏洞描述 Webmin是一个基于Web的系统配置工具&#xff0c;用于类Unix系统。密码重置页面中存在此漏洞&#xff0c;允许未经身份验证的用户通过简单的 POST 请求执行任意命令。 影响版本 Webmin<1.920 漏洞评级 严重 利用方法&#xff08;利…

小谈设计模式(26)—中介者模式

小谈设计模式&#xff08;26&#xff09;—中介者模式 专栏介绍专栏地址专栏介绍 中介者模式分析角色分析抽象中介者&#xff08;Mediator&#xff09;具体中介者&#xff08;ConcreteMediator&#xff09;抽象同事类&#xff08;Colleague&#xff09;具体同事类&#xff08;C…

# Spring Cloud的新潮流:服务网格与无缝通信

文章目录 微服务通信的挑战引入服务网格Spring Cloud和服务网格的融合Envoy与Spring Cloud的集成服务网格的可观察性 服务网格的安全性无缝的微服务通信结语 &#x1f389;欢迎来到架构设计专栏~# Spring Cloud的新潮流&#xff1a;服务网格与无缝通信 ☆* o(≧▽≦)o *☆嗨~我…

Docker在边缘计算中的崭露头角:探索容器技术如何驱动边缘计算的新浪潮

文章目录 第一部分&#xff1a;边缘计算和Docker容器边缘计算的定义Docker容器的崭露头角1. 可移植性2. 资源隔离3. 自动化部署和伸缩 第二部分&#xff1a;应用案例1. 边缘分析2. 工业自动化3. 远程办公 第三部分&#xff1a;挑战和解决方案1. 网络延迟2. 安全性3. 管理和部署…

大数据之力:从数据湖到数据智能的升级之路

文章目录 什么是数据湖&#xff1f;什么是数据智能&#xff1f;数据湖与数据智能的结合实现数据湖和数据智能的关键技术挑战和未来展望结论 &#x1f389;欢迎来到AIGC人工智能专栏~大数据之力&#xff1a;从数据湖到数据智能的升级之路 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒&#…

常用burpsuite渗透插件

burpsuite_plugin 个人常用burpsuite渗透插件&#xff0c;根据常用系列插件为&#xff1a; 1.TsojanScan 2.RouteVulScan 3.BurpJSLinkFinderv2 大大提高渗透测试存在某些难以发现的接口未授权&#xff0c;SQL注入等&#xff0c;用了之后腰也不疼了&#xff0c;脑子又长了…

2023年八款优质替代Microsoft Project的选择(免费和付费)

过去&#xff0c;许多公司在没有预算或预算紧张的情况下都依赖MicrosoftProject来进行项目资源规划。然而许多用户期望从他们的商业软件中获得的许多最先进的项目管理功能但Microsoft工具并没有提供。小公司如何平衡预算现实与软件需求&#xff1f; 项目管理软件领域已经飞速发…