ARM_key1按键按下,打印key1

news2024/9/26 1:26:13

include/key.h

#ifndef __KEY_H__
#define __KEY_H__

#include "stm32mp1xx_exti.h"
#include "stm32mp1xx_gic.h"
#include "stm32mp1xx_rcc.h"
#include "stm32mp1xx_gpio.h"



//对RCC/GPIO/EXTI进行初始化
void hal_key1_exit_init();



//对GIC章节进行初始化
void hal_key1_gic_init();


#endif
*/

#ifndef __KEY_H__
#define __KEY_H__

#include "stm32mp1xx_rcc.h"
#include "stm32mp1xx_gpio.h"
#include "stm32mp1xx_exti.h"
#include "stm32mp1xx_gic.h"




//对RCC/GPIO/EXTI章节的初始化
void hal_key1_exit_init();

//对GIC的初始化
void hal_key1_gic_init();





#endif

src/key.c

/*
#include "key.h"


//对RCC/GPIO/EXTI进行初始化
void hal_key1_exit_init()
{
	//RCC_MP_AHB4ENSETR寄存器使能gpio组控制器
	//[5] = 1
	RCC->MP_AHB4ENSETR |= (0x1 << 5);


	//GPIOx_MODER寄存器设置引脚为输入模式
	//pf9[19:18]=00
	//pf7[15:14]=00
	//pf8[17:16]=00
	GPIOF->MODER &= (~(0x3 << 18));


	//EXTI_EXTICR3寄存器,外部中断选择寄存器
	//选择和哪一个EXTI进行连接
	//EXTI9[15:8]=0x05
	//EXTI7[31:24]=0x05
	//EXTI8[7:0]=0x05
	EXTI->EXTICR3 &= (~(0xFF) << 8);
	EXTI->EXTICR3 |= (0x05 << 8);

	//EXTI_FTSR1寄存器,设置中断下降沿触发方式
	EXTI->FTSR1 |= (0x1 << 9);
	
	//EXTI_IMR1中断屏蔽选择寄存器
	EXTI->C1IMR1 |= (0b01 << 9);
}



//对GIC的初始化
void hal_key1_gic_init()
{
	//GICD的初始化
	//1.使能GICD层控制器
	GICD->CTRL |= 0x1;
	//2.设置GICD层的中断使能
	GICD->ISENABLER[3] |= (0x1 << 3);
	//3.设置GICD层中断优先级[31:27]
	GICD->IPRIORITYR[24] &= (~(0x1F << 27));
	//4.设置GICD层中断目标分配寄存器[24:25]
	GICD->ITARGETSR[24] |= (0x1 << 24);

	//GICC章节初始化
	//1.使能GICC层控制器
	GICC->CTRL |= 0x1;
	//2.设置GICC层中断优先级
	GICC->PMR |= (0x1F << 3);
}
*/
#include "key.h"

//对RCC/GPIO/EXTI章节的初始化
void hal_key1_exit_init()
{
	//RCC
	RCC->MP_AHB4ENSETR |= (0x1 << 5);
	//GPIO设置输入模式
	GPIOF->MODER &= (~(0x3 << 18));
	//EXTI
	//1.外部中断选择寄存器,选择与哪个EXTI(16)链接
	EXTI->EXTICR3 &= (~(0xff << 8));
	EXTI->EXTICR3 |= (0x5 << 8);
	//2.设置中断下降沿触发方式
	EXTI->FTSR1 |= (0x1 << 9);
	//3.中断屏蔽选择寄存器
	EXTI->C1IMR1 |= (0b01 << 9);



}

//对GIC的初始化
void hal_key1_gic_init()
{
	//GICD的初始化
	//1.使能GICD层控制器
	GICD->CTRL |= 0x1;
	//2.设置GICD层的中断使能
	GICD->ISENABLER[3] |= (0x1 << 3);
	//3.设置GICD层中断优先级
	GICD->IPRIORITYR[24] &= (~(0x1F << 27));
	//4.设置GICD层中断目标分配寄存器
	GICD->ITARGETSR[24] |= (0x1 << 24);

	//GICC章节初始化
	//1.使能GICC层控制器
	GICC->CTRL |= 0x1;
	//2.设置GICC层中断优先级
	GICC->PMR |= (0x1 << 3);
}

main.c

/*
#include "key.h"


//对RCC/GPIO/EXTI进行初始化
void hal_key1_exit_init()
{
	//RCC_MP_AHB4ENSETR寄存器使能gpio组控制器
	//[5] = 1
	RCC->MP_AHB4ENSETR |= (0x1 << 5);


	//GPIOx_MODER寄存器设置引脚为输入模式
	//pf9[19:18]=00
	//pf7[15:14]=00
	//pf8[17:16]=00
	GPIOF->MODER &= (~(0x3 << 18));


	//EXTI_EXTICR3寄存器,外部中断选择寄存器
	//选择和哪一个EXTI进行连接
	//EXTI9[15:8]=0x05
	//EXTI7[31:24]=0x05
	//EXTI8[7:0]=0x05
	EXTI->EXTICR3 &= (~(0xFF) << 8);
	EXTI->EXTICR3 |= (0x05 << 8);

	//EXTI_FTSR1寄存器,设置中断下降沿触发方式
	EXTI->FTSR1 |= (0x1 << 9);
	
	//EXTI_IMR1中断屏蔽选择寄存器
	EXTI->C1IMR1 |= (0b01 << 9);
}



//对GIC的初始化
void hal_key1_gic_init()
{
	//GICD的初始化
	//1.使能GICD层控制器
	GICD->CTRL |= 0x1;
	//2.设置GICD层的中断使能
	GICD->ISENABLER[3] |= (0x1 << 3);
	//3.设置GICD层中断优先级[31:27]
	GICD->IPRIORITYR[24] &= (~(0x1F << 27));
	//4.设置GICD层中断目标分配寄存器[24:25]
	GICD->ITARGETSR[24] |= (0x1 << 24);

	//GICC章节初始化
	//1.使能GICC层控制器
	GICC->CTRL |= 0x1;
	//2.设置GICC层中断优先级
	GICC->PMR |= (0x1F << 3);
}
*/
#include "key.h"

//对RCC/GPIO/EXTI章节的初始化
void hal_key1_exit_init()
{
	//RCC
	RCC->MP_AHB4ENSETR |= (0x1 << 5);
	//GPIO设置输入模式
	GPIOF->MODER &= (~(0x3 << 18));
	//EXTI
	//1.外部中断选择寄存器,选择与哪个EXTI(16)链接
	EXTI->EXTICR3 &= (~(0xff << 8));
	EXTI->EXTICR3 |= (0x5 << 8);
	//2.设置中断下降沿触发方式
	EXTI->FTSR1 |= (0x1 << 9);
	//3.中断屏蔽选择寄存器
	EXTI->C1IMR1 |= (0b01 << 9);



}

//对GIC的初始化
void hal_key1_gic_init()
{
	//GICD的初始化
	//1.使能GICD层控制器
	GICD->CTRL |= 0x1;
	//2.设置GICD层的中断使能
	GICD->ISENABLER[3] |= (0x1 << 3);
	//3.设置GICD层中断优先级
	GICD->IPRIORITYR[24] &= (~(0x1F << 27));
	//4.设置GICD层中断目标分配寄存器
	GICD->ITARGETSR[24] |= (0x1 << 24);

	//GICC章节初始化
	//1.使能GICC层控制器
	GICC->CTRL |= 0x1;
	//2.设置GICC层中断优先级
	GICC->PMR |= (0x1 << 3);
}
ubuntu@vivi:06-key-c$ ^C
ubuntu@vivi:06-key-c$ cat main.c
#include "key.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++);
}
int main()
{	
	hal_key1_exit_init();
	hal_key1_gic_init();

	while(1)
	{
	}
	return 0;
}

 src/do_irq.c

#include "key.h"
extern void printf(const char *fmt, ...);

void do_irq(void) 
{
	unsigned int num;
	num = GICC->IAR & 0x3ff;
	switch (num)
	{
	case 99:
		printf("key1 press#####\n");
		//1.消除EXTI层中断挂起标志位
		EXTI->FPR1 |= (0x1 << 9);
		//2.消除GICD层的中断挂起标志位
		GICD->ICPENDR[3] |= (0x1 << 3);
		break;
	case 98:
		break;
	case 97:
		break;
	}
	//3.清除获取到的中断号
	GICC->EOIR |= num;
}

result 

 

 

 

 

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

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

相关文章

路径规划算法:基于类电磁机制优化的路径规划算法- 附代码

路径规划算法&#xff1a;基于类电磁机制优化的路径规划算法- 附代码 文章目录 路径规划算法&#xff1a;基于类电磁机制优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要&#xff1a;本文主要介绍利用智能…

面试交流会

面试交流 目录&#xff1a; 01&#xff1a;关于人生目标 02&#xff1a;关于心态 03&#xff1a;关于选择 04&#xff1a;关于学习 05&#xff1a;关于简历 06&#xff1a;关于找工作 1&#xff1a;关于人生目标 1.01、自己想成为什么样的人&#xff1f; 1.02、自己的人生目标是…

sqoop 详解

1 sqoop原理 1.1 sqoop介绍# Sqoop是Apache旗下的一款“hadoop和关系型数据库服务器之间传送数据”的工具。   导入数据&#xff1a;MySQL、Oracle导入数据到hadoop的hdfs、hive、hbase等数据存储系统。   导出数据&#xff1a;从hadoop的文件系统中导出数据到关系型数据…

Mysql数据库——表操作的练习

题目一 &#xff08;1&#xff09; mysql> create database Market; &#xff08;2&#xff09; mysql> use Market; Database changed mysql> create table customers(->c_num INT(11) primary key auto_increment,->c_name varchar(50),->c_contact varcha…

chatGPT之100个例子-从体验到精通

简介 本博文演示了100个chatGPT在各行各业的使用例子,全部看完有助于培养chatGPT解决问题的思维。 在人工智能时代,智能软件并不会淘汰人类,淘汰人类的是会使用人工智能的人! 我们直接使用openAI官方chatGPT,生动演示了chatGPT的一些妙用! 请仔细看完,一定会有收获! 每…

Python 之 基本概述

这里写目录标题 一、Python 简介1. 历史背景2. 特点3. 优缺点4. 应用领域 二、Python 解释器1. 解释器是什么&#xff1f;2. 解释器的构成及其各部分功能3. 解释器的执行过程 三、Python 环境安装四、第一个 Python 程序1. 实际操作2. 常见问题 五、Python 开发环境 一、Python…

Ubuntu 22.04.2 LTS 安装搜狗输入法后,修改区域格式Regional Format crash 崩溃 ,改用bash 指令修改

故障 系统已经升级到最新 基于Ubuntu 20.04 LTS apt upgrade升级而来。 yeqiangyeqiang-MS-7B23:~$ cat /etc/os-release PRETTY_NAME"Ubuntu 22.04.2 LTS" NAME"Ubuntu" VERSION_ID"22.04" VERSION"22.04.2 LTS (Jammy Jellyfish)"…

【LangChain】Document篇

概述 这些是处理文档的核心链。它们对于总结文档、回答文档问题、从文档中提取信息等很有用。 这些链都实现了一个通用接口&#xff1a; class BaseCombineDocumentsChain(Chain, ABC):"""Base interface for chains combining documents."""a…

Vue:Elemenu-Plus递归型菜单组件封装

前端开发中&#xff0c;经常遇到需要与后端配置&#xff0c;前端动态渲染菜单的应用场景&#xff0c;而究其本质&#xff0c;就是菜单组件的应用&#xff0c;只是在不确定菜单级数的情况下&#xff0c;我们需要对组件做一个递归处理&#xff0c;让它能够适应大多数应用场景。 递…

9.17UEC++代码段、编码和字符串

1. 编码定义&#xff1a; 自行转码&#xff1a; 字符串&#xff1a; FName&#xff1a;名称&#xff0c;访问快&#xff0c;用FName做键值。&#xff08;键值容器&#xff09;资产名称基本都是FName。 FText&#xff1a;一般是和UI有关&#xff0c;专门对接UI&#xff0c;也是…

IDEA动态调试WebLogic

IDEA动态调试WebLogic 环境&#xff1a;Windows 10 Windows7(192.168.52.181) Idea WebLogic12.2.1.4 Java8102 0x01 安装weblogic 安装成功后&#xff0c;在domains下的bin目录下有个startWebLogic.cmd文件 0x02 配置被调试端 0x0201 添加调试参数 2.1.1 方式一 在…

基于单片机智能衣柜 智能衣橱 换气除湿制系统紫外线消毒的设计与实现

功能介绍 以51单片机作为主控系统&#xff1b;液晶显示当前衣柜温湿度和柜门开启关闭状态&#xff1b;按键设置当前衣柜湿度上限值、衣柜门打开和关闭&#xff0c;杀菌消毒&#xff1b;当湿度超过设置上限&#xff0c;继电器闭合开启风扇进行除湿&#xff1b;进行杀菌消毒时&am…

7.5 cloneGitHub项目到服务器端/wget/print/spikes_max

在机器学习和深度学习中&#xff0c;位量化&#xff08;Bit Quantization&#xff09;是一种将模型参数或激活值表示为较低精度的二进制数的技术。通常情况下&#xff0c;模型的参数和激活值是以浮点数形式存储和计算的&#xff0c;占用较大的存储空间和计算资源。位量化通过减…

找不到vcruntime140.dll无法继续执行代码的解决方法

计算机提示找不到vcruntime140.dll无法继续执行代码是什么原因呢&#xff1f;在我们运行photoshop&#xff0c;数据库的时候&#xff0c;电脑提示找不到vcruntime140.dll是由于电脑系统中的Microsoft Visual C Redistributable包损坏&#xff0c;vcruntime140.dll是Microsoft V…

(8)基础强化:内存流,压缩流,序列化,资料管理器,编码,File类,文件流,文本流

一、内存流 1、为什么要有内存流&#xff1f; 答&#xff1a;内存流(MemoryStream)是一个特殊的流&#xff0c;它将数据存储在内存中而不是磁盘或网络。 使用内存流的主要原因和使用场景包括&#xff1a; 内存操作&#xff1a; …

故障:启动修复无法修复你的电脑

有台笔记本很久没用了无法开机了&#xff0c;还是用的win7的系统&#xff0c;开机后提示我使用启动修复&#xff0c;但是失败了&#xff0c;提示我启动修复无法修复你的电脑 启动修复无法修复你电脑怎么办_自动修复电脑未正确启动的解决方法&#xff0d;win7之家 1、上网查了下…

Go语言程序设计(十七)并发编程

一、操作系统提供的并发基础 1、进程 进程是在并发环境下,程序的一次动态执行过程。它由进程控制块(PCB)、程序和数据三部分组成&#xff0c;进程在它的生命周期内可能处于执行、就绪、阻塞三种基本状态。 在多任务操作系统中,多个进程可以并发执行,而且进程是系统资源…

<数据结构>NO9.选择类排序|直接选择排序|堆排序

文章目录 选择排序1.直接选择排序优化直接选择排序 2. 堆排序 选择排序 基本思想 选组排序是从待排序数据中选出最大/最小的元素放入到序列的起始位置&#xff0c;直到待排序数据全部有序。 直接选择排序和堆排序的基本思想均符合选择排序。 1.直接选择排序 假设数据按升序…

Codeforces Round 883 (Div. 3)

A. Rudolph and Cut the Rope 只需要按照钉子距离的高度a_{i}和绳子的长度b_{i}的差值进行排序即可 代码 int n; pii a[N]; bool cmp(pii a,pii b) {return a.x-a.y<b.x-b.y; }void solve() {cin>>n;for(int i1;i<n;i)cin>>a[i].x>>a[i].y;sort(a1,…

36.RocketMQ之Broker如何实现磁盘文件高性能读写

highlight: arduino-light Broker读写磁盘文件的核心技术:mmap Broker中大量的使用mmap技术去实现CommitLog这种大磁盘文件的高性能读写优化的。 通过之前的学习&#xff0c;我们知道了一点&#xff0c;就是Broker对磁盘文件的写入主要是借助直接写入os cache来实现性能优化的&…