首页 > 其他分享 >外部中断

外部中断

时间:2025-01-20 16:10:18浏览次数:1  
标签:优先级 Pin 中断 NVIC 外部 GPIO EXTI

1、中断系统

中断源:引脚发生电平跳变、定时器时间到达、串口接收到通信数据

EXTI外部中断:EXTI0-EXTI4,EXTI9—5,EXTI15—10

TIM定时器中断、ADC 模数转换中断、USART、SPI、I2C、RTC实时时钟、窗口看门狗中断、PVD中断

中断优先级:区别多个中断源的轻重缓急

中断嵌套:中断的中断

中断程序:硬件自动调用函数

 

2、NVIC(内核外设,嵌套中断向量控制器):

用来管理中断、分配优先级的,分16个中断优先级,包括抢占优先级和响应优先级

0个抢占优先级 × 16个响应优先级

2个抢占优先级 ×  8个响应优先级

4个抢占优先级×  4个响应优先级

8个抢占优先级 × 2个响应优先级

16个抢占优先级 × 0个响应优先级

 

3、AFIO:① 复用功能引脚重映射 ② 中断引脚选择

 

4、EXTI外部中断

监测指定GPIO口的电平变化:

16个GPIO口(相同Pin不能同时触发),PVD输出、RTC闹钟、USB唤醒、以太网唤醒

上升沿/下降沿/双边沿触发中断/软件触发

中断响应(触发CPU执行中断函数)+ 事件响应(通知其他外设工作)

 

5、红外对射式传感器触发LED流水灯实验

外设代码:

CountSensor.c

#include "stm32f10x.h" 

uint16_t Count = 0;

void CountSensor_Init()
{
	/* RCC开启GPIOB时钟 */
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); 
	//PB14口,GPIOB是APB2总线的外设

	/* RCC开启AFIO时钟 */	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
    //AFIO是APB2总线的外设
	
	/* EXTI 和 NVIC 不需要开启时钟 */
	
	/* 配置GPIO */
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB, &GPIO_InitStructure);
	
	/* 配置AFIO */
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource14);
	
	/* 配置EXTI */
	EXTI_InitTypeDef EXTI_InitStruct; 
	EXTI_InitStruct.EXTI_Line = EXTI_Line14;
	EXTI_InitStruct.EXTI_LineCmd = ENABLE;
	EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
	EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising;
	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);
}

uint16_t CountSensor_GetCnt(void)
{
	return Count;
}

void CountSensor_ClearCnt(void)
{
	Count = 0;
}

void EXTI15_10_IRQHandler(void)
{
	 if (SET == EXTI_GetITStatus(EXTI_Line14))
	 {
	    Count = 1;
		EXTI_ClearITPendingBit(EXTI_Line14);
	 }
}

 

CountSensor.h

#ifndef __CNT_SENSOR_H__
#define __CNT_SENSOR_H__

void CountSensor_Init(void);
uint16_t CountSensor_GetCnt(void);
void CountSensor_ClearCnt(void);

#endif

 

main.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "CountSensor.h"

int main(void)
{ 
	OLED_Init();	
	CountSensor_Init();

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); 
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_2 | GPIO_Pin_4;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);	
	
	while(1)
	{
		if(0 != CountSensor_GetCnt())
		{
			/* RCC开启GPIOA时钟 */
			
			GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_RESET);
			Delay_ms(100);
			GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_SET);
			
			GPIO_WriteBit(GPIOA, GPIO_Pin_2, Bit_RESET);
			Delay_ms(100);
			GPIO_WriteBit(GPIOA, GPIO_Pin_2, Bit_SET);
			
			GPIO_WriteBit(GPIOA, GPIO_Pin_4, Bit_RESET);
			Delay_ms(100);	
			GPIO_WriteBit(GPIOA, GPIO_Pin_4, Bit_SET);	
			
			CountSensor_ClearCnt();
		}	
		
	}	
}

 

标签:优先级,Pin,中断,NVIC,外部,GPIO,EXTI
From: https://www.cnblogs.com/czy363/p/18681617

相关文章

  • web攻击-外部路径遍历攻击(External Path Traversal Attack)
    外部路径遍历攻击(ExternalPathTraversalAttack),也被称为目录遍历攻击,是一种网络攻击技术,攻击者试图通过篡改应用程序或系统的路径参数,访问本来应该受限的文件或目录。 这种攻击通常发生在Web应用程序中,当应用程序处理用户输入的文件路径时,如果没有对路径进行适当的验证和过......
  • 外中断引脚测试NVIC中断系统功能&USART程序设计
    文章目录一、STM32之NVIC中断系统二、外中断引脚测试NVIC中断系统功能三、STN32外设之USART四、USART程序设计&总结详解一、STM32之NVIC中断系统(一)、中断处理机制:NVIC的定义:NVIC又叫嵌套向量中断控制器,属于CM4内核。它控制着整个芯片中断相关的功能,是内核的一个外设......
  • ingress-nginx代理tcp使其能外部访问mysql
    一、helm部署mysql主从复制helmrepoaddbitnamihttps://charts.bitnami.com/bitnamihelmrepoupdate helmpullbitnami/mysql 解压后编辑values.yaml文件,修改如下(storageclass已设置默认类)117##@paramarchitectureMySQLarchitecture(`standalone`or`re......
  • 求助,51单片机定时器中断控制数码管
    遇到的问题是:动态显示时,如果位选变化间隔太小,会导致计数的部分失效,数码管一直显示0000,间隔在30时数字会有变化,但是显示闪烁的效果太明显了代码如下:#defineuintunsignedint#defineucharunsignedchar//位选定义sbitwei0=P1^3;sbitwei1=P1^4;sbitwei2=P1^5;sbi......
  • 27 Xbox蓝牙连接不稳定,游戏中断联,新手柄,反映延持,忽然失联的解决方法,蓝牙连接后无法自
    27新买了一个Xbox,蓝牙连接后有时会突然断联,游戏中会忽然失灵一般新手柄硬件绝对没问题,电脑自己的硬件以及软件驱动也没问题,那就是手柄自带驱动不行,!更新!一个新手柄驱动的即可解决方法1.下载一个软件“XboxAccessories”,微软商店或者网上直接找均可,我这用的网络的网址,因为微软......
  • 网络协议的自主研发是指在没有依赖外部技术或标准的情况下,组织或企业自己设计和开发的
    网络协议的自主研发是指在没有依赖外部技术或标准的情况下,组织或企业自己设计和开发的网络协议。这样的协议通常针对特定的需求或场景进行优化,旨在提高效率、安全性、兼容性或满足其他特定功能要求。自主研发的网络协议可能涉及不同的层次,从物理层、数据链路层到应用层。自主研发......
  • 深入理解 Three.js 加载器:如何导入外部模型(GLTF、OBJ、FBX)
    深入理解Three.js加载器:如何导入外部模型(GLTF、OBJ、FBX)Three.js提供了强大的加载器系统,可以轻松地将外部模型(如GLTF、OBJ、FBX等格式)加载到场景中,为你的3D项目增添真实感。在这篇文章中,我们将深入讲解Three.js加载器的使用方法,并结合实际案例展示如何在Vue项......
  • don‘t sleep一款阻止系统意外中断,保证工作娱乐安全运行的软件!
    软件介绍给大家分享一款大小仅500多KB,用于防止系统进入关机、重启、待机、睡眠、休眠、注销、屏幕保护等状态功能的软件,避免工作或者娱乐受到打扰。软件主要由阻止和允许功能构成。例如当你在下载、暂时离开、工作的时候使用阻止功能可以避免系统进入不同的电源管理模式......
  • 第七章 中断
    第七章中断本文是对《操作系统真象还原》第七章学习的笔记,欢迎大家一起交流。a启用中断本节的主要任务是打开中断,并且使用时钟中断测试知识部分中断分类中断可以分为外部中断和内部中断,这已经是老生常谈的话题了,不再多说。外部中断又可以分为可屏蔽中断和不可屏蔽中断,其......
  • 如何处理Redis连接中断的问题?
    当您遇到Redis连接中断(如“Rediswentaway”)的问题时,这通常是由于网络连接不稳定、配置参数不合理或资源不足等原因引起的。为了解决这个问题,您可以按照以下步骤进行排查和优化:检查网络连接:确保服务器与Redis实例之间的网络连接稳定可靠。可以通过ping命令测试延迟情况,或者使......