ARM:作业3

news2024/7/4 4:41:54

按键中断代码编写

代码:

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;

}

运行结果:

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

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

相关文章

冯诺依曼体系与操作系统的理解

目录 一.冯诺依曼体系结构 存储分级 为什么程序运行之前&#xff0c;必须加载到内存上&#xff1f; 二.操作系统 操作系统是什么&#xff1f; 为什么需要操作系统&#xff1f; 操作系统是如何管理软硬件资源&#xff1f; 一.冯诺依曼体系结构 我们常见的计算机&#xff…

Qt 容器QGroupBox带有标题的组框框架

控件简介 QGroupBox 小部件提供一个带有标题的组框框架。一般与一组或者是同类型的部件一起使用。教你会用,怎么用的强大就靠你了靓仔、靓妹。 用法示例 例 qgroupbox,组框示例(难度:简单),使用 3 个 QRadioButton 单选框按钮,与QVBoxLayout(垂直布局)来展示组框的…

BearPi Std 板从入门到放弃 - 先天神魂篇(2)(RT-Thread LED PWM驱动)

简介 基于 BearPi Std 板从入门到放弃 - 先天神魂篇&#xff08;1&#xff09;(RT-Thread 指令点亮LED) 创建的项目, 添加PWM驱动LED的方式实现呼吸灯功能, 电路板及相关使用到的配件说明 开发板 &#xff1a; Bearpi Std(小熊派标准板) 主芯片: STM32L431RCT6 E53_ST1扩展板/…

【acwing】92. 递归实现指数型枚举

穿越隧道 递归枚举、位运算 方法① 从1到n&#xff0c;顺序访问每位数&#xff0c;是否选择&#xff0c;每位数有两种状态&#xff0c;选1或不选0. AC代码如下&#xff1a; #include <iostream> using namespace std;const int N 100; // bool st[N]; int n;void dfs(in…

智能优化算法应用:基于指数分布算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于指数分布算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于指数分布算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.指数分布算法4.实验参数设定5.算法结果6.参考…

优雅玩转实验室服务器(一)登录服务器

这篇文章更加偏向于使用python程序进行研究的朋友们 原料 Windows主机实验室Linux服务器&#xff08;可以访问互联网&#xff09;一点点耐心 step.0 windows terminal is all you need 别跟我说什么putty&#xff0c;什么winscp&#xff0c;我就是单推Win11自带的软件——win…

DNS漫游指南:从网址到IP的奇妙之旅

当用户在浏览器中输入特定网站时发生的整个端到端过程可以参考下图 1*4vb-NMUuYTzYBYUFSuSKLw.png 问题&#xff1a; 什么是 DNS&#xff1f; 答案 → DNS 指的是域名系统&#xff08;Domain Name System&#xff09;。DNS 是互联网的目录&#xff0c;将人类可读的域名&#…

佛山陶企再造行业新风口,开启中国陶瓷下半场

近年来&#xff0c;消费形态逐渐呈现年轻化、时尚化、数字化的趋势&#xff0c;新一地居住者对于居住环境的品质和舒适度要求日益提高。伴随着新消费势力的崛起&#xff0c;家居建材行业消费转型升级已成必然。“千年陶都”佛山作为我国陶瓷行业的风向标&#xff0c;率先推进技…

漏洞复现-云安宝-云匣子Fastjson命令执行(附漏洞检测脚本)

免责声明 文章中涉及的漏洞均已修复&#xff0c;敏感信息均已做打码处理&#xff0c;文章仅做经验分享用途&#xff0c;切勿当真&#xff0c;未授权的攻击属于非法行为&#xff01;文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何直接或者间接的…

在做题中学习(32):只出现一次的数字 III

260. 只出现一次的数字 III - 力扣&#xff08;LeetCode&#xff09; 根据题目可知&#xff1a;有两个元素只出现一次&#xff0c;其余出现两次。 而在只出现一次的数字 I 里&#xff0c;只有一个元素出现一次&#xff0c;可以用异或的方式直接得到最后的答案&#xff0c;而此…

基于导数Zernike多项式拟合技术的干涉测量二维相位展开算法(原文翻译)

Zixin Zhao1&#xff0c;Hong Zhao1、Lu Zhang 1&#xff0c;Fen Gao2&#xff0c;Yuwei Qin3&#xff0c;Hubing Du 摘要: 我们提出了一种适用于一般干涉测量应用的相位展开方法。所提出的方法依赖于导数泽尼克多项式拟合&#xff08;DZPF&#xff09;技术&#xff0c;其中相…

Datawhale聪明办法学Python(task2Getting Started)

一、课程基本结构 课程开源地址&#xff1a;课程简介 - 聪明办法学 Python 第二版 章节结构&#xff1a; Chapter 0 安装 InstallationChapter 1 启航 Getting StartedChapter 2 数据类型和操作 Data Types and OperatorsChapter 3 变量与函数 Variables and FunctionsChapte…

马赛克,克星,真来了!v2.0

大家好&#xff0c;今天继续聊聊 AI 开源项目 AI 开源项目 1、DemoFusion AI 绘画的潜力还没有充分挖掘出来&#xff0c;仍然还有上升的空间。 DemoFusion 就是这么一个开源项目&#xff0c;继续深挖了 AI 绘画在高分辨率图片生成的效果。 提高分辨率&#xff0c;马赛克&a…

算法 - 二分搜索法 / 二分法(704)

原理&#xff1a; 利用数组的有序性&#xff0c;每次取查找范围的中间点&#xff0c;缩窄一半的查找空间。比较中间值和目标值的大小&#xff0c;直到找到目标值或者查找区间为空时返回。 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 题目&…

2023-12-05 Qt学习总结10

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

在线原型设计网站有哪些?这7个超好用!

如今&#xff0c;在线软件逐渐成为主流&#xff0c;网站原型设计工具也不例外。与桌面相比&#xff0c;在线原型工具具有独特的优势。都不需要安装、限制位置或限制操作系统。以下将为您推荐 7 款非常实用的在线原型设计工具。看看有没有你会喜欢的呢。 1、即时设计 即时设计是…

sleep和wait区别,并且查看线程运行状态

一、sleep和wait区别 区别一&#xff1a;语法使用不同 wait 方法必须配合 synchronized 一起使用&#xff0c;不然在运行时就会抛出 IllegalMonitorStateException 的异常 而 sleep 可以单独使用&#xff0c;无需配合 synchronized 一起使用。 区别二&#xff1a;所属类不同…

【动态规划精选题目】1、斐波那契数列模型

此动态规划系列主要讲解大约10个系列【后续持续更新】 本篇讲解入门级&#xff1a;斐波那契模型&#xff0c;会在讲解题目同时给出AC代码 为什么叫斐波那契数列模型&#xff1f;因为本篇4道题的状态转移方程都跟斐波那契递推方程差不多&#xff0c;但这点不重要&#xff0c;请往…

Python 全栈体系【四阶】(四)

第四章 机器学习 一、人工智能概述 1. 什么是人工智能 人工智能&#xff08;Artificial Intelligence&#xff09;是计算机科学的一个分支学科&#xff0c;主要研究用计算机模拟人的思考方式和行为方式&#xff0c;从而在某些领域代替人进行工作。 2. 人工智能的学科体系 …