1.16中断实验

news2024/11/28 16:28:08

一.异常处理流程

1.异常处理流程
(1)保存现场(CPU自动完成)
    将CPSR中状态保存到SPSR_<MODE>中
        将CPSR寄存器的状态位T,改为ARM状态
        根据需要,进制IRQ,FIQ中断,修改CPSR中I/F位
        修改CPSR寄存器中的模式位[4:0],切换到对应的异常模式
    将函数返回值地址保存到LR_<MODE>中,
    修改PC指针指向异常向量表
(2)恢复现场(手动完成)
    恢复SPSR_<MODE>寄存器中的值到CPSR中
    恢复LR_<MODE>寄存器中的值。给到对应的PC        

 

二.中断实现框图

 

三.中断流程   

GPIO组先到EXTI中中断选择寄存器,选择对应中断对应的EXTI寄存器,在进行检验触发事件(选择下降沿触发或上升沿触发,按键中断属于下降沿触发),再设置中断屏蔽寄存器,设置为不屏蔽中断,之后进入GICD层,GICD层管理着288个中断号,先通过中断设置寄存器给对应中断号位置使能,之后设置中断优先级,GICD层的中断优先级需要比GICC层的中断优先级高,(值越小,优先级越高),之后通过中断目标选择寄存器选择CPU,并进入GICC层.GICC在GICC层中也需要设置中断优先级,并通过捕获中断号寄存器获取中断号,清除中断号寄存器清除中断号

四.分析芯片手册

RCC:使能GPIO

GPIO:设置GPIO_MODER为输入模式

EXTI:

设置中断对应的EXTI寄存器

设置触发中断方式为下降沿触发

设置中断屏蔽寄存器为不屏蔽中断

利用中断标志位清除中断

GIC:

GICD:

使能GICD层

设置对应中断号位置使能

设置中断优先级

利用中断目标选择寄存器选择CPU

利用GICD层中断挂起标志位进行清除中断

GICC:

使能GICC层

设置中断优先级屏蔽寄存器

利用捕获中断寄存器获取中断号

利用清除中断寄存器清除中断号

五.代码

key.c

#include "../include/key.h"
#include "../common/include/stm32mp1xx_gpio.h"
#include "../common/include/stm32mp1xx_exti.h"
#include "../common/include/stm32mp1xx_gic.h"
#include "../common/include/stm32mp1xx_rcc.h"

/*
 *   key1-----PF9
 *
 *   key2-----PF7
 *
 *   key3-----PF8
 */

//uart4初始化
void rcc_init()
{
	RCC->MP_AHB4ENSETR|=(0x1<<5);
}

void gpio_init(){
	GPIOF->MODER&=(~(0x3<<18)); //设置key1为输入模式
	GPIOF->MODER&=(~(0x3<<14));//设置key2为输入模式
	GPIOF->MODER&=(~(0x3<<16));//设置key3为输入模式
}

void exti_init(){
	//EXTICRn初始化
	EXTI->EXTICR3&=(~(0xff<<8));
	EXTI->EXTICR3|=(0x05<<8);   //key1
	
	EXTI->EXTICR2&=(~(0xff<<24));
	EXTI->EXTICR2|=(0x05<<24);   //key2

	EXTI->EXTICR3&=(~(0xff));
	EXTI->EXTICR3|=(0x05);

	//EXTIFTSR1初始化
	EXTI->FTSR1|=(0x1<<9);
	EXTI->FTSR1|=(0x1<<7);	
	EXTI->FTSR1|=(0x1<<8);

	//EXTI_IMR1
	EXTI->C1IMR1|=(0x1<<9);
	EXTI->C1IMR1|=(0x1<<7);
	EXTI->C1IMR1|=(0x1<<8);

}

void gicd_init(){
	GICD->CTRL|=0x1;         //使能GICD

	GICD->ISENABLER[3]|=0x1<<3;   //中断设置使能
	GICD->ISENABLER[3]|=0x1<<1;
	GICD->ISENABLER[3]|=0x1<<2;

	GICD->IPRIORITYR[24]|=(0x1<<27);  //中断优先级
	GICD->IPRIORITYR[24]|=(0x1<<11);
	GICD->IPRIORITYR[24]|=(0x1<<19);

	GICD->ITARGETSR[24]&=(~(0x3<<24));  //中断目标分配
	GICD->ITARGETSR[24]|=(0x1<<24);

	GICD->ITARGETSR[24]&=(~(0x3<<8));
	GICD->ITARGETSR[24]|=(0x1<<8);

	GICD->ITARGETSR[24]&=(~(0x3<<16));
	GICD->ITARGETSR[24]|=(0x1<<16);
	

}

void gicc_init(){
	GICC->CTRL|=0x1;
	GICC->PMR|=0x9<<3;

	
}

do_irq

#include "../include/key.h"
#include "../common/include/stm32mp1xx_gpio.h"
#include "../common/include/stm32mp1xx_exti.h"
#include "../common/include/stm32mp1xx_gic.h"
#include "../common/include/stm32mp1xx_rcc.h"
extern void printf(const char *fmt, ...);
extern void delay_ms(int ms);


unsigned int i = 0;
void do_irq(void) 
{
	unsigned int num;
	num=GICC->IAR&0x3ff;
	
	if(num==97){
		delay_ms(500);
		printf("key2############\n");
		EXTI->FPR1|=(0x1<<7);
		GICD->ICPENDR[3]|=0x1<<1;

	}else if(num==98){
		delay_ms(500);
		printf("key3############\n");
		EXTI->FPR1|=(0x1<<8);
		GICD->ICPENDR[3]|=0x1<<2;
	
	}else if(num==99){
		delay_ms(500);
		printf("key1############\n");
		EXTI->FPR1|=(0x1<<9);
		GICD->ICPENDR[3]|=0x1<<3;
	
	}

//清除中断号
	GICC->EOIR&=(~(0x3ff));
	GICC->EOIR|=num;

}
#include "./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++);
}

void init()
{
	rcc_init();
	gpio_init();
	exti_init();
	gicd_init();
	gicc_init();

}

int main()
{
	init();
	while(1)
	{
	}
	return 0;
}

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

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

相关文章

java springboot 项目构建报错解决办法

这里总结了一些常见的springboot 项目构建报错及解决办法 错误: 无效的源发行版:17 错误原因 build.gradle 文件中可以通过下面两项来指定项目运行所需的jdk版本 sourceCompatibility:指定编译编译.java文件的jdk版本 targetCompatibility&#xff1a;确保class文件与target…

ARM 看门狗定时器

一、什么是看门狗、有什么用 (1) 看门狗定时器和普通的定时器并无本质区别。定时器可以设定一个时间&#xff0c;在这个时间完成之前定时器不断计时&#xff0c;时间到的时候&#xff0c;定时器会复位 CPU&#xff08;重启系统&#xff09;。 (2 )系统正常工作的时候当然不希望…

feign漫谈

feign的简单使用。 文章目录什么是feign准备工作三.如何使用3.1 定义pom文件3.2 定义配置文件及启动类注解3.3 定义feign接口什么是feign 远程调用框架 准备工作 需要nacos环境&#xff1a; 涉及到feign调用&#xff0c;就没法抛开注册中心&#xff0c;接下来我们使用主流的…

使用Python创建websocket服务端并给出不同客户端的请求

作者&#xff1a;虚坏叔叔 博客&#xff1a;https://xuhss.com 早餐店不会开到晚上&#xff0c;想吃的人早就来了&#xff01;&#x1f604; 使用Python创建websocket服务端&#xff0c;并给出不同客户端的请求 一、 WebSocket是啥 WebSocket 和HTTP一样&#xff0c;也是一种通…

java中的位运算符

在Java语言中&#xff0c;提供了7种位运算符&#xff0c;分别是按位与&#xff08;&&#xff09;、按位或&#xff08;|&#xff09;、按位异或&#xff08;^&#xff09;、取反(~)、左移(<<)、带符号右移(>>)和无符号右移(>>>)。位运算符是对long、i…

怎么把两个PDF合并成一个?这几种操作轻松合并

我们在工作中处理过的文件有很多&#xff0c;有时候为了工作更方便&#xff0c;我们通常需要把两个或是多个文件合并成为一个PDF文件&#xff0c;这样只需要打开这一个文件就可以查看全部内容&#xff0c;那么怎么把两个PDF合并成一个呢&#xff1f;这几种操作都可以轻松合并&a…

Dopamine-PEG-NH2氨基聚乙二醇多巴胺,材料改性用科研试剂

英 文 &#xff1a;NH2-PEG-Dopamine/Dopamine-PEG-NH2 中文&#xff1a;氨基聚乙二醇多巴胺 存储条件&#xff1a;-20C&#xff0c;避光&#xff0c;避湿 用 途&#xff1a;仅供科研实验使用&#xff0c;不用于诊治 外观: 固体或粘性液体&#xff0c;取决于分子量 注意事项…

javaEE 初阶 — 文件内容的读写

文章目录数据流1. 字节流1.1 InputStream 概述1.1.1 无参数 read 的使用1.1.2 一个参数 read 的使用1.2 使用 OutputStream 写文件1.2.1 对于关闭文件的解释2. 字符流2.1 Reader 概述2.1.1 read 方法的使用2.2 Writer 概述2.2.1 write 的使用2.3 Scanner 补充数据流 针对文件内…

Cookie和Session以及相关的方法

作者&#xff1a;~小明学编程 文章专栏&#xff1a;JavaEE 格言&#xff1a;热爱编程的&#xff0c;终将被编程所厚爱。 目录 Cookie 什么是Cookie? 为什么要用Cookie? Cookie的原理 Session 什么是Session? 为什么要用Session? Session原理 核心方法 实现用户登…

【Linux编译器】

前言 打怪升级第&#xff1a;22天 一、gcc、g 背景知识&#xff1a; gcc和g都是Linux中的编译器&#xff0c;其中gcc只可以编译C语言文件&#xff0c;g可以编译c文件&#xff0c;当然也可以编译C语言文件&#xff08;c兼容C语言嘛&#xff09;。 由于两者的操作选项基本一样&a…

转换函数和运算符类

我们以下是采用内联函数来进行的#ifndef ___Class_Counter #if 1 #endif ___Class_counter #include <climits> class Counter{unsigned cnt; // unsigned mmm; public:Counter() : cnt(0) {}//构造函数初始化器//Counter(double mmm):mmm(2){}/*void increment() {i…

低代码平台助力汽车行业构筑新基建

编者按&#xff1a;本文分析了汽车行业数字化转型的需求&#xff0c;并列举了汽车行业利用低代码平台数字化转型的场景&#xff0c;最后通过华晨汽车案例展示了低代码在实现业务模板集成方面的表现。关键词&#xff1a;数据集成&#xff0c;低代码平台&#xff0c;汽车行业汽车…

后台生成4位图像验证码

主要依赖&#xff1a; <dependency><groupId>com.github.penggle</groupId><artifactId>kaptcha</artifactId><version>2.3.2</version> </dependency>spring相关依赖参照用到的另行添加。 package com.math.controller;impor…

质心标准差和分散程度

( A, B )---1*30*2---( 1, 0 )( 0, 1 ) 让网络的输入只有1个节点&#xff0c;AB各由9张二值化的图片组成&#xff0c;在前述的实验中得到了A全是0&#xff0c;B中有3个1的迭代次数数据。 0 1 2 3 4 5 6 7 8 迭代次数 A-B 1b 1b 1b 0 0 0 0 0 0 54269.648 …

Java 日志框架 JUL

文章目录日志文件的重要性常见日志框架什么是JULJUL架构介绍入门案例JUL日志级别Logger之间的父子关系日志的配置文件日志原理解析日志文件的重要性 做开发最怕的就是线上系统出问题了&#xff0c;轻则留下产品和系统不安全可靠的不好印象&#xff0c;重则影响到公司的收入和口…

②【Spring】一文精通:IOC - 基于XML方式管理Bean

个人简介&#xff1a;Java领域新星创作者&#xff1b;阿里云技术博主、星级博主、专家博主&#xff1b;正在Java学习的路上摸爬滚打&#xff0c;记录学习的过程~ 个人主页&#xff1a;.29.的博客 学习社区&#xff1a;进去逛一逛~ IOC操作&#xff1a;基于XML管理Bean一、&…

智公网:公务员行测基础考点

一、法律常识 1. 行政主体要“三有”&#xff0c;一有“权”&#xff08;行政权力&#xff09;&#xff0c;二有“名”&#xff08;以自己名义从事行政管理&#xff09;&#xff0c;三有“责”&#xff08;独立承担行政责任&#xff09;。 2. 受委托的组织和个人不具备行政主…

【自学Python】Python查找字符串

Python查找字符串 Python查找字符串教程 在开发过程中&#xff0c;很多时候我们有在一个 字符串 中查找另一个字符串的需求&#xff0c;在 Python 中&#xff0c;在一个字符串中查找另一个字符串我们使用 find() 函数。 Python find()函数详解 语法 S.find(sub[, start[, …

基于2D Object Detection的目标几何中心三维位置估计(C++)

文章目录 介绍前置知识三维位置估计订阅内参订阅对齐后的深度图并进行后处理源码介绍 这篇博客将简单讲解下如何利用二维目标检测方法和RGBD数据来获取感兴趣目标的几何中心三位位置结果。 前置知识 为了让博客内容显得简洁些,这里不再介绍前置知识,包括: 2D Object Dete…

selenium通过cookie跳过登录验证码实现登录

一般做ui自动化面对验证码一直是一个问题&#xff0c;在网上页百度了一些关于验证码的问题&#xff0c;有通过把验证码提取下来通过pytesser&#xff0c;tesseract&#xff0c;OCR 等库处理&#xff0c;但是这些比较麻烦。 还是因为本人比较渣看不懂&#xff0c;后来想到了weba…