ARM:作业3

按键中断代码编写

代码:

key_it.h

#ifndef  __KEY_IT_H__
#define __KEY_IT_H__

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

void key1_it_config();
void key2_it_config();
void key3_it_config();

#endif

key_it.c

#include"key_it.h"

void key1_it_config()
{

	//1.设置GPIOF时钟使能
	RCC->MP_AHB4ENSETR |= (0X1<<5);
	// 2.将PF9管脚设置为输入
	GPIOF->MODER &= (~(0x3<<18));
	//3.设置由PF9产生EXTI9事件
	EXTI->EXTICR3 &= (~(0XFF<<8));
	EXTI->EXTICR3 |= (0x05<<8);
	// 4.设置EXTI9事件的检测方式为下降沿检测
	EXTI->FTSR1 |= (0x1<<9);
	// 5.允许中断不屏蔽,可以被转发到GIC
	EXTI->C1IMR1 |= (0x1<<9);
	// 6.允许EXTI9(99号)中断被保存在组0中
	GICD->ISENABLER[3]|= (0x1<<3);
	// 7.设置99号中断优先级
	GICD->IPRIORITYR[24] &= (~(0x1f<<27));
	GICD->IPRIORITYR[24] |= (0x0<<27);
	// 8.设置99号中断可以被CPU0处理
	GICD->ITARGETSR[24] &= (~(0x3<<24));
	GICD->ITARGETSR[24] |= (0x1<<24);
	//9.允许99号中断被转发到CPU接口层
	GICD->CTRL |= 0x1;
	//10.设置中断优先级掩码
	GICC->PMR |= (0x1f<<3);
	//11.允许中断被转发给CPU处理
	GICC->CTRL |=0x1;
}
void key2_it_config()
{
	//1.设置GPIOF时钟使能
	RCC->MP_AHB4ENSETR |= (0X1 << 5);
	// 2.将PF7管脚设置为输入
	GPIOF->MODER &= (~(0x3 << 14));
	//3.设置由PF7产生EXTI7事件
	EXTI->EXTICR2 &= (~(0XFF << 24));
	EXTI->EXTICR2 |= (0x05 << 24);
	// 4.设置EXTI7事件的检测方式为下降沿检测
	EXTI->FTSR1 |= (0x1 << 7);
	// 5.允许中断不屏蔽,可以被转发到GIC
	EXTI->C1IMR1 |= (0x1 << 7);
	// 6.允许EXTI7(97号)中断被保存在组0中
	GICD->ISENABLER[3] |= (0x1 << 1);
	// 7.设置97号中断优先级
	GICD->IPRIORITYR[24] &= (~(0x1f << 11));
	GICD->IPRIORITYR[24] |= (0x0 << 11);
	// 8.设置97号中断可以被CPU0处理
	GICD->ITARGETSR[24] &= (~(0x3 << 8));
	GICD->ITARGETSR[24] |= (0x1 << 8);
	//9.允许97号中断被转发到CPU接口层
	GICD->CTRL |= 0x1;
	//10.设置中断优先级掩码
	GICC->PMR |= (0x1f << 3);
	//11.允许中断被转发给CPU处理
	GICC->CTRL |= 0x1;
}
void key3_it_config()
{
	//1.设置GPIOF时钟使能
	RCC->MP_AHB4ENSETR |= (0X1 << 5);
	// 2.将PF8管脚设置为输入
	GPIOF->MODER &= (~(0x3 << 16));
	//3.设置由PF8产生EXTI8事件
	EXTI->EXTICR3 &= (~(0XFF << 0));
	EXTI->EXTICR3 |= (0x05 << 0);
	// 4.设置EXTI8事件的检测方式为下降沿检测
	EXTI->FTSR1 |= (0x1 << 8);
	// 5.允许中断不屏蔽,可以被转发到GIC
	EXTI->C1IMR1 |= (0x1 << 8);
	// 6.允许EXTI8(98号)中断被保存在组0中 98/32=3...2
	GICD->ISENABLER[3] |= (0x1 << 2);
	// 7.设置98号中断优先级   98/4=24...2     2*8+3=19
	GICD->IPRIORITYR[24] &= (~(0x1f << 19));
	GICD->IPRIORITYR[24] |= (0x0 << 19);
	// 8.设置98号中断可以被CPU0处理 98/4=24...2
	GICD->ITARGETSR[24] &= (~(0x3 << 16));
	GICD->ITARGETSR[24] |= (0x1 << 16);
	//9.允许97号中断被转发到CPU接口层
	GICD->CTRL |= 0x1;
	//10.设置中断优先级掩码
	GICC->PMR |= (0x1f << 3);
	//11.允许中断被转发给CPU处理
	GICC->CTRL |= 0x1;
}

do_irq.c

#include "key_it.h"   
extern void printf(const char *fmt, ...);
unsigned int i = 0;
void do_irq(void) 
{
	//获取中断号,根据中断号的不同进行不同的中断处理
	int irqno;
	irqno=GICC->IAR&0x3ff;
	switch(irqno)
	{
	case 99:                           
		printf("key1 int\n");
		//清除exti中断标志位
		EXTI->FPR1 |=(0x1 << 3);
		//清除GICD中断标志位
		GICD->ICPENDR[3] = (0x1 << 3);
		break;

	case 97:
		printf("key2 int\n");
		// 清除exti中断标志位
		EXTI->FPR1 |= (0x1 << 7);
		// 清除GICD中断标志位
		GICD->ICPENDR[3] = (0x1 << 1);
		break;

	case 98:
		printf("key3 int\n");
		// 清除exti中断标志位
		EXTI->FPR1 |= (0x1 << 8);
		// 清除GICD中断标志位
		GICD->ICPENDR[3] = (0x1 << 2);
		break;
	}
	//清除IAR寄存器的值
	GICC->EOIR = irqno;
}

main.c

#include "key_it.h"

//封装延时函数

void delay(int ms)

{

	int i,j;

	for(i=0;i<ms;i++)

	{

		for(j=0;j<2000;j++);

	}

}

int main()

{

    //中断初始化

    key1_it_config();

    key2_it_config();

    key3_it_config();

    

    //现象是发送一个a串口工具打印一个b

    while(1)

    {

        printf("main func\n");

        delay(2000);



    }



	return 0;

}

运行结果:

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2023年度盘点:AIGC、AGI、GhatGPT、人工智能大模型必读书单

2023年是人工智能大语言模型大爆发的一年&#xff0c;一些概念和英文缩写也在这一年里集中出现&#xff0c;很容易混淆&#xff0c;甚至把人搞懵。 LLM&#xff1a;Large Language Model&#xff0c;即大语言模型&#xff0c;旨在理解和生成人类语言。LLM的特点是规模庞大&…

【Maven技术专题】「入门到精通」教你如何使用Maven中引用依赖本地Jar包,并进行打包输出

前言 在使用Maven管理Java项目时&#xff0c;有时需要引入一些存放在系统特定位置的JAR文件。这些JAR文件可能是你自己编写的&#xff0c;也可能是其他来源的。无论是哪种情况&#xff0c;使用 Maven 的 system 范围和 systemPath 参数&#xff0c;可以方便地引入这些本地依赖…

2023-12-05 Qt学习总结10

点击 <C 语言编程核心突破> 快速C语言入门 Qt学习总结 前言二十六 学生信息管理系统插入介绍: QTableView和QSqlTableModelQTableViewQSqlTableModel 程序所用数据库表格程序组成以及界面学生端源码:管理员端源码: 总结 前言 要解决问题: 学习qt最核心知识, 多一个都不…

【MySQL】:数据类型

数据类型 一.数值类型1.整数1.tinyint2.bit类型 2.浮点类型1.float2.decimal 二.字符串类型1.char类型2.varchar类型3.char和varchar的区别4.日期和时间类型5.enum和set 三.集合查询 一.数值类型 1.整数 1.tinyint 正常插入 越界插入 如果我们向mysql特定的类型中插入不合法的…

[WMCTF2020]Make PHP Great Again require_once 特性

php源码分析 require_once 绕过不能重复包含文件的限制-安全客 - 安全资讯平台 这里是特性 我们首先来解释一下 <?php highlight_file(__FILE__); require_once flag.php; if(isset($_GET[file])) {require_once $_GET[file]; }这个是我们的源代码 PHP包含的格式是将 已…

SpringBoot系列之基于Jedis实现分布式锁

Redis系列之基于Jedis实现分布式锁 1、为什么需要分布式锁 在单机环境&#xff0c;我们使用最多的是juc包里的单机锁&#xff0c;但是随着微服务分布式项目的普及&#xff0c;juc里的锁是不能控制分布锁环境的线程安全的&#xff0c;因为单机锁只能控制同个进程里的线程安全&…

12月12日作业

设计一个闹钟 头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTimerEvent> #include <QTime> #include <QTime> #include <QTextToSpeech>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass …

开发提测?

前言 开发提测是正式开始测试的重要关卡&#xff0c;提测质量的好坏会直接影响测试阶段的效率&#xff0c;进而影响项目进度。较好的提测质量&#xff0c;对提高测试效率和优化项目进度有着事半功倍的作用。如何更好的推进开发提高提测质量呢&#xff1f;下面小编结合自己项目…

优化算法 学习记录

文章目录 相关资料 优化算法梯度下降学习率牛顿法 随机梯度下降小批量随机梯度下降动量法动量法解决上述问题 AdaGrad 算法RMSProp算法Adam学习率调度器余弦学习率调度预热 相关资料 李沐 动手学深度学习 优化算法 优化算法使我们能够继续更新模型参数&#xff0c;并使损失函…

【数据安全】金融行业数据安全保障措施汇总

数字化的今天&#xff0c;数据的价值不可估量&#xff0c;尤其是金融行业&#xff0c;数据不仅代表着企业的核心资产&#xff0c;还涉及到客户的隐私和信任。因此对于金融行业而言&#xff0c;保障数据安全至关重要。下面我们就来一起讨论为什么金融行业要保障数据安全&#xf…

基于Qt的蓝牙Bluetooth在ubuntu实现模拟

​# 前言 Qt 官方提供了蓝牙的相关类和 API 函数,也提供了相关的例程给我们参考。笔者根据 Qt官方的例程编写出适合我们 Ubuntu 和 gec6818开发板的例程。注意 Windows 上不能使用 Qt 的蓝牙例程,因为底层需要有 BlueZ协议栈,而 Windows 没有。Windows 可能需要去移植。笔者…

代码随想录算法训练营第三十六天|01背包问题 二维 ,01背包问题 一维 ,416. 分割等和子集

背包理论基础 01 背包&#xff08;二维&#xff09; 有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i]&#xff0c;得到的价值是value[i] 。每件物品只能用一次&#xff0c;求解将哪些物品装入背包里物品价值总和最大。 背包最大重量为4。 物品为&#x…

Docker入门指南:从基础到实践

在当今软件开发领域&#xff0c;Docker已经成为一种不可或缺的工具。通过将应用程序及其依赖项打包成轻量级的容器&#xff0c;Docker实现了开发、测试和部署的高度一致性。本文将深入研究Docker的基本概念&#xff0c;并通过详细的示例代码演示如何应用这些概念于实际场景中。…

学习IO的第八天

作业&#xff1a;使用信号灯循环输出ABC sem.c #include <head.h>union semun {int val; /* Value for SETVAL */struct semid_ds *buf; /* Buffer for IPC_STAT, IPC_SET */unsigned short *array; /* Array for GETALL, SETALL */struct seminf…

InnoDB在SQL查询中的关键功能和优化策略

文章目录 前言存储引擎介绍存储引擎是干嘛的InnoDB的体系结构 InnoDB的查询操作InnoDB的查询原理引入 Buffer Pool引入数据页Buffer Pool 的结构数据页的加载Buffer Pool 的管理Buffer Pool 的优化 总结 前言 通过上篇文章《MySQL的体系结构与SQL的执行流程》了解了SQL语句的执…

IO第二天作业

1.用read write函数实现文件拷贝 程序 #include <stdio.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <unistd.h> #include <stdlib.h> #include <string.h>int main(int argc, const char *argv[]){…

孩子还是有一颗网安梦——Bandit通关教程:Level 9 → Level 10

&#x1f575;️‍♂️ 专栏《解密游戏-Bandit》 &#x1f310; 游戏官网&#xff1a; Bandit游戏 &#x1f3ae; 游戏简介&#xff1a; Bandit游戏专为网络安全初学者设计&#xff0c;通过一系列级别挑战玩家&#xff0c;从Level0开始&#xff0c;逐步学习基础命令行和安全概念…

初学编程100个代码,python 基础 详细

本篇文章给大家谈谈初学编程100个代码&#xff0c;以及python 基础 详细&#xff0c;希望对各位有所帮助&#xff0c;不要忘了收藏本站喔。 1.Python标识符 在 Python 里&#xff0c;标识符有字母、数字、下划线组成。 在 Python 中&#xff0c;所有标识符可以包括英文、数字以…

新版Spring Security6.2架构 (二) - Authentication

前言&#xff1a; 书接上文&#xff0c;继续官网的个人翻译和个人理解&#xff0c;有不对的请见谅。第一个篇博客中写到Sevlet appliation的总体架构&#xff0c;本博客是写Sevlet appliation中Authentication的架构&#xff0c;在后面第三篇博客将会写到新版spring security如…

IO流(一)

目录 一.关于IO流 二.字节流 1.FIleOutputStream&#xff08;字节输出流&#xff09; 1.书写步骤&#xff1a; 1.创建字节输出流对象 2.写数据 3.释放资源 2.书写数据的三种方式 3.换行写入数据&#xff1a; 4.续写 2.FileInputStream&#xff08;字节输入流&#xf…