STM32F1外部中断EXTI

2023-12-06 09:30
文章标签 中断 外部 stm32f1 exti

本文主要是介绍STM32F1外部中断EXTI,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

1.  EXTI简介

2.  EXTI基本结构

3.  AFIO复用IO口

4.  EXTI框图

5.  EXTI程序配置

5.1  首先先配置要使用的GPIO口的引脚

5.2  配置AFIO数据选择器,选择想要中断的引脚

5.3  EXTI配置


1.  EXTI简介

        EXTI(Extern Interrupt)外部中断 EXTI可以监测指定GPIO口的电平信号,当其指定的GPIO口产生电平变化时,EXTI将立即向NVIC发出中断申请,经过NVIC裁决后即可中断CPU主程序,使CPU执行EXTI对应的中断程序。

简单来说:电平变化,触发中断

支持的触发方式:上升沿/下降沿/双边沿/软件触发

·上升沿触发
        数字电平从低电平(数字“0”)变为高电平(数字“1”)的那一瞬间叫作上升沿。 上升沿触发是当信号有上升沿时的开关动作,当电位由低变高而触发输出变化的就叫上升沿触发。也就是当测到的信号电位是从低到高也就是上升时就触发,叫做上升沿触发。

·下降沿触发
        数字电路中,数字电平从高电平(数字“1”)变为低电平(数字“0”)的那一瞬间叫作下降沿。下降沿触发是当信号有下降沿时的开关动作,当电位由高变低而触发输出变化的就叫下降沿触发。也就是当测到的信号电位是从高到低也就是下降时就触发,叫做下降沿触发。

那么我们可以很好的理解两种触发:

上升沿触发 就是当电压从低变高时触发中断
下降沿触发 就是当电压从高变低时触发中断

双边沿触发

        可以看做上升沿和下降沿的结合,也就是二者都可以触发中断。

软件触发

        引脚没变化,程序执行代码触发中断。

支持的GPIO口:所有GPIO口,但相同的Pin不能同时触发中断

        也就是PA0,PB0,PC0等不能同时使用,Pin引脚需要不同,例如PA0和PA1,PA0和PB1等能同时用。

通道数:16个GPIO_Pin(0~15),外加PVD输出、RTC闹钟、USB唤醒、以太网唤醒

触发响应方式:中断响应/事件响应

中断响应:申请中断,CPU执行中断

事件响应:触发外设,信号不会在到CPU,直接触发其他外设,外设间的联合操作

2.  EXTI基本结构

        每个GPIO都有16个引脚,每个引脚都能触发中断,但是会通过AFIO中断引脚选择的模块,在GPIOA,GPIOB,GPIOC......在16个引脚中选择一个Pin连接。

        相当于在PA0,PB0,PC0......选个0,PA1,PB1,PC1......选个1,依次类推

        其中5~9,还有10~15,分别写在一个函数内,使用过程中还要通过标志位,进一步判断到底是哦哪个中断。

3.  AFIO复用IO口

AFIO主要用于引脚复用功能的选择和重定义

在STM32中,AFIO主要完成两个任务:复用功能引脚重映射、中断引脚选择

我们要想对PC13和PC14等引脚进行当做普通GPIO口使用则需要AFIO的参与:

	//时钟使能RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC , ENABLE );RCC_APB2PeriphClockCmd( RCC_APB2Periph_AFIO , ENABLE );PWR_BackupAccessCmd( ENABLE ); //允许修改RTC和后备寄存器RCC_LSEConfig( RCC_LSE_OFF ); //关闭外部低速时钟,PC14+PC15可以用作普通IOBKP_TamperPinCmd(DISABLE);  //关闭入侵检测功能,PC13可以用作普通IOGPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 |GPIO_Pin_14;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;          GPIO_Init(GPIOC, &GPIO_InitStructure);PWR_BackupAccessCmd(DISABLE);/* 禁止修改RTC和后备寄存器*///BKP_ITConfig(DISABLE);       /* 禁止TAMPER 中断*/

4.  EXTI框图

5.  EXTI程序配置

5.1  首先先配置要使用的GPIO口的引脚

        进行RCC时钟配置,这里我使用的事PC13和PC14引脚:

	//时钟使能RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC , ENABLE );RCC_APB2PeriphClockCmd( RCC_APB2Periph_AFIO , ENABLE );PWR_BackupAccessCmd( ENABLE ); //允许修改RTC和后备寄存器RCC_LSEConfig( RCC_LSE_OFF ); //关闭外部低速时钟,PC14+PC15可以用作普通IOBKP_TamperPinCmd(DISABLE);  //关闭入侵检测功能,PC13可以用作普通IOGPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 |GPIO_Pin_14;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;          GPIO_Init(GPIOC, &GPIO_InitStructure);PWR_BackupAccessCmd(DISABLE);/* 禁止修改RTC和后备寄存器*///BKP_ITConfig(DISABLE);       /* 禁止TAMPER 中断*/

下面做个了解

用来复位AFIO外设,调用这个函数,AFIO的外设配置就会全部清除:

void GPIO_AFIODeInit(void);

锁定GPIO配置,调用函数,参数指定某一个引脚,该引脚参数就会被锁定,防止以外更改:

void GPIO_PinLockConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

用来配置AFIO的时间输出功能:

void GPIO_EventOutputConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);
void GPIO_EventOutputCmd(FunctionalState NewState);

引脚重映射:

void GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalState NewState);

配置AFIO数据选择器,选择想要中断的引脚:

void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);

以太网外设有关,暂时用不到:

void GPIO_ETH_MediaInterfaceConfig(uint32_t GPIO_ETH_MediaInterface);

5.2  配置AFIO数据选择器,选择想要中断的引脚

	GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource13);	GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource14);	

拓展:

清除配置的EXTI:

void EXTI_DeInit(void);

把参数传递的结构体变量赋一个默认值:

void EXTI_StructInit(EXTI_InitTypeDef* EXTI_InitStruct);

软件触发外部中断:

void EXTI_GenerateSWInterrupt(uint32_t EXTI_Line);

主程序:获取指定函数是否置“1”:

FlagStatus EXTI_GetFlagStatus(uint32_t EXTI_Line);

对置“1”的标志位进行清除:

void EXTI_ClearFlag(uint32_t EXTI_Line);

中断函数内进行置“1”和清除:

ITStatus EXTI_GetITStatus(uint32_t EXTI_Line);
void EXTI_ClearITPendingBit(uint32_t EXTI_Line);

5.3  EXTI配置

	EXTI_InitTypeDef EXTI_InitStructure;EXTI_InitStructure.EXTI_Line = EXTI_Line13 | EXTI_Line14;//指定需要配置的中断线EXTI_InitStructure.EXTI_LineCmd = ENABLE;//指定选择的中断线的新状态,开启中断EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//指定外部中断线的模式,中断模式EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;//下降沿触发,指定触发信号的有效边沿,Rising上升沿出发EXTI_Init(&EXTI_InitStructure);

学习笔记,仅供参考。

这篇关于STM32F1外部中断EXTI的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/461338

相关文章

第10章 中断和动态时钟显示

第10章 中断和动态时钟显示 从本章开始,按照书籍的划分,第10章开始就进入保护模式(Protected Mode)部分了,感觉从这里开始难度突然就增加了。 书中介绍了为什么有中断(Interrupt)的设计,中断的几种方式:外部硬件中断、内部中断和软中断。通过中断做了一个会走的时钟和屏幕上输入字符的程序。 我自己理解中断的一些作用: 为了更好的利用处理器的性能。协同快速和慢速设备一起工作

FreeRTOS学习笔记(四)Freertos的中断管理及临界保护

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、Cortex-M 中断管理1.1 中断优先级分组1.2 相关寄存器1.3 相关宏定义1.4 FreeRTOS 开关中断 二、临界段及其保护2.1 taskENTER_CRITICAL( ) 和 taskEXIT_CRITICAL( )2.2 taskENTER_CRITICAL_FROM_ISR( )

C8T6超绝模块--EXTI

C8T6超绝模块–EXTI 大纲 控制流程结构体分析EXTI实现按键 具体案例 控制流程 这里是流程框图,具体可以去看我STM32专栏的EXTI的具体分析 结构体分析 typedef struct {uint32_t EXTI_Line; // 中断/事件线EXTIMode_TypeDef EXTI_Mode; // EXTI 模式EXTITrigger_TypeDef EXTI_

Cortex-A7:ARM官方推荐的嵌套中断实现机制

0 参考资料 ARM Cortex-A(armV7)编程手册V4.0.pdf ARM体系结构与编程第2版 1 前言 Cortex-M系列内核MCU中断硬件原生支持嵌套中断,开发者不需要为了实现嵌套中断而进行额外的工作。但在Cortex-A7中,硬件原生是不支持嵌套中断的,这从Cortex-A7中断向量表中仅为外部中断设置了一个中断向量可以看出。本文介绍ARM官方推荐使用的嵌套中断实现机

【AI大模型应用开发】2.1 Function Calling连接外部世界 - 入门与实战(1)

Function Calling是大模型连接外部世界的通道,目前出现的插件(Plugins )、OpenAI的Actions、各个大模型平台中出现的tools工具集,其实都是Function Calling的范畴。时下大火的OpenAI的GPTs,原理就是使用了Function Calling,例如联网检索、code interpreter。 本文带大家了解下Function calling,看

外部中断的边缘触发和电平触发

MCS-51单片机中的边缘触发是指当输入引脚电平由高到低发生跳变时,才引起中断。而电平触发是指只要外部引脚为低电平就引起中断。         在电平触发方式下,当外部引脚的低电平在中断服务返回前没有被拉高时(即撤除中断请求状态),会引起反复的不需要的中断,造成程序执行的错误。这类中断方式下,需要在中断服务程序中设置指令,清除外部中断的低电平状态,使之变为高电平。

【Java编程思想】线程的基本协作机制 与 线程的中断

wait/notify Java在Object类中定义了一些线程协作的基本方法,wait和notify public final void wait() throws InterruptedException;public final native void wait(long timeout) throws InterruptedException; 一个带时间参数,单位是毫秒,表示最

基于IMX6ULL的Cortex-A中断原理讲解,以及编写其中断向量表

首先借助STM32我们需要了解中断系统是如何构成的         会有一个中断源,也就是能够向CPU发出中断请求的设备或事件。中断源不分硬件和软件,也就是产生中断信号,就会执行中断服务函数         但是CPU是如何知道中断源产生后就找到对应的中断服务函数呢,这个时候就要引入中断向量表,它的主要功能是描述中断对应的中断服务函数,每个中断源都有一个唯一的中断号(也称向量号),

【银河麒麟高级服务器操作系统实例】虚拟化平台系统服务中断现象分析及处理建议

服务器环境以及配置 【机型】虚机 处理器: Kunpeng-920 内存: 40G 【内核版本】 4.19.90-23.8.v2101.ky10.aarch64 【OS镜像版本】 银河麒麟操作系统 Kylin-Server-10-SP1-Release-Build20-20210518-arm64 【第三方软件】 智能运维系统、mysql数据集群 现象描述 环境描

从应用内跳转至外部浏览器 - 鸿蒙 HarmonyOS Next

从应用内跳转至外部浏览器,基于 Want 来实现,同时也可以通过其方式尝试跳转至其它系统模块,具体可参考如下 code : 方法调用 // 调用pushOutsideWeb(controller, url) 方法实现 import { common, contextConstant, Want } from '@kit.AbilityKit';import { HintMessage