08:【stm32】中断二:EXTI(外部中断)

devtools/2024/10/18 11:05:43/

EXTI(外部中断)

  • 1、EXTI简介
  • 2、EXTI的内部结构
    • 2.1、EXTI通道
    • 2.2、内部寄存器
  • 3、EXTI的编写程序
    • 3.1、EXTI的编程接口
      • 3.1.1、EXTI_Init
  • 4、编写实验

1、EXTI简介

   外部中断控制器,能够检测外部输入信号的变化边沿并由此产生中断。通过检测上升沿或者下降沿来产生中断源

在这里插入图片描述

2、EXTI的内部结构

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

边沿检测检测到电平的跳变都会生成一个高脉冲信号,然后脉冲通过边沿选择传递到中断屏蔽,当中断屏蔽遇到脉冲时,打开开关,中断挂起有0->1,然后执行中断函数。【注】中断挂起需要手动置0。

2.1、EXTI通道

  EXTI一共有20个通道,分别为EXTI0~EXTI19。而IO0连接着EXTI0通道,IO1连接着EXTI1通道,以此类推。让所有IO具备触发中断的能力
在这里插入图片描述
当然,如果GPIOA0使用了EXTI0时,GPIOB0~GPIOG0都不能使用EXTI0了,所以每个通过也就只能使用一个IO口。

2.2、内部寄存器

在这里插入图片描述
如图:除了软件触发寄存器外,其他的寄存器都是20位的,分别对应着20个EXTI通道。

  • 当给上升沿寄存器的TR0写入1,给下降沿寄存器TR0写入0时,则EXTI0通道是上升沿产生一个中断源。如果都写入1,则上升沿和下降沿都能产生中断源。
  • 中断屏蔽寄存器是开关,写入1关闭开关,写入0打卡开关
  • 挂起寄存器,我们只需要手动置0,每次中断函数执行完成后,我们都应该给他置0,以便等待下一次中断

3、EXTI的编写程序

3.1、EXTI的编程接口

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

3.1.1、EXTI_Init

在这里插入图片描述
为什么不开启EXTI的时钟?因为啊默认都是打开了的。

4、编写实验

   按钮通过外部中断控制LED灯的亮灭。下面是程序编写模型

在这里插入图片描述
其中AFIO用于选择IO引脚

在这里插入图片描述
代码①:

/*按钮通过外部中断控制LED灯的亮灭。*/
#include "stm32f10x.h"
#include "stm32f10x_pal.h"
#include "OLED.h"int main(void)
{
//	PAL_Init();
//	OLED_Init();//1.PA0,PA1,PC13引脚的初始化RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);GPIO_InitTypeDef GPIOInitStruct;GPIOInitStruct.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;//按钮GPIOInitStruct.GPIO_Mode = GPIO_Mode_IPU;//配置为上拉输入GPIO_Init(GPIOA ,&GPIOInitStruct);GPIOInitStruct.GPIO_Pin = GPIO_Pin_13;//LEDGPIOInitStruct.GPIO_Speed = GPIO_Speed_2MHz;GPIOInitStruct.GPIO_Mode = GPIO_Mode_Out_OD;//配置为开漏输出GPIO_Init(GPIOC,&GPIOInitStruct);//2.AFIO选择通道RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);//选择EXTI0GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource1);//选择EXTI1//3.对EXTI0,EXTI1通道进行配置//3.1.对EXTI0进行配置EXTI_InitTypeDef EXTIInitStruct;EXTIInitStruct.EXTI_Line = EXTI_Line0;EXTIInitStruct.EXTI_Mode = EXTI_Mode_Interrupt;EXTIInitStruct.EXTI_Trigger = EXTI_Trigger_Rising;//上升沿产生中断源EXTIInitStruct.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTIInitStruct);//3.2.对EXTI1进行配置EXTIInitStruct.EXTI_Line = EXTI_Line1;EXTIInitStruct.EXTI_Mode = EXTI_Mode_Interrupt;EXTIInitStruct.EXTI_Trigger = EXTI_Trigger_Rising;//上升沿产生中断源EXTIInitStruct.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTIInitStruct);//4.对NVIC进行配置NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//4.1.对中断源0进行配置NVIC_InitTypeDef NVICInitStruct;NVICInitStruct.NVIC_IRQChannel = EXTI0_IRQn;NVICInitStruct.NVIC_IRQChannelPreemptionPriority = 0;NVICInitStruct.NVIC_IRQChannelSubPriority = 0;NVICInitStruct.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVICInitStruct);///4.1.对中断源1进行配置NVICInitStruct.NVIC_IRQChannel = EXTI1_IRQn;NVICInitStruct.NVIC_IRQChannelPreemptionPriority = 0;NVICInitStruct.NVIC_IRQChannelSubPriority = 0;NVICInitStruct.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVICInitStruct);while(1){}
}//5.中断响应函数void EXTI0_IRQHandler(void){	EXTI_ClearITPendingBit(EXTI_Line0);//清除中断状态GPIO_WriteBit(GPIOC ,GPIO_Pin_13,Bit_RESET);//给ODR写入0,点亮LED}void EXTI1_IRQHandler(void){EXTI_ClearITPendingBit(EXTI_Line1);//清除中断状态GPIO_WriteBit(GPIOC,GPIO_Pin_13,Bit_SET);//熄灭LED}

使用GPIOA5,GPIOA6进行中断,我们为什么要学习这2个引脚的中断喃?因为这2个引脚是共用一个中断,如下图:EXTI5~EXTI9共用一个中断。

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

代码②:

#include "stm32f10x.h"
#include "stm32f10x_pal.h"
#include "OLED.h"int main(void)
{
//	PAL_Init();
//	OLED_Init();//1.PA0,PA1,PC13引脚的初始化RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);GPIO_InitTypeDef GPIOInitStruct;GPIOInitStruct.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6;//按钮GPIOInitStruct.GPIO_Mode = GPIO_Mode_IPU;//配置为上拉输入GPIO_Init(GPIOA ,&GPIOInitStruct);GPIOInitStruct.GPIO_Pin = GPIO_Pin_13;//LEDGPIOInitStruct.GPIO_Speed = GPIO_Speed_2MHz;GPIOInitStruct.GPIO_Mode = GPIO_Mode_Out_OD;//配置为开漏输出GPIO_Init(GPIOC,&GPIOInitStruct);//2.AFIO选择通道RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource5);//选择EXTI0GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource6);//选择EXTI1//3.对EXTI0,EXTI1通道进行配置//3.1.对EXTI0进行配置EXTI_InitTypeDef EXTIInitStruct;EXTIInitStruct.EXTI_Line = EXTI_Line5;EXTIInitStruct.EXTI_Mode = EXTI_Mode_Interrupt;EXTIInitStruct.EXTI_Trigger = EXTI_Trigger_Rising;//上升沿产生中断源EXTIInitStruct.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTIInitStruct);//3.2.对EXTI1进行配置EXTIInitStruct.EXTI_Line = EXTI_Line6;EXTIInitStruct.EXTI_Mode = EXTI_Mode_Interrupt;EXTIInitStruct.EXTI_Trigger = EXTI_Trigger_Rising;//上升沿产生中断源EXTIInitStruct.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTIInitStruct);//4.对NVIC进行配置NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//4.1.对中断源0进行配置NVIC_InitTypeDef NVICInitStruct;NVICInitStruct.NVIC_IRQChannel = EXTI9_5_IRQn;NVICInitStruct.NVIC_IRQChannelPreemptionPriority = 0;NVICInitStruct.NVIC_IRQChannelSubPriority = 0;NVICInitStruct.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVICInitStruct);while(1){}
}//5.中断响应函数void EXTI9_5_IRQHandler(void){	if(EXTI_GetFlagStatus(EXTI_Line5) == SET)//代表EXTI5产生中断源{EXTI_ClearITPendingBit(EXTI_Line5);//清除中断状态GPIO_WriteBit(GPIOC ,GPIO_Pin_13,Bit_RESET);//给ODR写入0,点亮LED}if(EXTI_GetFlagStatus(EXTI_Line6) == SET)//代表EXTI6产生中断源{EXTI_ClearITPendingBit(EXTI_Line6);//清除中断状态GPIO_WriteBit(GPIOC ,GPIO_Pin_13,Bit_SET);//给ODR写入1,熄灭LED}}

http://www.ppmy.cn/devtools/93718.html

相关文章

使用WinCC flexible自带工具对HMI进行镜像备份

西门子WinCC flexible 2008集成SIMATIC ProSave系统镜像备份工具,我们可以使用它对公司现有设备的西门子触摸屏进行完整的备份,当触摸屏损坏或者数据丢失时我们可以使用备份的镜像文件对触摸屏系统进行修复。 以下是备份的步骤 一、一台安装WinCC flexi…

OpenAI 发布 GPT-4o 模型安全评估报告:风险等级为“中等”|TodayAI

OpenAI 近日发布了最新的 GPT-4o 系统卡,这是一份研究文件,详细介绍了公司在推出其最新 AI 模型之前所进行的安全措施和风险评估。根据该评估报告,GPT-4o 的总体风险等级被评定为 “中等” 。 GPT-4o 于今年 5 月首次公开发布。在其发布之前…

HtmlUnit:探索Web自动化的强大工具

文章目录 官网链接原理基础使用1. 添加依赖2. 发送HTTP请求并解析页面 高级使用1. 模拟表单提交2. 处理JavaScript弹窗3. 异步请求处理 优点结论 HtmlUnit 是一个开源的“无头”(headless)浏览器,它模拟了浏览器环境,允许开发者在…

设计模式 由浅入深(待完结)

一、设计模式是什么? 设计模式是指在软件开发中,经过验证的,用于解决在特定环境下,重复出现的,特定问题的解决方案。 二、设计模式有哪些? 1. 观察者模式 定义对象间的一种一对多(变化&#x…

Win/Mac/Linux/Andriod/IOS界面UI设计 - pyside6 - 01 基础系统框架

文章目录 写在前面一、pyside6是什么?1.1 pyside6是什么?1.2 pyside6与PyQt6的关系?怎么选?1.2.1 pyside6与PyQt6的关系1.2.2 选择指南二、创建pyside6的基础系统框架2.1 创建虚拟环境2.1.1 Python兼容性矩阵2.1.2 安装MiniConda2.1.3 使用MiniConda创建虚拟环境2.1.4 激活…

Kibana,Docker Remote Api,Kubernetes Api Server我未授权访问漏洞(附带修复方法)

一.Kibana Kibana是⼀个开源的分析与可视化平台,设计出来⽤于和Elasticsearch⼀起使⽤的。你可以⽤kibana搜索、查看存放在Elasticsearch中的数据。Kibana与Elasticsearch的交互⽅式是以各种不同的图表、表格、地图等直观地展示数据,从⽽达到⾼级的数据分…

移动设备上的交互式AI提示库

摘要: 本文介绍了一种新型的移动应用程序,该程序提供了一个丰富的AI提示库,用于辅助用户与AI语言模型的交互。该应用程序以其用户友好的界面和社区功能,为用户提供了一种新颖的学习和交流平台。 关键词: AI提示库&…

vue中rules自定义规则实现

html代码 定义prop"shifandiqu" <el-col :span"24"><el-form-item label"平台示范地区" style"margin-bottom: 6px;" prop"shifandiqu"><el-select v-model"form.provinceid" filterable placeho…