STM32外部中断配置例程

合集下载

STM32外部输入中断配置流程图

STM32外部输入中断配置流程图

外部输入中断配置步骤 输入IO 初始化 ●设置外部中断输入的IO 口状态
开启AFIO 时钟 ●开启IO 口复用时钟
中断服务子程序 ●编写中断服务函数
配置NVIC ●配置中断分组(NVIC ),优先级,并使能中断。

配置EXTI 各寄存器 ●触发方式、中断开关等
IO 与EXTI 线连接 ●配置外部中断配置寄存器AFIO_EXTICR
可以设置为上拉/下拉输入,浮空输入;推荐设置上拉/
下拉输入。

STM32的IO 口与中断线的对应关系需要配置外部中断配置寄存器EXTICR
中断屏蔽寄存器(EXTI_IMR) 事件屏蔽寄存器(EXTI_EMR)
上升沿触发选择寄存器(EXTI_RTSR) 下降沿触发选择寄存器(EXTI_FTSR) 软件中断事件寄存器(EXTI_SWIER) 挂起寄存器(EXTI_PR) 寄存器SCB->AIRCR :设置中断分组
寄存器组IPR[15]:设置主优先级,从优先级。

stm32外部中断回传参数

stm32外部中断回传参数

stm32外部中断回传参数摘要:1.STM32外部中断基本概念2.STM32外部中断配置方法3.外部中断触发方式及应用场景4.实例:STM32外部中断回传参数正文:一、STM32外部中断基本概念STM32外部中断,又称IO中断或事件控制器(EXTI),是STM32微控制器提供的一种中断机制。

它允许外部信号(如GPIO引脚状态变化)触发中断请求,进而实现程序的跳转和执行。

STM32外部中断具有较高的灵活性和可靠性,广泛应用于各种智能硬件和嵌入式系统中。

二、STM32外部中断配置方法1.选择合适的外部中断线:STM32外部中断共支持19个边沿检测器,可根据实际需求选择相应的外部中断线。

2.配置触发事件:每个外部中断线都可以独立地配置其触发事件,包括上升沿、下降沿或双边沿。

3.屏蔽中断请求:可通过挂起寄存器单独地屏蔽或启用外部中断请求。

4.配置中断优先级:根据需要调整中断优先级,确保关键任务能够及时响应。

三、外部中断触发方式及应用场景1.上升沿触发:当GPIO引脚电平从低电平变为高电平时,触发中断。

2.下降沿触发:当GPIO引脚电平从高电平变为低电平时,触发中断。

3.双边沿触发:当GPIO引脚电平发生上升或下降沿时,均触发中断。

4.应用场景:外部中断广泛应用于传感器数据采集、通信接收、按键触发等领域。

四、实例:STM32外部中断回传参数以下是一个简单的STM32外部中断回传参数的实例:1.配置GPIO引脚为输入模式,并连接到外部中断线。

2.配置外部中断触发方式(如上升沿触发)。

3.编写中断处理函数,并在其中读取GPIO引脚状态。

4.在主循环中,检查外部中断触发次数,并根据需要执行相应操作。

5.为了确保实时性,可以使用中断优先级和嵌套中断机制。

通过以上步骤,您可以充分利用STM32外部中断实现各种智能控制和监测功能。

奋斗STM32V3版按键中断_EXTI_例程

奋斗STM32V3版按键中断_EXTI_例程
奋斗版 STM32 开发板例程详解———按键中断实验

按键中断(EXTI)例程实验
实验平台:奋斗版STM32开发板V2、V2.1、V3 实验内容:板子加电后,按动板子上K1-K3按键,可控制对应的LED1-LED3的亮 灭,该实验学习了外部中断(EXTI)程序的编制及控制流程。
4.2 硬件电路设计
在开发板上V6、V7、V8分别与MCU的PB5、PD6、PD3相连,如下图所示
淘宝店铺:
11
奋斗版 STM32 开发板例程详解———按键中断实验

键盘部分如下图所示: 例程所用到的列扫描线:PC5,PC2,PC3。 例程所用到的行扫描线(EXTI中断线):PE2。
上升沿触发选择寄存器(EXTI_RTSR) 偏移地址:08H 复位值:0000 0000h
注意: 外部唤醒线是边沿触发的,这些线上不能出现毛刺信号。 在写EXTI_RTSR 寄存器时在外部中断线上的上升沿信号不能被识别,挂起位不会被置 位。在同一中断线上,可以同时设置上升沿和下降沿触发。即任一边沿都可触发中断。
1.2 外部中断配置寄存器2(AFIO_EXTICR2)
地址偏移:0Ch 复位值:0000h
淘宝店铺:
1
奋斗版 STM32 开发板例程详解———按键中断实验

1.3 外部中断配置寄存器3(AFIO_EXTICR3)
地址偏移:10h 复位值:0000h
1.4 外部中断配置寄存器4(AFIO_EXTICR4)
地址偏移:14h 复位值:0000h
淘宝店铺:
2
奋斗版 STM32 开发板例程详解———按键中断实验

2.1 嵌套向量中断控制器(NVIC)
淘宝店铺:
7

stm32adc中断函数例程

stm32adc中断函数例程

stm32adc中断函数例程STM32是意法半导体(STMicroelectronics)推出的一系列32位微控制器系列。

STM32微控制器提供了丰富的外设支持,其中之一是ADC(模数转换器)。

ADC是一种将模拟信号转换为数字信号的设备。

在嵌入式系统中,ADC通常用来将传感器检测到的模拟信号转换为数字信号,以便处理和分析。

在STM32中,ADC外设具有完善的功能和配置选项。

为了实现ADC 的连续转换,并能够在转换完成时触发一个中断,我们需要配置ADC 中的一些寄存器,并编写相应的中断处理函数。

以下是一个在STM32中使用ADC中断的例程。

首先,我们需要确保已正确配置ADC外设和相应的GPIO引脚,以使其能够读取模拟信号。

这些配置通常在启动文件中完成,此处不再赘述。

接下来,我们需要定义一些全局变量和函数,用于处理ADC中断事件。

假设我们要使用ADC1外设,我们将设置全局变量以保存ADC转换结果,并在中断处理函数中更新该变量。

```cuint16_t adcValue;void ADC_IRQHandler(void){if(ADC1->SR & ADC_SR_EOC){adcValue = ADC1->DR;}}```在上述代码中,我们定义了一个名为`adcValue`的全局变量,用于存储ADC转换结果。

`ADC_IRQHandler`是我们编写的中断处理函数,我们将在接下来的步骤中将其配置为与ADC1外设的中断线相连。

我们还要在代码的某处初始化ADC,并配置相关的中断使能。

以下是一个示例:```cvoid ADC_Init(void){RCC->APB2ENR |= RCC_APB2ENR_ADC1EN; //启用ADC1时钟ADC1->CR2 |= ADC_CR2_CONT; //连续转换模式ADC1->CR2 |= ADC_CR2_DMA; //使用DMA传输ADC1->CR2 |= ADC_CR2_ADON; //启动ADCADC1->SMPR1 |= ADC_SMPR1_SMP16; //设置采样时间ADC1->SQR3 |= 16; //设置转换通道ADC1->CR1 |= ADC_CR1_EOCIE; //使能转换完成中断NVIC_EnableIRQ(ADC_IRQn); //使能对应中断向量的中断}void ADC_Start(void){ADC1->CR2 |= ADC_CR2_SWSTART; //启动转换}```在上述代码中,我们首先使能了ADC1的时钟,并配置了一些转换参数。

stm32 外部中断计算脉冲占空比

stm32 外部中断计算脉冲占空比

stm32 外部中断计算脉冲占空比
在STM32微控制器中,我们可以使用外部中断来计算脉冲的占空比。

脉冲的占空比是指脉冲高电平与总脉冲周期的比例。

首先,我们需要配置外部中断的引脚作为输入信号。

我们可以使
用GPIO口的中断功能,通过配置寄存器来使引脚能够触发外部中断。

例如,我们可以使用EXTI寄存器来配置外部中断,具体步骤如下:
1. 配置引脚为输入模式,并使能输入缓冲区。

2. 配置EXTI寄存器的模式和触发方式。

我们可以选择边沿触发方式,例如上升沿触发或下降沿触发。

3. 配置NVIC寄存器使能对应的外部中断通道。

4. 编写中断服务函数,当外部中断被触发时,该函数会被执行。

5. 在中断服务函数中,我们可以通过计算两个连续的外部中断触发时
间来计算脉冲的占空比。

我们可以使用定时器计数器的值来获取时间
信息。

在中断服务函数中,我们可以使用定时器的计数器来获取当前时
间和上次触发时间。

通过计算这两个时间之间的差值,我们可以得到
脉冲的周期。

然后,我们可以计算脉冲的高电平时间,即脉冲的占空比。

具体的计算方法取决于定时器的配置。

总之,通过配置外部中断和定时器,我们可以计算脉冲的占空比。

这使得我们可以实现各种应用,例如测量脉冲周期、频率等。

请注意,以上只是一个简单的示例,实际的实现可能需要根据具
体的要求进行修改和扩展。

stm32外部中断实验报告-STM32实例外部中断实验

stm32外部中断实验报告-STM32实例外部中断实验

stm32外部中断实验报告_STM32实例外部中断实验上⼀篇⽂章我们介绍了 STM32F10x 的中断,这次我们就来学习下外部中断。

本⽂中要实现的功能与按键实验⼀样,即通过按键控制LED,只不过这⾥采⽤外部中断⽅式进⾏控制。

学习时可以参考《STM32F10x 中⽂参考⼿册》-9 中断和事件章节。

外部中断介绍EXTI 简介STM32F10x 外部中断/事件控制器(EXTI)包含多达 20 个⽤于产⽣事件/中断请求的边沿检测器。

EXTI 的每根输⼊线都可单独进⾏配置,以选择类型(中断或事件)和相应的触发事件(上升沿触发、下降沿触发或边沿触发),还可独⽴地被屏蔽。

EXTI 结构框图EXTI 框图包含了 EXTI 最核⼼内容,掌握了此框图,对 EXTI 就有⼀个全局的把握,在编程的时候思路就⾮常清晰。

从图中可以看到,有很多信号线上都有标号 9 样的“20”字样,这个表⽰在控制器内部类似的信号线路有 20 个,这与 STM32F10x 的 EXTI 总共有20 个中断/事件线是吻合的。

因此我们只需要理解其中⼀个的原理,其他的 19个线路原理都是⼀样的。

EXTI 分为两⼤部分功能,⼀个产⽣中断,另⼀个产⽣事件,这两个功能从硬件上就有所差别,这个在框图中也有体现。

从图中标号 3 的位置处就分出了两条线路,⼀条是 3-4-5 ⽤于产⽣中断,另⼀条是 3-6-7-8⽤于产⽣事件。

下⾯我们就来介绍下这两条线路:(1)⾸先看下产⽣中断的这条线路(1-2-3-4-5)1.标号 1 为输⼊线,EXTI 控制器有 20 个中断/事件输⼊线,这些输⼊线可以通过寄存器设置为任意⼀个 GPIO,也可以是⼀些外设的事件,这部分内容我们会在后⾯专门讲解。

输⼊线⼀般是存在电平变化的信号。

2.边沿检测电路,EXTI 可以对触发⽅式进⾏选择,通过上升沿触发选择寄存器和下降沿触发选择寄存器对应位的设置来控制信号触发。

边沿检测电路以输⼊线作为信号输⼊端,如果检测到有边沿跳变就输出有效信号 1 给红⾊框 3 电路,否则输出⽆效信号 0。

使用HAL库开发STM32GPIO口基础使用与外部中断

使用HAL库开发STM32GPIO口基础使用与外部中断

使用HAL库开发STM32GPIO口基础使用与外部中断GPIO(General Purpose Input/Output)是STM32系列微控制器上常见的功能模块之一,它用于与外部设备进行数据交互。

本文主要介绍如何使用HAL库来配置和使用STM32的GPIO口,并实现外部中断功能。

在使用GPIO口之前,我们首先需要了解STM32芯片上的GPIO引脚的命名方式。

以STM32F103C8T6为例,它具有32个GPIO引脚,从PA0到PA15和PB0到PB15、其中,GPIO口的命名方式为"A"加上引脚的编号。

例如,PA0表示GPIOA的第0个引脚,PB10表示GPIOB的第10个引脚。

1.引入头文件和宏定义首先,在代码文件的顶部引入"stm32f1xx_hal.h"头文件。

然后,在需要使用GPIO功能的地方,定义一个GPIO_InitTypeDef结构体变量,并通过它来配置GPIO的参数。

2.配置GPIO模式和速度在设置GPIO口之前,需要配置GPIO的模式和速度。

通过设置GPIO_InitStruct结构体变量的对应成员变量来实现。

例如,要将PA5配置为推挽输出模式,可以使用如下语句:```GPIO_InitStruct.Pin = GPIO_PIN_5;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);```这里,GPIO_PIN_5表示PA5引脚,GPIO_MODE_OUTPUT_PP表示推挽输出模式,GPIO_SPEED_FREQ_HIGH表示高速模式。

3.配置GPIO引脚在配置好GPIO模式和速度后,可以通过HAL_GPIO_Init函数来配置GPIO引脚,并进行初始化。

学习笔记:STM32外部中断

学习笔记:STM32外部中断

学习笔记:STM32的外部中断(库函数)在为某引脚配置中断前,同样要先初始化该引脚的配置,用GPIO_Init()函数初始化,不同的是,由于是外部中断,所以输入模式要设置上拉输入。

假设外部中断引脚为PE.2,则该引脚初始化配置的程序为:IOIO口作为外部中断输入是复用功能,因此在此基础上还需要对另一个时钟信号进行初始化。

这是IO口作为复用功能时需要进行初始化的时钟,另外,要注意的是,做一般功能使用的IO口只需要调用第一个函数即可,而作为复用功能的IO口,两个函数都要调用,两者缺一不可,否则不能正常使用。

STM32的每个IO都可以作为外部中断的中断输入口,这点也是STM32的强大之处。

STM32F103的中断控制器支持19个外部中断/事件请求。

每个中断设有状态位,每个中断/事件都有独立的触发和屏蔽设置。

STM32F103的19个外部中断为:线0~15:对应外部IO口的输入中断。

线16:连接到PVD输出。

线17:连接到RTC闹钟事件。

线18:连接到USB唤醒事件。

从上面可以看出,STM32供IO口使用的中断线只有16个,但是STM32的IO口却远远不止16个,那么STM32是怎么把16个中断线和IO口一一对应起来的呢?于是STM32就这样设计,GPIO的管脚GPIOx.0~GPIOx.15(x=A,B,C,D,E,F,G)分别对应中断线0~15。

这样每个中断线对应了最多7个IO口,以线0为例:它对应了GPIOA.0、GPIOB.0、GPIOC.0、GPIOD.0、GPIOE.0、GPIOF.0、GPIOG.0。

而中断线每次只能连接到1个IO口上,这样就需要通过配置来决定对应的中断线配置到哪个GPIO上了。

下面我们看看GPIO跟中断线的映射关系图:在库函数中,配置GPIO与中断线的映射关系是通过函数GPIO_EXTILineConfig()来实现的:void GPIO_EXTILineConfig(uint8_t GPIO_PortSource,uint8_t GPIO_PinSource)该函数将端口与中断线映射起来,使用示例是:GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource2);将中断线2与GPIOE映射起来,那么很显然是GPIOE.2与EXTI2中断线连接了。

野火F1开发板STM32案例-外部中断(按键)使用

野火F1开发板STM32案例-外部中断(按键)使用

野⽕F1开发板STM32案例-外部中断(按键)使⽤野⽕F1开发板STM32案例-外部中断(按键)使⽤硬件平台野⽕STM32F103ZET6 霸道V2开发板正点原⼦F1系列开发板软件平台Keil MDK 5.31串⼝调试助⼿Gitee .中断相关概念中断配置寄存器# 配置中断时,使⽤ISER、 ICER 和 IP 寄存器,## ISER 是中断使能寄存器## ICER 是中断清除寄存器## IP 是中断优先级寄存器中断优先级1. 数值越⼩,优先级越⾼2. STM32F103 中只使⽤4位,⾼4位有效。

3. ⽤于表达优先级的⾼ 4 位⼜被分组成抢占式优先级和响应优先级,称为“亚优先级”或“副优先级”4. 每个中断源都需要被指定这两种优先级。

中断配置步骤1.使能外设中断6. 设置中断优先级分组初始化 NVIC_InitTypeDef 结构体,设置抢占优先级和响应优先级,使能中断请求。

typedef struct{uint8_t NVIC_IRQChannel; //中断源uint8_t NVIC_IRQChannelPreemptionPriority; //抢占优先级uint8_t NVIC_IRQChannelSubPriority; //响应优先级FunctionalState NVIC_IRQChannelCmd; //中断使能或失能} NVIC_InitTypeDef;NVIC_IRQChannel 中断源:中断源的设置,不同的外设中断,中断源不⼀样NVIC_IRQChannelPreemptionPriority //抢占优先级NVIC_IRQChannelSubPriority //响应优先级NVIC_IRQChannelCmd //中断使能或失能:使能配置为 ENABLE,失能配置为 DISABLE。

NVIC_IRQChannel //中断源/****** Cortex-M3 Processor Exceptions Numbers ***************************************************/NonMaskableInt_IRQn = -14, /*!< 2 Non Maskable Interrupt */MemoryManagement_IRQn = -12, /*!< 4 Cortex-M3 Memory Management Interrupt */BusFault_IRQn = -11, /*!< 5 Cortex-M3 Bus Fault Interrupt */UsageFault_IRQn = -10, /*!< 6 Cortex-M3 Usage Fault Interrupt */SVCall_IRQn = -5, /*!< 11 Cortex-M3 SV Call Interrupt */DebugMonitor_IRQn = -4, /*!< 12 Cortex-M3 Debug Monitor Interrupt */PendSV_IRQn = -2, /*!< 14 Cortex-M3 Pend SV Interrupt */SysTick_IRQn = -1, /*!< 15 Cortex-M3 System Tick Interrupt *//****** STM32 specific Interrupt Numbers *********************************************************/WWDG_IRQn = 0, /*!< Window WatchDog Interrupt */PVD_IRQn = 1, /*!< PVD through EXTI Line detection Interrupt */TAMPER_IRQn = 2, /*!< Tamper Interrupt */RTC_IRQn = 3, /*!< RTC global Interrupt */FLASH_IRQn = 4, /*!< FLASH global Interrupt */RCC_IRQn = 5, /*!< RCC global Interrupt */EXTI0_IRQn = 6, /*!< EXTI Line0 Interrupt */EXTI1_IRQn = 7, /*!< EXTI Line1 Interrupt */EXTI2_IRQn = 8, /*!< EXTI Line2 Interrupt */EXTI3_IRQn = 9, /*!< EXTI Line3 Interrupt */EXTI4_IRQn = 10, /*!< EXTI Line4 Interrupt */DMA1_Channel1_IRQn = 11, /*!< DMA1 Channel 1 global Interrupt */DMA1_Channel2_IRQn = 12, /*!< DMA1 Channel 2 global Interrupt */DMA1_Channel3_IRQn = 13, /*!< DMA1 Channel 3 global Interrupt */DMA1_Channel4_IRQn = 14, /*!< DMA1 Channel 4 global Interrupt */DMA1_Channel5_IRQn = 15, /*!< DMA1 Channel 5 global Interrupt */DMA1_Channel6_IRQn = 16, /*!< DMA1 Channel 6 global Interrupt */DMA1_Channel7_IRQn = 17, /*!< DMA1 Channel 7 global Interrupt */STM32F103 中断向量表EXTI外部中断1. STM32F10x 外部中断/事件控制器(EXTI)包含多达 20 个⽤于产⽣事件/中断请求的边沿检测器。

STM32外部中断处理流程

STM32外部中断处理流程

STM32外部中断处理流程外部中断是指引发中断的事件来自于MCU外部的输入引脚或外设,需要通过配置寄存器和中断服务程序来处理外部中断。

在STM32系列MCU中,外部中断处理可分为以下几个步骤。

1.配置中断引脚要使用外部中断功能,首先需要配置中断引脚。

对于STM32,外部中断引脚由GPIO口提供,需要通过GPIO配置寄存器设置相关引脚的工作模式、上下拉和中断触发方式等。

具体配置方法可以参考芯片手册。

2.配置中断控制器外部中断的中断源需要连接到中断控制器(NVIC),通过配置NVIC的相关寄存器来使能外部中断。

NVIC是位于ARM Cortex-M内核内部的外设,用于管理和分配中断优先级。

3.编写中断服务程序(ISR)中断服务程序(Interrupt Service Routine, ISR)是用于处理中断事件的函数,当外部中断引发时,MCU会跳转到相应的ISR进行处理。

在编写ISR时,需要注意以下几点:-确定中断源:可以通过读取中断状态寄存器来判断是哪个外部中断引起的中断。

-处理中断事件:根据中断源的不同,进行相应的处理。

例如,可以读取输入引脚状态、处理外设状态等。

-清除中断标志位:要在ISR内部清除中断标志位,以允许MCU再次响应该外部中断。

具体方法是通过读取相应的寄存器或调用相关函数清除中断标志位。

4.配置中断优先级中断优先级用于确定ISR的响应顺序,优先级较高的中断先被处理。

在STM32中,中断优先级可以通过配置中断控制器的相关寄存器进行设置。

5.启用中断在完成上述步骤后,需要启用相应的中断引脚和中断控制器。

具体方法是通过设置GPIO寄存器来使能中断引脚,并通过设置NVIC寄存器来使能相关中断。

6.处理中断请求一旦发生外部中断事件,MCU就会跳转到相应的ISR进行中断处理。

在ISR中,可以根据需要调用其他的函数或执行其他的操作。

处理完成后,可以通过清除中断标志位和退出中断函数来结束中断处理。

stm32外部中断的使用(含实例)

stm32外部中断的使用(含实例)

stm32外部中断的使⽤(含实例)中断对于开发嵌⼊式系统来讲的地位绝对是⽏庸置疑的,在C51单⽚机时代,⼀共只有5个中断,其中2个外部中断,2个定时/计数器中断和⼀个串⼝中断,但是在STM32中,中断数量⼤⼤增加,⽽且中断的设置也更加复杂。

今天就将来探讨⼀下关于STM32中的中断系统。

1 基本概念ARM Coetex-M3内核共⽀持256个中断,其中16个内部中断,240个外部中断和可编程的256级中断优先级的设置。

STM32⽬前⽀持的中断共84个(16个内部+68个外部),还有16级可编程的中断优先级的设置,仅使⽤中断优先级设置8bit中的⾼4位。

STM32可⽀持68个中断通道,已经固定分配给相应的外部设备,每个中断通道都具备⾃⼰的中断优先级控制字节PRI_n(8位,但是STM32中只使⽤4位,⾼4位有效),每4个通道的8位中断优先级控制字构成⼀个32位的优先级寄存器。

68个通道的优先级控制字⾄少构成17个32位的优先级寄存器。

4bit的中断优先级可以分成2组,从⾼位看,前⾯定义的是抢占式优先级,后⾯是响应优先级。

按照这种分组,4bit⼀共可以分成5组第0组:所有4bit⽤于指定响应优先级;第1组:最⾼1位⽤于指定抢占式优先级,后⾯3位⽤于指定响应优先级;第2组:最⾼2位⽤于指定抢占式优先级,后⾯2位⽤于指定响应优先级;第3组:最⾼3位⽤于指定抢占式优先级,后⾯1位⽤于指定响应优先级;第4组:所有4位⽤于指定抢占式优先级。

所谓抢占式优先级和响应优先级,他们之间的关系是:具有⾼抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应,即中断嵌套。

当两个中断源的抢占式优先级相同时,这两个中断将没有嵌套关系,当⼀个中断到来后,如果正在处理另⼀个中断,这个后到来的中断就要等到前⼀个中断处理完之后才能被处理。

如果这两个中断同时到达,则中断控制器根据他们的响应优先级⾼低来决定先处理哪⼀个;如果他们的抢占式优先级和响应优先级都相等,则根据他们在中断表中的排位顺序决定先处理哪⼀个。

STM32外部中断以及中断优先级

STM32外部中断以及中断优先级

外部中断(zhōngduàn)的初始化过程:1.初始化IO为输入(shūrù)(可以设置上拉,下拉,浮空)2.开启(kāiqǐ)IO复用(fù yònɡ)时钟3.开启(kāiqǐ)与该IO相对的线上(详解下)4.配置NVIC,使能中断5.编写中断服务函数外部中断:Stm32中总共有19个外部中断包括:线0-15:IO输入中断(每条线上最多有7个IO,如GPIOA~GPIOG,但是每一条线每次只允许同时连接到一个IO)线16:PVD线17:RTC线18:USB关于(guānyú)优先级:CM3中内核(nèi hé)支持256个中断(zhōngduàn)(16个内核(nèi hé)+240外部(wàibù))和可编程256级中断优先级的设置Stm32目前(mùqián)支持84个中断(zhōngduàn)(16个内核(nèi hé)+68个外部(wàibù),注:不是(bù shi)指68个外部中断),16级可编程优先级(优先级设置寄存器中使用了4位)注意:其中(qízhōng)外部中断5-9和中断(zhōngduàn)10-15向量存放(cúnfàng)在一起优先级:数值(shùzí)低的优先级要高于数值高的!!!!!!上电复位后,系统默认(mòrèn)使用的是组0;一个系统只能使用一组优先级组,不可使用多个,优先级的设置不能超过组的范围,否则会产生不可预计的错误1.高抢先级的中断可以打断低优先级的中断响应,构成中断嵌套2.相同抢先级的中断不可以构成嵌套,系统会优先响应子优先级高的3.当2(n)个相同抢先优先级和相同子优先级的中断(zhōngduàn)出现,STM32首先响应中断通道所对应的中断向量地址(dìzhǐ)低的那个中断4.0号抢先优先级的中断,可以(kěyǐ)打断任何中断抢先优先级为非0号的中断(zhōngduàn);1号抢先优先级的中断(zhōngduàn),可以打断任何中断抢先优先级为2、3、4号的中断;……;构成中断嵌套。

stm32f103 (标准库)部分例程

stm32f103 (标准库)部分例程

stm32f103(标准库)部分例程一、概述stm32f103是一款高性能的32位ARMCortex-M3微控制器,广泛应用于各种嵌入式系统。

本部分例程将介绍如何在STM32标准库中进行一些常见操作,如初始化、中断处理、串口通信等。

二、初始化1.系统时钟设置:通过STM32标准库提供的函数,可以快速设置系统时钟,包括HSI、HSE、PLL等。

2.外设初始化:根据需要,对GPIO、USART、SPI等外设进行初始化。

三、中断处理1.外部中断:通过配置中断优先级和中断向量,实现对外部中断的处理。

2.定时器中断:使用定时器中断,可以实现定时功能,如定时计数、定时延时等。

四、串口通信1.串口初始化:配置串口参数,如波特率、数据位、校验位等。

2.串口发送和接收:通过使用STM32标准库提供的函数,可以实现串口的发送和接收操作。

以下是一个简单的示例程序,用于演示如何使用STM32标准库进行串口通信:```c#include"stm32f10x.h"#include"stm32f10x_gpio.h"#include"stm32f10x_rcc.h"#include"stm32f10x_usart.h"voidUSART1_Init(void){//初始化USART1外设RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);USART_InitTypeDefUSART_InitStruct={0};USART_ART_BaudRate=9600;//设置波特率为9600USART_ART_WordLength=USART_WordLength_8b;//数据位为8位USART_ART_StopBits=USART_StopBits_1;//停止位为1个USART_ART_Parity=USART_Parity_No;//无校验位USART_ART_HardwareFlowControl=USART_HardwareFlowContro l_None;//不使用硬件流控制USART_ART_Mode=USART_Mode_Rx|USART_Mode_Tx;//设置为接收和发送模式USART_Init(USART1,&USART_InitStruct);//初始化USART1外设}voidUSART1_SendData(uint8_tdata){//发送数据到USART1外设USART_SendData(USART1,data);}intmain(void){//初始化GPIO和RCC外设,设置USART1外设时钟等...USART1_Init();while(1){//从USART1接收数据...uint8_treceivedData=USART_ReceiveData(USART1);//接收数据并存储到receivedData变量中...//处理接收到的数据...//发送数据到USART1...USART1_SendData(receivedData);//将处理后的数据发送回USART1外设...}}```以上是一个简单的串口通信示例程序,可以通过STM32标准库提供的函数来实现串口的发送和接收操作。

STM32中断的详细介绍及使用流程

STM32中断的详细介绍及使用流程

STM32中断的详细介绍及使用流程STM32是一款常用的32位微控制器系列,由STMicroelectronics (ST)研发,广泛应用于各种嵌入式系统中。

中断是STM32中非常重要的特性之一,本文将详细介绍中断的概念、分类、优点以及使用流程。

一、中断的概念中断是一种机制,允许外部硬件设备打断正常的程序运行,并立即执行一个称为中断服务例程(ISR)的特定函数。

中断通常由外部硬件引发,例如定时器溢出、外部触发事件等。

一旦中断发生,控制器将暂停当前正在执行的任务,转而执行ISR,当ISR执行完毕后,控制权将返回到原来的任务。

二、中断的分类1.外部中断:STM32的GPIO引脚可以配置为外部中断触发。

当配置为外部中断模式时,如果引脚上的输入信号满足特定条件(上升沿、下降沿等),将会触发一个外部中断,并执行ISR。

2.内部中断:STM32具有许多内置的模块,例如定时器、UART等,这些模块常常产生中断信号。

例如,定时器溢出中断可以用于周期性任务的处理。

三、中断的优点1.实时性:中断能够立即响应外部事件,极大提高了系统的实时性。

2.节约CPU资源:中断是一种事件驱动的方式,只有在需要处理的时候才会触发中断,节约了CPU资源。

3.模块化设计:通过使用中断,可以将复杂的任务分解为更小的块,实现模块化的设计。

四、中断的使用流程使用中断的流程通常包括以下几个步骤:1.初始化中断:配置相关的中断源和中断服务例程。

在STM32中,中断使用时需要开启并配置相关的寄存器。

2.注册中断服务例程:编写中断服务例程的函数,这是中断发生时将要执行的函数。

在STM32中,可以使用标准库提供的函数来注册中断服务例程。

3.启用中断:开启中断并配置相应的优先级,以确定中断发生时的处理顺序。

在STM32中,可以设置中断控制器的中断使能位和优先级。

下面以STM32CubeIDE为例,展示一个外部中断的使用流程:1. 打开STM32CubeIDE,创建一个新的工程,并选择相应的芯片型号。

STM32CubeMX实战教程(三)——外部中断(中断及HAL_Delay函数避坑)

STM32CubeMX实战教程(三)——外部中断(中断及HAL_Delay函数避坑)

STM32CubeMX实战教程(三)——外部中断(中断及HAL_Delay函数避坑)在STM32CubeMX实战教程中,我们已经学习了如何使用GPIO来控制LED的亮灭。

在这篇文章中,我们将进一步学习如何使用外部中断来实现更复杂的功能。

外部中断可以使我们的微控制器能够在输入发生变化时立即做出响应。

这对于需要实时性的应用非常重要,比如按钮的按下或松开的检测。

外部中断类似于计数器,不断地检测输入引脚的变化,并在变化时触发中断。

在STM32CubeMX中配置外部中断非常简单。

我们只需要选择外部输入引脚作为中断源,然后为中断配置触发方式即可。

触发方式可以是上升沿、下降沿或双边沿触发。

但要注意的是,当使用外部中断时,我们应该避免在中断服务子程序(ISR)中使用延时函数,如HAL_Delay。

这是因为在ISR中调用延时函数会导致中断响应时间增加,从而影响其他中断的响应和整个系统的实时性。

所以在ISR中,我们只能执行最核心、最迅速的操作。

为了避免在ISR中使用延时函数,我们可以使用定时器中断来实现延时。

定时器中断是一种定期触发的中断,在ISR中我们可以通过判断定时器的计数值来实现一定时间的延时。

下面是一个使用外部中断的示例代码:```c#include "stm32f4xx_hal.h"GPIO_InitTypeDef GPIO_InitStruct;EXTI_HandleTypeDef hexti;void SysTick_Handler(void)HAL_IncTick(;HAL_SYSTICK_IRQHandler(;void EXTI_IRQHandler(void)HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) //在这里执行最核心、最迅速的操作int main(void)HAL_Init(;SystemClock_Config(;__HAL_RCC_GPIOA_CLK_ENABLE(;__HAL_RCC_SYSCFG_CLK_ENABLE(;GPIO_InitStruct.Pin = GPIO_PIN_0;GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING; GPIO_InitStruct.Pull = GPIO_PULLDOWN;HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);HAL_NVIC_SetPriority(EXTI0_IRQn, 0, 0);HAL_NVIC_EnableIRQ(EXTI0_IRQn);while (1)//在这里执行其他操作}```在这个示例中,我们使用PA0引脚,即用户按钮作为外部中断源。

STM32外部中断原理与配置

STM32外部中断原理与配置

STM32外部中断原理与配置STM32-外部中断原理与配置IO⼝外部中断原理概述STM32控制器⽀持的外部中断/事件请求中断线M3M4M7EXTI线0~15:对应外部IO⼝的输⼊中断。

√√√EXTI线16:连接到PVD输出。

√√√EXTI线17:连接到RTC闹钟事件。

√√√EXTI线18:连接到USB OTG FS唤醒事件。

√√√EXTI线19:连接到以太⽹唤醒事件。

√√EXTI线20:连接到USB OTG HS(在FS中配置)唤醒事件√√EXTI线21:连接到RTC⼊侵和时间戳事件。

√√EXTI线22:连接到RTC唤醒事件。

√√EXSTI线23:连接到LPTIM1异步事件√IO⼝外部中断STM32的每个IO都可以作为外部中断输⼊。

每个外部中断线可以独⽴的配置触发⽅式(上升沿,下降沿或者双边沿触发),触发/屏蔽,专⽤的状态位。

STM32供IO使⽤的中断线只有16个,但是STM32F系列的IO⼝多达上百个,STM32F103ZGT6(112),那么中断线怎么跟io⼝对应呢?GPIO和中断线映射关系GPIOx.0映射到EXTI0GPIOx.1映射到EXTI1……GPIOx.14映射到EXTI14GPIOx.15映射到EXTI15对于M4/M7,配置寄存器为SYSCFG_EXTIRx对于M3,配置寄存器为AFIO_EXTICRx如下图所⽰,EXTI0[3:0]有4个位,可以配置16个,所以可以从PA0选择到PI0。

也就是说16个中断线,最多可以处理16*16个外部引脚的中断。

可以在⼿册中找到SYSCFG 外部中断配置寄存器:16个中断线就分配16个中断服务函数?IO⼝外部中断在中断向量表中只分配了7个中断向量,也就是只能使⽤7个中断服务函数。

从表中可以看出,外部中断线5~ 9分配⼀个中断向量,共⽤⼀个服务函数外部中断线10~15分配⼀个中断向量,共⽤⼀个中断服务函数。

中断服务函数列表:EXTI0_IRQHandlerEXTI1_IRQHandlerEXTI2_IRQHandlerEXTI3_IRQHandlerEXTI4_IRQHandlerEXTI9_5_IRQHandlerEXTI15_10_IRQHandlerIO⼝外部中断HAL库配置⽅法外部中断操作使⽤到的函数分布⽂件stm32fxxx_hal_gpio.hstm32fxxx_hal_gpio.c外部中断配置:外部中断的中断线映射配置和触发⽅式都是在GPIO初始化函数中完成:GPIO_InitTypeDef GPIO_Initure;GPIO_Initure.Pin=GPIO_PIN_0; //PA0GPIO_Initure.Mode=GPIO_MODE_IT_RISING; //上升沿触发GPIO_Initure.Pull=GPIO_PULLDOWN;HAL_GPIO_Init(GPIOA,&GPIO_Initure);void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init){uint32_t position;uint32_t ioposition = 0x00;uint32_t iocurrent = 0x00;uint32_t temp = 0x00;/* Check the parameters */assert_param(IS_GPIO_ALL_INSTANCE(GPIOx));assert_param(IS_GPIO_PIN(GPIO_Init->Pin));assert_param(IS_GPIO_MODE(GPIO_Init->Mode));assert_param(IS_GPIO_PULL(GPIO_Init->Pull));/* Configure the port pins */for(position = 0; position < GPIO_NUMBER; position++){/* Get the IO position */ioposition = ((uint32_t)0x01) << position;/* Get the current IO position */iocurrent = (uint32_t)(GPIO_Init->Pin) & ioposition;if(iocurrent == ioposition){/*--------------------- GPIO Mode Configuration ------------------------*//* In case of Alternate function mode selection */if((GPIO_Init->Mode == GPIO_MODE_AF_PP) || (GPIO_Init->Mode == GPIO_MODE_AF_OD)){/* Check the Alternate function parameter */assert_param(IS_GPIO_AF(GPIO_Init->Alternate));/* Configure Alternate function mapped with the current IO */temp = GPIOx->AFR[position >> 3];temp &= ~((uint32_t)0xF << ((uint32_t)(position & (uint32_t)0x07) * 4)) ;temp |= ((uint32_t)(GPIO_Init->Alternate) << (((uint32_t)position & (uint32_t)0x07) * 4));GPIOx->AFR[position >> 3] = temp;}/* Configure IO Direction mode (Input, Output, Alternate or Analog) */temp = GPIOx->MODER;temp &= ~(GPIO_MODER_MODER0 << (position * 2));temp |= ((GPIO_Init->Mode & GPIO_MODE) << (position * 2));GPIOx->MODER = temp;/* In case of Output or Alternate function mode selection */if((GPIO_Init->Mode == GPIO_MODE_OUTPUT_PP) || (GPIO_Init->Mode == GPIO_MODE_AF_PP) || (GPIO_Init->Mode == GPIO_MODE_OUTPUT_OD) || (GPIO_Init->Mode == GPIO_MODE_AF_OD)) {/* Check the Speed parameter */assert_param(IS_GPIO_SPEED(GPIO_Init->Speed));/* Configure the IO Speed */temp = GPIOx->OSPEEDR;temp &= ~(GPIO_OSPEEDER_OSPEEDR0 << (position * 2));temp |= (GPIO_Init->Speed << (position * 2));GPIOx->OSPEEDR = temp;/* Configure the IO Output Type */temp = GPIOx->OTYPER;temp &= ~(GPIO_OTYPER_OT_0 << position) ;temp |= (((GPIO_Init->Mode & GPIO_OUTPUT_TYPE) >> 4) << position);GPIOx->OTYPER = temp;}/* Activate the Pull-up or Pull down resistor for the current IO */temp = GPIOx->PUPDR;temp &= ~(GPIO_PUPDR_PUPDR0 << (position * 2));temp |= ((GPIO_Init->Pull) << (position * 2));GPIOx->PUPDR = temp;/*--------------------- EXTI Mode Configuration ------------------------*//* Configure the External Interrupt or event for the current IO */if((GPIO_Init->Mode & EXTI_MODE) == EXTI_MODE){/* Enable SYSCFG Clock */__HAL_RCC_SYSCFG_CLK_ENABLE();temp = SYSCFG->EXTICR[position >> 2];temp &= ~(((uint32_t)0x0F) << (4 * (position & 0x03)));temp |= ((uint32_t)(GPIO_GET_INDEX(GPIOx)) << (4 * (position & 0x03)));SYSCFG->EXTICR[position >> 2] = temp;/* Clear EXTI line configuration */temp = EXTI->IMR;temp &= ~((uint32_t)iocurrent);if((GPIO_Init->Mode & GPIO_MODE_IT) == GPIO_MODE_IT){temp |= iocurrent;}EXTI->IMR = temp;temp = EXTI->EMR;temp &= ~((uint32_t)iocurrent);if((GPIO_Init->Mode & GPIO_MODE_EVT) == GPIO_MODE_EVT){temp |= iocurrent;}EXTI->EMR = temp;/* Clear Rising Falling edge configuration */temp = EXTI->RTSR;temp &= ~((uint32_t)iocurrent);if((GPIO_Init->Mode & RISING_EDGE) == RISING_EDGE){temp |= iocurrent;}EXTI->RTSR = temp;temp = EXTI->FTSR;temp &= ~((uint32_t)iocurrent);if((GPIO_Init->Mode & FALLING_EDGE) == FALLING_EDGE){temp |= iocurrent;}EXTI->FTSR = temp;}}}}和串⼝中断⼀样,HAL库同样提供了外部中断通⽤处理函数HAL_GPIO_EXTI_IRQHandler,我们在外部中断服务函数中会调⽤该函数处理中断。

(stm32f103学习总结)—stm32外部中断

(stm32f103学习总结)—stm32外部中断

(stm32f103学习总结)—stm32外部中断⼀、外部中断介绍1.1 EXTI简介 EXTI简介 STM32F10x外部中断/事件控制器(EXTI)包含多达 20 个⽤于产⽣事 件/中断请求的边沿检测器。

EXTI的每根输⼊线都可单独进⾏配置,以选 择类型(中断或事件)和相应的触发事件(上升沿触发、下降沿触发或 边沿触发),还可独⽴地被屏蔽。

(stm32f103有19个)1.2 EXTI结构框图1.3 外部中断/事件线映射 STM32F10x的EXTI具有20个中断/事件线,如下:(stm32f103有19个以太⽹唤醒事件没有;stm32f107有20个) STM32F10x 的 EXTI 供外部 IO ⼝使⽤的中断线有 16 根,但是我们使⽤的 STM32F103 芯⽚却远远不⽌ 16 个 IO ⼝,那么 STM32F103 芯⽚怎么解决这个问题的呢? 因为 STM32F103 芯⽚每个 GPIO 端⼝均有 16 个管脚,因此把每个端⼝的 16 个 IO 对应那 16 根中断线 EXTI0-EXTI15 。

⽐如:GPIOx.0-GPIOx.15(x=A,B,C,D,E,F,G)分别对应中断线 EXTI0-EXTI15,这样⼀来每个中断线就对应了最多 7 个 IO ⼝,⽐如:GPIOA.0、GPIOB.0、GPIOC.0、GPIOD.0、GPIOE.0、GPIOF.0、GPIOG.0。

但是中断线每次只能连接⼀个在 IO ⼝上,这样就需要通过 AFIO 的外部中断配置寄存器 1 的 EXTIx[3:0]位来决定对应的中断线映射到哪个GPIO 端⼝上,对于中断线映射到 GPIO 端⼝上的配置函数在stm32f10x_gpio.c 和 stm32f10x_gpio.h 中,所以使⽤到外部中断时要把这个⽂件加⼊到⼯程中,在创建库函数模板的时候我们默认已经添加。

EXTI 的 GPIO 映射图如图 18.1.3 所⽰:⼆、外部中断配置步骤 要使⽤外部中断我们就需要先配置它,通常都需经过这⼏步:(1)使能IO ⼝时钟,配置IO ⼝模式为输⼊(2)开启 AFIO 时钟,设置 IO ⼝与中断线的映射关系RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //开启AFIO 时钟void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource); //设置IO ⼝与中断线的映射关系即哪个io ⼝哪⼀个管脚作为中断输⼊线GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0); //这⾥以配置GPIOA ⼝ GPIOA 的第0管脚作为中断输⼊线(3)配置中断分组(NVIC ),使能中断(4)初始化EXTI ,选择触发⽅式(5)编写EXTI 中断服务函数(中断函数固件库中已经定义必须使⽤下列函数名不能⾃⼰定义)EXTI0_IRQHandlerEXTI1_IRQHandlerEXTI2_IRQHandlerEXTI3_IRQHandlerEXTI4_IRQHandlerEXTI9_5_IRQHandlerEXTI15_10_IRQHandler三、编写外部中断控制程序 要实现外部中断⽅式控制LED ,程序框架如下:(1)初始化对应端⼝的EXTI (第三部分中的1-4⼩步)1 void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct);2 typedef struct3 {4 uint32_t EXTI_Line; //中断/事件线5 EXTIMode_TypeDef EXTI_Mode; //EXTI 模式6 EXTITrigger_TypeDef EXTI_Trigger; //EXTI 触发⽅式7 FunctionalState EXTI_LineCmd; //中断线使能或失能8 }EXTI_InitTypeDef ;(2)编写EXTI中断函数(3)编写主函数1/*******************************************************************************2* 函数名 : My_EXTI_Init3* 函数功能 : 外部中断初始化4* 输⼊ : ⽆5* 输出 : ⽆6*******************************************************************************/7void My_EXTI_Init(void)8{9 NVIC_InitTypeDef NVIC_InitStructure;10 EXTI_InitTypeDef EXTI_InitStructure;1112 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //AFIO使能13 GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);//选择GPIO管脚⽤作外部中断线路14//EXTI0 NVIC 配置15 NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;//EXTI0中断通道16 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;//抢占优先级17 NVIC_InitStructure.NVIC_IRQChannelSubPriority =3; //⼦优先级18 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能19 NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器20//初始化EXTI 配置21 EXTI_InitStructure.EXTI_Line=EXTI_Line0;22 EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;23 EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising;24 EXTI_InitStructure.EXTI_LineCmd=ENABLE;25 EXTI_Init(&EXTI_InitStructure);26}1/*******************************************************************************2* 函数名 : EXTI0_IRQHandler3* 函数功能 : 外部中断0函数4* 输⼊ : ⽆5* 输出 : ⽆6*******************************************************************************/7void EXTI0_IRQHandler(void)8{9 if(EXTI_GetITStatus(EXTI_Line3)==1) //判断EXTI中断标志位状态函数10 {11 //填写中断中需要完成的程序12 }13 EXTI_ClearITPendingBit(EXTI_Line3); //在结束中断服务函数前,清楚中断标志位1415 }。

STM32外部中断(实现按键控制LED)

STM32外部中断(实现按键控制LED)

STM32外部中断(实现按键控制LED)引⾔“中断” 这个概念,指的是在单⽚机运⾏过程中,在指定条件发⽣时,停下当前所有⼯作,去执⾏中断处理函数内的内容。

就像我们在教室上课时,突然地震了,不出意外的话我们都需要停下⼿中学习任务,去进⾏⼀系列的避险动作。

这⼀节我们通过中断的⽅式,完成通过按键控制LED亮灭的操作。

准备环节中断相关知识STM32的中断控制器⽀持19个外部中断/事件请求。

这⼗九个外部中断为:线0~15:对应外部IO⼝的输⼊中断。

线16:连接到PVD输出。

线17:连接到连接到RTC时钟事件。

线18:连接到USB唤醒事件。

配置使⽤时,需要先将IO⼝与相应中断线的映射关系建⽴,再对其进⾏使⽤。

那映射关系是怎样的呢?GPIOx.0 ~ GPIOx.15(x = A,B,C,D,E,F,G)分别对应中断线0 ~ 15配置GPIO与中断线关系的函数是void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource)eg:GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource2);把GPIO作为EXTI外部中断时,需要打开AFIO时钟。

APIO时钟何时需要打开,具体可以参考这篇⽂章:嵌套向量中断控制器(NVIC)初始化完线上中断和中断条件等内容,还需要配置中断分组。

配置中断分组之前,我们需要先确定如何进⾏分组。

这⾥就需要⽤到NVIC。

关于NVIC的具体内容可查看这篇博⽂:。

编码环节步骤初始化IO⼝输⼊开启AFIO时钟设置IO⼝与中断线的映射关系初始化线上中断、设置触发条件等配置中断分组,并使能中断编写中断服务函数main.c(以下内容均省略头⽂件)int main(void){delay_init();NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC终端分组2LED_Init();KEY_Init();EXTIX_Init(); //外部中断初始化LED1 = 0;}exti.h#ifndef __EXTI_H#define __EXIT_H#include "sys.h"void EXTIX_Init(void); //外部中断初始化#endifexti.cvoid EXTIX_Init(void){EXTI_InitTypeDef EXTI_InitStructure; //外部中断结构体初始化NVIC_InitTypeDef NVIC_InitStructure; //中断分组结构体初始化KEY_Init();RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //开启AFIO时钟GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0); //映射IO⼝与中断线//以下为配置中断线初始化EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //中断模式EXTI_InitStructure.EXTI_LineCmd = ENABLE; //使能中断线EXTI_InitStructure.EXTI_Line = EXTI_Line0; //中断线标号EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; //触发⽅式EXTI_Init(&EXTI_InitStructure);//以下为中断优先级的配置NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; //声明使⽤的中断是哪⼀个NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //设置抢占优先级为2 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x03; //设置⼦优先级为3NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能中断NVIC_Init(&NVIC_InitStructure);}void EXTI0_IRQHandler(void) //中断服务函数{delay_ms(10); //软件去抖if(WK_UP==1){LED0 = !LED0;LED1 = !LED1;}EXTI_ClearITPendingBit(EXTI_Line0); //清除中断位}补充中断服务函数中断服务函数的名称是固定的,写错会导致⽆法中断。

stm32外部中断实验原理

stm32外部中断实验原理

stm32外部中断实验原理STM32是意法半导体公司推出的一款32位单片机系列产品,具有高性能、低功耗和广泛的外设功能。

其中外部中断是其重要的功能之一,可以实现外部事件的异步处理,适用于各种实时应用。

外部中断的原理是通过外部引脚和STM32之间的触发信号来实现中断的触发和处理。

STM32支持多种中断模式,包括上升沿触发、下降沿触发、双边沿触发和低电平触发等。

如何使用外部中断呢?首先,在程序中需要使用到外部中断的引脚上要连接一个外部触发源,比如按键或传感器等。

然后,在程序中对该引脚进行配置,指定外部中断的触发方式。

接下来,在程序中编写中断处理函数,在中断触发时执行相应的处理逻辑。

最后,在启动中断之前,需要使能相应的中断,并配置优先级。

STM32外部中断是基于NVIC(Nested Vectored Interrupt Controller)的,它是ARM Cortex-M处理器的一部分。

它能够支持多重中断,并可配置中断优先级。

当一个外部中断触发时,会产生一个中断请求,然后被NVIC捕获,并根据优先级进行中断处理。

在硬件层面上,外部中断将通过外部中断控制器(EXTI)和GPIO控制器进行连接。

外部中断的引脚通过GPIO控制器配置为中断模式,并通过EXTI控制器与NVIC连接。

当外部触发源产生中断信号时,通过GPIO控制器将该中断信号传递给EXTI控制器,然后触发中断处理。

在软件编程方面,首先需要对GPIO和EXTI进行相应的初始化配置。

对于GPIO,我们需要设置引脚的模式、速度和上下拉等参数。

对于EXTI,我们需要设置中断触发方式(例如上升沿触发)和中断屏蔽(可以选择屏蔽或非屏蔽中断)等。

接着,使用STM32提供的库函数进行中断处理的配置。

首先,我们需要使用NVIC_Init函数来配置NVIC,使能相应的中断和设置中断优先级。

然后,使用EXTI_Init函数设置外部中断的触发方式和屏蔽等。

最后,编写中断处理函数,当外部中断触发时进行相应的处理。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

STM32 外部中断配NVIC_Configuration 函数实现配置嵌套向量中断中断优先级并使能中断。

其中的NVIC_PriorityGroupConfig 函数配置中断优先级的组织方式,STM32 的嵌套向量中断控制器可以配置16 个可编程的优先等级,使用了4 位表示中断优先级(2 的4 此方就是16),16 个可编程的优先等级又可以分为主优先级和次优先级,例如参数NVIC_PriorityGroup_1表示1bit 主优先级(pre-emption priority)3 bits 次优先级(subpriority )。

一、配置中断1、分配中断向量表:/* Set the Vector Table base location at 0x20000000 */NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);2、设置中断优先级:NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); //设置中断优先级3、初始化外部中断:/*允许EXTI4中断*/NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQChannel; //中断通道NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority= PreemptionPriorityValue; //占先优先级NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //响应(次级)优先级NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //通道中断使能NVIC_Init(&NVIC_InitStructure); //初始化中断注意:如果我们配置的外部针脚为PA4,或PB4,或PC4,PD4等,那么采用的外部中断也必须是EXTI4,同样,如果外部中断针脚是PA1,PB1,PC1,PD1 那么中断就要用EXTI1,其他类推。

二、配置GPIO针脚作为外部中断的触发事件1、选择IO针脚GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;注意,如果的针脚是端口的4号针脚,配置的中断一定是EXTI42、配置针脚为输入GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;3、初始化针脚GPIO_Init(GPIOD,&GPIO_InitStructure);3配置EXTI线,使中断线和IO针脚线连接上1、将EXTI线连接到IO端口上将EXTI线4连接到端口GPIOD的第4个针脚上GPIO_EXTILineConfig(GPIO_PortSourceGPIOD,GPIO_PinSource4);注意:如果配置的针脚是4号,那么参数必须是GPIO_PinSource4如果配置的针脚是3号,那么参数必须是GPIO_PinSource32、配置中断边沿/*配置EXTI线4上出现下降沿,则产生中断*/EXTI_InitStructure.EXTI_Line = EXTI_Line4;注意:如果配置的4号针脚,那么EXTI_Line4是必须的EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿触发EXTI_InitStructure.EXTI_LineCmd = ENABLE; //中断线使能EXTI_Init(&EXTI_InitStructure); //初始化中断EXTI_GenerateSWInterrupt(EXTI_Line4); //EXTI_Line4中断允许到此中断配置完成,可以写中断处理函数。

举例:配置函数/************************************************************* ************* 函数名NVIC_Configration* 描述配置各个中断寄存器************************************************************** **************/void NVIC_Configration(void){NVIC_InitTypeDef NVIC_InitStructure;//#ifdef VECT_TAB_RAM/* Set the Vector Table base location at 0x20000000 */NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);//#else /* VECT_TAB_FLASH *//* Set the Vector Table base location at 0x08000000 *///NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);//#endifNVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); //设置中断优先级/*允许EXTI4中断*/NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQChannel;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = PreemptionPriorityValue;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);/*允许EXTI9中断*/NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQChannel;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);/*配置SysTick处理优先级:优先级以及子优先级*/}/************************************************************* ************ 函数名GPIO_Configuration(void)* 描述配置TIM2针脚************************************************************** **********/void GPIO_Configuration(void){/* GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);*/GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;GPIO_Init(GPIOC,&GPIO_InitStructure);/*配置GPIOD的第一个管角为浮动输入*/GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOD,&GPIO_InitStructure);/*配置GPIOB的第9个管脚为浮动输入*/GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOB,&GPIO_InitStructure);}/************************************************************* ** 函数SysTick_Configuration* 描述设置SysTick************************************************************** */void SysTick_Configuration(void){/*配置HCLK 时钟做为SysTick 时钟源*/SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); //系统时钟8分频72MHzNVIC_SystemHandlerPriorityConfig(SystemHandler_SysTick, 8,2);/*SysTick Interrupt each 1000Hz with HCLK equal to 72MHz*/SysTick_SetReload(9000);//中断周期1ms/*Enable the SysTick Interrupt */SysTick_ITConfig(ENABLE);//打开中断SysTick_CounterCmd(SysTick_Counter_Enable);SysTick_CounterCmd(SysTick_Counter_Clear);}/************************************************************* ****************** 函数名EXTI_Configuration* 描述配置EXTI线************************************************************** ****************/void EXTI_Configuration(void){/*将EXTI线4连接到PD4*/GPIO_EXTILineConfig(GPIO_PortSourceGPIOD,GPIO_PinSource4);/*配置EXTI线4上出现下降沿,则产生中断*/EXTI_InitStructure.EXTI_Line = EXTI_Line4;EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;EXTI_InitStructure.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTI_InitStructure);EXTI_GenerateSWInterrupt(EXTI_Line4);/*将EXTI线9连接到PB9上*/GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource9);/*将EXTI线9上出现下降沿产生中断*/EXTI_InitStructure.EXTI_Line = EXTI_Line9;EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;EXTI_InitStructure.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTI_InitStructure);EXTI_GenerateSWInterrupt(EXTI_Line9);}中断函数:void EXTI4_IRQHandler(void){if(EXTI_GetITStatus(EXTI_Line4)!= RESET){if(Ledflag == 0){Ledflag = 1;GPIOC->ODR |= 0X00000080;}else{Ledflag = 0;GPIOC->ODR &= 0XFFFFFF7F;}}EXTI_ClearITPendingBit(EXTI_Line4); //清除EXTI0线路挂起位}注:时钟设置的时候最好加上这句:RCCRCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); // 使能AFIO时钟================================================ /************************************************************* ************************************************************** 例程名称:外部中断实验实验硬件:DP-miniSTM32硬件连接:指示灯连接PA1按钮连接PA3功能描述:本例程实现外部中断的输入试验,按下按钮,指示灯闪烁一下************************************************************** ******/#include <stm32f10x_lib.h> // STM32F10x Library Definitions#include "STM32_Init.h" // STM32 Initialization/************************************************************* ********** 名称:Delay()*************************************************************/ void Delay(vu16 cnt) {uint16 i,j;for (i=0;i<cnt;i++){ for (j=0;j<1000;j++){ }}}/************************************************************* ********** 名称:RCC_Configuration()*************************************************************/ void RCC_Configuration(void){ErrorStatus HSEStartUpStatus;//使能外部晶振RCC_HSEConfig(RCC_HSE_ON);//等待外部晶振稳定HSEStartUpStatus = RCC_WaitForHSEStartUp();//如果外部晶振启动成功,则进行下一步操作if(HSEStartUpStatus==SUCCESS){//设置HCLK(AHB时钟)=SYSCLKRCC_HCLKConfig(RCC_SYSCLK_Div1);//PCLK1(APB1) = HCLK/2RCC_PCLK1Config(RCC_HCLK_Div2);//PCLK2(APB2) = HCLKRCC_PCLK2Config(RCC_HCLK_Div1);RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_4);//启动PLLRCC_PLLCmd(ENABLE);//等待PLL稳定while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);//系统时钟SYSCLK来自PLL输出RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//切换时钟后等待系统时钟稳定while(RCC_GetSYSCLKSource()!=0x08);}/* RCC system reset(for debug purpose) */RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFI O , ENABLE); //给GPIOA和重映射提供时钟,注意:一定要设置RCC_APB2Periph_AFIO}/************************************************************* ********** 名称:GPIO_Configuration()*************************************************************/ void GPIO_Configuration(void){GPIO_InitTypeDef GPIO_InitStructure;/*设置PA3为输入*/GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOA,&GPIO_InitStructure);/*设置PA1为输出*/GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(GPIOA, &GPIO_InitStructure);}/************************************************************* ********** 名称:EXTI_Configuration()************************************************************** *********/void EXTI_Configuration(void){EXTI_InitTypeDef EXTI_InitStructure;/* Configure EXTI Line3 to generate an interrupt on falling edge */EXTI_InitStructure.EXTI_Line = EXTI_Line3; //外部中断通道3 EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿触发EXTI_InitStructure.EXTI_LineCmd = ENABLE; //使能EXTI_Init(&EXTI_InitStructure);GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource3); //将PA3连接到外部中断通道3}/************************************************************* ********** 名称:NVIC_Configuration()*************************************************************/ void NVIC_Configuration(void){NVIC_InitTypeDef NVIC_InitStructure;#ifdef VECT_TAB_RAM/* Set the Vector Table base location at 0x20000000 */NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);#else/* VECT_TAB_FLASH *//* Set the Vector Table base location at 0x08000000 */NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);#endifNVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); //抢占式优先级别设置为无抢占优先级NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQChannel; //指定中断源NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //指定响应优先级别1NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道3NVIC_Init(&NVIC_InitStructure);}int main (void){RCC_Configuration(); //配置时钟GPIO_Configuration(); //配置IO口NVIC_Configuration(); //中断配置EXTI_Configuration(); //外部中断配置while(1){}}/************************************************************ *********** 说明:将LED灯的连接到PA1*************************************************************/ void EXTI3_IRQHandler (void){if(EXTI_GetITStatus(EXTI_Line3) != RESET){//添加中断处理程序GPIO_WriteBit(GPIOA, GPIO_Pin_1,(BitAction)0);Delay(1000);GPIO_WriteBit(GPIOA, GPIO_Pin_1,(BitAction)1);Delay(1000);EXTI_ClearFlag(EXTI_Line3); //清除中断标志(必须)EXTI_ClearITPendingBit(EXTI_Line3);// 以上两条语句作用相同}}================================================在使用EXTI的时候,因为没有开启时钟没有开启RCC_APB2Periph_AFIO时钟,让我调试吃了不少苦头,看来还要好好看看stm32的时钟啊现在给出我的exti8的配置首先一定要记得配置RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); // 使能AFIO时钟//GPIOB8作为中断脚,配置为浮空输入void GPIO_Configuration(void){GPIO_InitTypeDef GPIO_InitStructure;/* Configure PB8 as input floating */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOB,&GPIO_InitStructure);}继续配置NVICvoid NVIC_Configuration(void){NVIC_InitTypeDef NVIC_InitStructure;NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);/* Configure the NVIC Preemption Priority Bits*/NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);/* Set the Vector Table base location at 0x08000000 */NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);}然后配置EXTI ,把PB8连接到EXTIvoid EXTI_Configuration(void){EXTI_InitTypeDef EXTI_InitStructure;/*connect PB8 to EXTI*/GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource8);/*Config EXTI8*/EXTI_InitStructure.EXTI_Line = EXTI_Line8;EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;EXTI_InitStructure.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTI_InitStructure);//EXTI_GenerateSWInterrupt(EXTI_Line8);}这样就可以中断了,在中断函数里面记得清除标志位void EXTI9_5_IRQHandler(void){if(EXTI_GetITStatus(EXTI_Line8)!= RESET){EXTI_ClearITPendingBit(EXTI_Line8);}}。

相关文档
最新文档