中断-STM32

news2024/9/21 23:51:04

中断-STM32

中断:在主程序运行过程中,出现了特定的中断触发条件 (中断源),使得CPU暂停当前正在运行的程序转而去处理中断程序处理完成后又返回原来被暂停的位置继续运行。
中断优先级:当有多个中断源同时申请中断时,CPU会根据中断源的轻重缓急进行裁决,优先响应更加紧急的中断源。
中断嵌套:当一个中断程序正在运行时,又有新的更高优先级的中断源申请中断CPU再次暂停当前中断程序,转而去处理新的中断程序,处理完成后依次进行返回。
68个可屏蔽中断通道包含EXTI、TIM、ADCUSART、SPI、12C、RTC等多个外设。
使用NVIC统一管理中断,每个中断通道都拥有16个可编程的优先等级,可对优先级进行分组,进一步设置抢占优先级和响应优先级。
在这里插入图片描述
GPIO_Pin中Pin相同的不能同时触发中断。
在这里插入图片描述

配置步骤

在这里插入图片描述
第一步,配置RCC,把涉及的外设的时钟都打开。
第二步,配置GPIO,选择端口为输入模式。
第三步,配置AFIO,选择用的这一路GPIO,连接到后面的EXTI。
第四步,配置EXTI,选择边沿触发方式,比如上升沿、下降沿或者双边沿。还有选择触发响应方式,可以选择中断响应和事件响应。(一般选择中断响应)。
第五步,配置NMIC,给我们这个中断选择一个合适的优先级。通过NVIC,外部中断信号就能进入CPU了。CPU才能收到中断信号,才能跳转到中断函数里执行中断程序。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
以IRQHandler结尾的字符串就是中断函数的名字
在这里插入图片描述

#include "stm32f10x.h"                  // Device header

//用一个数字来统计中断触发的次数
uint16_t CountSensor_Count;

void CountSensor_Inint(void)
{
	//第一步:配置时钟
	
	//开启RRC时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//注意函数和参数的这个APB2、APB1和AHB要对应起来
	//开启AFIO的时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);

	//第二步:配置GPIO
	GPIO_InitTypeDef GPIO_InitStruct;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;//跟参考手册选择上拉模式,复用
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_14;
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB,&GPIO_InitStruct);
	
	//第三步:配置AFIO
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource14);//选择GPIOB_14为中断引脚
	
	//第四步:配置EXTI
	EXTI_InitTypeDef EXTI_InitStruct;
	EXTI_InitStruct.EXTI_Line = EXTI_Line14;//选择第14路中断
	EXTI_InitStruct.EXTI_LineCmd = ENABLE;//使能中断
	EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;//中断触发
	EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Falling;//下降沿触发
	EXTI_Init(&EXTI_InitStruct);
	
	
	//配置NVIC
	//注意:分组方式整个芯片只能用一种,因此,分组的代码只需要执行一次
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	NVIC_InitTypeDef NVIC_InitStruct;
	NVIC_InitStruct.NVIC_IRQChannel = EXTI15_10_IRQn;
	NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;
	NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;
	NVIC_Init(&NVIC_InitStruct);
}

//编写中断函数
//中断函数的名字都是固定的,中断函数都是无参数无返回值的
//写错了就进不了中断了,最好是直接从启动文件复制过来
//中断函数就不用声明,因为中断函数不需要调用,它是自动执行的
void EXTI15_10_IRQHandler(void)
{
	//一般先进行中断标志位的判断	
	if(EXTI_GetITStatus(EXTI_Line14) == SET)
	{
		CountSensor_Count++;//记录进入中断的次数
		//每次中断程序结束后,都应该清除一下中断标志位
		EXTI_ClearITPendingBit(EXTI_Line14);
	}
}

//返回中断次数
uint16_t Get_CountSensor_Count(void)
{
	return CountSensor_Count;
}

#ifndef _COUNTSENSOR_H
#define _COUNTSENSOR_H

void CountSensor_Inint(void);
uint16_t Get_CountSensor_Count(void);
#endif

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "LED.h"
#include "KEY.h"
#include "CountSensor.h"


int main(void)
{

	CountSensor_Inint();
	
	while(1)
	{

	}
}

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

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

相关文章

Java程序猿搬砖笔记(十一)

文章目录 Hexo博客 Next主题图片防盗链问题Springboot Druid数据库密码加密配置步骤Java统计字符串出现的次数Java获取某个字符在字符串中出现第N次的位置Maven激活指定profileMaven中resources标签的用法详解MySQL 字符集不一致报错EasyExcel日期格式化Configuration、Compone…

gradle Task 详解

Task定义和配置 查看工程下所有的task,使用如下命令 gradle tasks 定义一个task task创建的源码 参数分别是 task 名称,和一个 closure。groovy语法的closure可以写在小括号外面,小括号可以省略 task的源码 public interface Task extends…

【Java笔试强训 25】

🎉🎉🎉点进来你就是我的人了博主主页:🙈🙈🙈戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔🤺🤺🤺 目录 一、选择题 二、编程题 🔥星际密码…

RabbitMQ死信队列延迟交换机

RabbitMQ死信队列&延迟交换机 1.什么是死信 死信&死信队列 死信队列的应用: 基于死信队列在队列消息已满的情况下,消息也不会丢失实现延迟消费的效果。比如:下订单时,有15分钟的付款时间 2. 实现死信队列 2.1 准备E…

网络编程代码实例:IO复用版

文章目录 前言代码仓库内容代码(有详细注释)server.cclient_select.cclient_poll.cclient_epoll.c 结果总结参考资料作者的话 前言 网络编程代码实例:IO复用版。 代码仓库 yezhening/Environment-and-network-programming-examples: 环境和…

[Linux]网络连接、资源共享

​⭐作者介绍:大二本科网络工程专业在读,持续学习Java,输出优质文章 ⭐作者主页:逐梦苍穹 ⭐所属专栏:Linux基础操作。本文主要是分享一些Linux系统常用操作,内容主要来源是学校作业,分享出来的…

详解c++---vector模拟实现

目录标题 准备工作构造函数迭代器的完善性质相关的函数实现reservepush_back[ ]emptyresizeinserteraseerase后迭代器失效问题swapclear~vector老式拷贝构造迭代器构造新式拷贝构造老式赋值重载新式赋值重载N个数据的构造vector的浅拷贝问题 准备工作 首先我们知道vector是一个…

HTB靶机06-Beep-WP

beep 靶机IP:10.10.10.7 攻击机IP:10.10.14.6 web RCE漏洞利用、nmap提权 扫描 nmap 常规扫描: ┌──(xavier㉿xavier)-[~/HTB/005-Beep] └─$ sudo nmap -sSV -sC 10.10.10.7 -oN nmap1.out Starting Nmap 7.91 ( https://nmap.org …

《道德经》

《道德经》是春秋时期老子(李耳)的哲学作品,又称《道德真经》、《老子》、《五千言》、《老子五千文》,是中国古代先秦诸子分家前的一部著作,是道家哲学思想的重要来源。 道德经分上下两篇,原文上篇《德经…

网络安全: CIDR无类别路由

网络安全: CIDR无类别路由 CIDR是无类别路由,出现CIDR的原因是因为ipv4的地址被使用完客,CIDR的出现暂缓了ipv4用完的速度。 原本的ipv4很刻板,网络号分成8位,16位,24位作为掩码,也就是 xxx.0…

DRY编码原则

基本情况 DRY,Don’t repeat yourself,就是不要重复你自己的意思。 不要重复,是多么简单的意思了,重复就是多了一个一样的东西,为什么多一个呢,一个就可以了,这样才简单,这是一个常…

【报错】arXiv上传文章出现XXX.sty not found

笔者在overleaf上编译文章一切正常,但上传文章到arxiv时出现类似于如下报错: 一般情况下观察arxiv的编译log,不通过的原因,很多时候都是由于某一行导入了啥package,引起的报错;但是如果没有任何一个具体的…

AppSmith(安装与练习4套)

AppSmith官网文档: https://docs.appsmith.com/getting-started/setup/installation-guides/docker安装前需要已经安装好docker,需要版本如下: Docker ( 20.10.7或者更高) Docker-Compose ( 1.29.2或者更高) 安装Appsmith: 准备…

【Linux】第二站:Linux基本指令(一)

文章目录 一、操作系统OS概念1.OS是什么?2.为什么要有OS?1.一个好的操作系统,他的衡量指标是什么?2.操作系统的核心工作 3.理解我们在计算机上的操作4.Linux和Windows的特点 二、Linux基本指令1. 指令概述2.ls指令1> ls -l2> ls -a3&g…

ChatGPT其实并不想让开发人员做这5件事情

前言 ChatGPT已经火爆了快半年了吧,紧接着国内也开始推出了各种仿制品,我甚至一度怀疑,如果人家没有推出ChatGPT,这些仿制品会不会出现。而很多人也嗨皮得不行,利用各种方法开始科学上网,用ChatGPT做各种觉…

不得不说的行为型模式-解释器模式

解释器模式: 解释器模式(Interpreter Pattern)是一种行为型设计模式,它定义了一种语言,用于解释执行特定的操作,例如正则表达式、查询语言、数学表达式等。该模式通过定义一个解释器来解释语言中的表达式…

分治与减治算法实验:题目6 淘汰赛冠军问题

目录 前言 实验内容 实验流程 实验分析 实验过程 流程演示 写出伪代码 实验代码 运行结果 改进算法 总结 前言 淘汰赛冠军问题是一个经典的算法设计与分析的问题,它要求我们在给定的n个参赛者中,通过一系列的比赛,找出最终的冠军…

nginx负载均衡+RabbitMq集群及镜像队列(2)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、nginx是什么?二、搭建步骤1.软件和环境2.安装nginx3.负载均衡配置nginx.conf4.应用程序配置 总结 前言 提示:这里可以添加本文要记…

Linux套接字编程-3

在之前的套接字编程内容中,我们讲述完了UDP和TCP的主要内容,但是对于TCP通信中具体的实现还存在一些问题没有解决,所以我们本篇博客将对进行分析和解决。 目录 1.引入 2.多进程 3.多线程 1.引入 在上一篇博客中,当我们使用T…

sed进阶之模式替换

shell脚本编程系列 &符号可以代表替换命令中的匹配模式,不管模式匹配到了什么样的文本,都可以使用&符号代表这些内容。这样就能处理匹配模式的任何单词了。 echo "The cat sleeps in his hat." | sed s/.at/"&"/g&…