【arm实验2】按键中断事件控制实验

news2025/6/21 19:45:04

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

主函数:

linux@linux:~/study/08-c$ cat main.c 
#include "uart.h"
#include "key_it.h"
int main()
{
    char c;
    char *s;
    uart4_init();//串口初始化
	all_led_config();//灯泡初始化
    //中断初始化
    key_it_config();
	key3_it_config();
    while(1)
    {
        //保证主程序不结束
    }
    return 0;
}

头文件:

linux@linux:~/study/08-c$ cat include/key_it.h 
#ifndef __KEY_IT_H__
#define __KEY_IT_H__
#include "stm32mp1xx_rcc.h"
#include "stm32mp1xx_gpio.h"
#include "stm32mp1xx_exti.h"
#include "stm32mp1xx_gic.h"

void key_it_config();
void key3_it_config();
void all_led_config();

#endif

初始化文件:

linux@linux:~/study/08-c$ cat src/key_it.c
#include"key_it.h"

void all_led_config()
{
	//GPIOE时钟使能
    (*(unsigned int*)0X50000A28)  |= (0X1<<4);
    //PE10设置为输出模式
    *((unsigned int *)0X50006000) &= (~(0X3<<20));
    *((unsigned int *)0X50006000) |= (0X1<<20);
	//PB6设置为输出模式
    *((unsigned int *)0X50003000) &= (~(0X3<<12));
    *((unsigned int *)0X50003000) |= (0X1<<12);
	//PE9设置为输出模式
    *((unsigned int *)0X50006000) &= (~(0X3<<18));
    *((unsigned int *)0X50006000) |= (0X1<<18);
    //PE10设置为推挽输出
    *((unsigned int *)0X50006004) &= (~(0X1<<10));
    //PE9设置为推挽输出
    *((unsigned int *)0X50006004) &= (~(0X1<<9));
    //PB6设置为推挽输出
    *((unsigned int *)0X50003004) &= (~(0X1<<6));
    //PE10设置为低速输出
    *((unsigned int *)0X50006008) &= (~(0X3<<20));
    //PE9设置为低速输出
    *((unsigned int *)0X50006008) &= (~(0X3<<18));
    //PB6设置为低速输出
    *((unsigned int *)0X50003008) &= (~(0X3<<12));
    //PE10设置无上拉下拉电阻
    *((unsigned int *)0X5000600C) &= (~(0X3<<20));
    //PE9设置无上拉下拉电阻
    *((unsigned int *)0X5000600C) &= (~(0X3<<18));
    //PB6设置无上拉下拉电阻
    *((unsigned int *)0X5000300C) &= (~(0X3<<12));
}

void key3_it_config()
{
    //RCC使能GPIOF时钟
    RCC->MP_AHB4ENSETR |= (0x1<<5);
    GPIOF->MODER &= (~(0x3<<16));
    EXTI->EXTICR3 &=(~(0xFF<<0));
    EXTI->EXTICR3 |= (0x5<<0);
    EXTI->FTSR1 |= (0x1<<8);
    EXTI->C1IMR1 |= (0x1<<8);
    GICD->ISENABLER[3] |= (0X1<<2); 
    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);
    //设置PF9 PF7 PF8GPIO输入
    //PF9
    GPIOF->MODER &= (~(0x3<<18));
    //PF8
    // GPIOF->MODER &= (~(0x3<<16));
    //pf7
    GPIOF->MODER &= (~(0x3<<14));
    //设置PF9 PF7 PF8产生EXTI事件 EXTI_EXTICRx
    //pf7
    EXTI->EXTICR2 &=(~(0xFF<<24));
    EXTI->EXTICR2 |= (0x5<<24);
    //pf8
    // EXTI->EXTICR3 &=(~(0xFF<<0));
    // EXTI->EXTICR3 |= (0x5<<0);
    //pf9
    EXTI->EXTICR3 &=(~(0xFF<<8));
    EXTI->EXTICR3 |= (0x5<<8);
    //设置事件触发方式为下降沿触发EXTI_FTSR1
    //pf7
    EXTI->FTSR1 |= (0x1<<7);
    //pf8
    // EXTI->FTSR1 |= (0x1<<8);
    //pf9
    EXTI->FTSR1 |= (0x1<<9);
    //设置EXTI事件触发不屏蔽EXTI_IMR1
    //PF7
    EXTI->C1IMR1 |= (0x1<<7);
    //PF8
    // EXTI->C1IMR1 |= (0x1<<8);
    //PF9
    EXTI->C1IMR1 |= (0x1<<9);
    //使能中断能转发到特定的CPU接口层GICD_ISENABLERx
    //PF7 97号中断
    GICD->ISENABLER[3] |= (0X1<<1); 
    //PF78 98号中断
    // GICD->ISENABLER[3] |= (0X1<<2); 
    //PF9 99号中断
    GICD->ISENABLER[3] |= (0X1<<3); 
    // GICD_ISENABLERx设置中断优先级
    //PF7
    GICD->IPRIORITYR[24] &= (~(0X1F<<11)); 
    //PF8
    // GICD->IPRIORITYR[24] &= (~(0X1F<<19)); 
    //PF9
    GICD->IPRIORITYR[24] &= (~(0X1F<<27)); 
    //设置当前中断被转发到哪一个CPU处理GICD_ITARGETSRx
    //pf7 97中断
    GICD->ITARGETSR[24]  &= (~(0X3<<8));
    GICD->ITARGETSR[24] |= (0X1<<8);
    //pf8 98中断
    // GICD->ITARGETSR[24]  &= (~(0X3<<16));
    // GICD->ITARGETSR[24] |= (0X1<<16);
    //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;

    
}

中断处理文件:

linux@linux:~/study/08-c$ cat src/do_irq.c
#include "key_it.h"
extern void printf(const char *fmt, ...);
unsigned int i = 0;
void do_irq(void)
{
    int irqno; // 保存中断号
    printf("%d\n",irqno);
    irqno = GICC->IAR & 0X3FF;
    switch (irqno)
    {
    case 99: // key1
        // 按键1中断处理
        printf("KEY1 INT\n");
		*((unsigned int *)0X50006014) ^= (0X1<<10);
        // 清除挂起中断标志位GICD_ICPENDRx
        GICD->ICPENDR[3] |= (0x1 << 3);
        // 清除中断触发标志位EXTI_FPR1
        EXTI->FPR1 |= (0x1 << 9);
        break;
    case 97: // key2
        // 按键2中断处理
        printf("KEY2 INT\n");
		*((unsigned int *)0X50003014) ^= (0X1<<6);
        // 清除挂起中断标志位GICD_ICPENDRx
        GICD->ICPENDR[3] |= (0x1 << 1);
        // 清除中断触发标志位EXTI_FPR1
        EXTI->FPR1 |= (0x1 << 7);
        break;
    case 98: // key3
        // 按键3中断处理
        printf("KEY3 INT\n");
		*((unsigned int *)0X50006014) ^= (0X1<<9);
        // 清除挂起中断标志位GICD_ICPENDRx
        GICD->ICPENDR[3] |= (0x1 << 2);
        // 清除中断触发标志位EXTI_FPR1
        EXTI->FPR1 |= (0x1 << 8);
        break;
    }
    // 清除处理完的中断号GICC_EOIR
    GICC->EOIR = irqno;
}

效果图:
1
2
3

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

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

相关文章

江苏建筑模板厂家-建筑模板批发供应商

江苏建筑模板厂家在建筑行业中扮演着重要的角色。建筑模板是建筑施工中不可或缺的一部分&#xff0c;用于支撑混凝土浇筑过程中的形状和结构。在江苏地区的气候地形、经济发展和建筑风格等方面的考虑下&#xff0c;我们将对几种常见的建筑模板材料进行比较&#xff0c;包括钢模…

Linux Centos安装Sql Server数据库,结合cpolar内网穿透实现公网访问

目录 前言 1. 安装sql server 2. 局域网测试连接 3. 安装cpolar内网穿透 4. 将sqlserver映射到公网 5. 公网远程连接 6.固定连接公网地址 7.使用固定公网地址连接 前言 简单几步实现在Linux centos环境下安装部署sql server数据库&#xff0c;并结合cpolar内网穿透工具…

ElementUI编辑表格单元格与查看模式切换的应用

需求&#xff1a;有时候在填写表单的时候&#xff0c;想要在输入的时候是input输入框的状态&#xff0c;但是当鼠标移出输入框失去焦点时&#xff0c;希望是查看的状态&#xff0c;这种场景可以通过 v-if实现 vue2ElementUi里面使用如下&#xff1a; 1.el-table标签注册 cell-…

非交互式ssh command无法找到命令command not found

起因 mha做check时无法获得node的版本 问题判断 分析下源码 执行的代码实际是 ssh $MHA::ManagerConst::SSH_OPT_ALIVE $ssh_user_host -p $ssh_port apply_diff_relay_logs --version 这里附一下ssh用的const SSH_OPT_ALIVE "-o ServerAliveInterval60 -o ServerAl…

MySQL 3 环境搭建 MySQL 5.7版本的安装、配置

MySQL5.7.43官网下载地址 MySQL :: Download MySQL Community Server 这里选5.7.43&#xff0c;Windows版本&#xff0c;然后点击Go to Download Page&#xff0c;下载msi安装包的版本 MSI安装包版本比ZIP压缩包版本的安装过程要简单的多&#xff0c;过程更加清楚直观&#x…

位运算解决简单逻辑推理问题

今天在学习Go语言中的位运算时&#xff0c;老师突然问我们位运算可以有哪些运用场景&#xff1f;这一点让我一下子想到了刷到的leetcode中的两道题目&#xff0c;例如丢失的数字和只出现一次的数字。有兴趣的小伙伴可以尝试做做看。 这两道题目都是用位运算解决的&#xff0c;并…

软考实行机考后,考前需要带什么?

软考实行机考之后&#xff0c;很多宝子们都在问考场需要带什么&#xff1f;今天给大家分享一下需要准备的东西~大家自行查看 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 2023年11月软考考前必看—考试需携带的物品 1、从2023年下半年开始&#xff0c…

网页博弈测试报告

文章目录 项目介绍项目测试用例自动化测试注册自动化测试登录自动化测试匹配测试 性能测试编写脚本创建测试场景性能测试报告 项目介绍 该项目是一个网页对战的五子棋游戏&#xff0c;支持真人匹配对战和人机对战&#xff0c;支持多用户同时匹配进行五子棋对战&#xff0c;通过…

mysql数据库 windows迁移至linux

1.打开navicat&#xff0c;选择一个数据库进行操作&#xff1a; 之后文件会保存为一个xxx.sql文件&#xff0c;之后打开xftp&#xff0c;把生成的sql放进一个文件夹中(/home/dell/linuxmysql)&#xff1a; 之后登录mysql数据库&#xff0c;并创建一个新的数据库&#xff0c;然后…

Pytorch之ConvNeXt图像分类

文章目录 前言一、ConvNeXt设计决策1.设计方案2.Training Techniques3.Macro Design&#x1f947;Changing stage compute ratio&#x1f948;Change stem to "Patchify" 4.ResNeXt-ify5. Inverted Bottleneck6.Large Kernel Size7.Micro Design✨Replacing ReLU wit…

论文阅读:Fast-BEV: Towards Real-time On-vehicleBird’s-Eye View Perception

Abstract 现有的BEV解决方案要么需要大量的资源执行车载推理&#xff0c;要么效果一般。Fast-BEV包含五部分&#xff1a; 1&#xff09;一个轻量化部署友好的视角转换方式&#xff0c;可以快速将2D图像特征转到3D体素空间。 2&#xff09;一个多尺度图像编码器利用多尺度特征。…

Mac/Wins Matlab如何查看APPs源码

查看Apps方法一样&#xff0c;点击HOME-preferences-MATLAB-Apps查看你的Apps安装路径。 你的Apps文件就安装在该目录下&#xff0c;直接进入这个目录就可以看到你自己写的APPs文件&#xff0c;

Fastjson历史版本记录

1.2.24 TemplatesImpl&#xff0c;利用条件苛刻&#xff0c;需要开启Feature.SupportNonPublicField {"type": "com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl","_bytecodes": ["yv66vgAAADQA...CJAAk"],"_name…

光通路数据单元(ODU),ODUk,同步传送模块(STM),虚容器(VC)等级

文章目录 ODUk同步传送模块&#xff0c;STM虚容器&#xff0c;VC时隙 光通路 数据 单元(ODU&#xff0c;Optical channel data unit) 提供与信号无关的连通性&#xff0c;连接保护和监控等功能&#xff0c;这一层也叫数据通道层。 ODUk&#xff0c;k值越大&#xff0c;帧周期越…

SpringBootCms

SpringBootCMS&#xff0c;极速开发&#xff0c;动态添加字段&#xff0c;自定义标签&#xff0c;动态创建数据库表并crud数据&#xff0c;数据库备份、还原&#xff0c;动态添加站点(多站点功能)&#xff0c;一键生成模板代码&#xff0c;让您轻松打造自己的独立网站&#xff…

spark读取hive表字段,区分大小写问题

背景 spark任务读取hive表&#xff0c;查询字段为小写&#xff0c;但Hive表字段为大写&#xff0c;无法读取数据 问题错误: 如何解决呢&#xff1f; In version 2.3 and earlier, when reading from a Parquet data source table, Spark always returns null for any column …

高防CDN:网络安全的锁与钥匙

深度解析高防CDN原理 高防CDN&#xff0c;一门整合防护与分发功能的互联网安全技术&#xff0c;以卓越之姿应对DDoS攻击等网络威胁&#xff0c;巧妙地辨识和过滤访问源地址&#xff0c;以保障用户畅通访问和服务的稳定。其核心原理包括&#xff1a; 流量清洗&#xff1a; 高防C…

mysql数据库语法改造成dm数据库DATE_SUB

给了一个任务就是把一个项目用dm数据库正常跑起来&#xff0c;真的难呀&#xff0c;项目原本是使用的mysql、 问题寻找 dm数据库保存&#xff0c;我看mysql跑的挺好的&#xff0c;然后开始找原因。 其中还没有看懂这两个函数&#xff0c;特意搜了搜 LAST_DAY 取最后一天 DATE_…

社区投稿| 以安全视角,深度剖析 Sui Staking 与 LSD

本篇技术研报由 MoveBit 研究团队的 Jason 撰写 #1 Sui Staking 介绍 1.1 Sui 网络概述 Sui 网络由一组独立的验证者运行&#xff0c;每个验证者在自己的机器或集群上运行独立的 Sui 软件实例。 Sui 采用委托权益证明&#xff08;DPoS&#xff09;来确定哪些验证者参与网络…

Bootstrap的下拉菜单组件相关知识

Bootstrap的下拉菜单组件依赖于第三方popper.js插件实现&#xff0c;popper.js插件提供了动态定位和浏览器窗口大小监测&#xff0c;所以在使用下拉菜单时确保引入了popper.js文件&#xff0c;并且要放在引用Bootstrap.js文件之前前。 目录 01-下拉菜单基本结构02-分裂式下拉菜…