基于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的ADC中,配置中断可以通过HAL库或标准库来完成。

以下是一个使用HAL库的例程,用于配置并启用ADC的中断功能。

首先,需要初始化ADC并配置中断:#include"stm32f4xx_hal.h"ADC_HandleTypeDef hadc1;void HAL_ADC_MspInit(ADC_HandleTypeDef*hadc){GPIO_InitTypeDef GPIO_InitStruct={0};__HAL_RCC_GPIOA_CLK_ENABLE();__HAL_RCC_ADC1_CLK_ENABLE();GPIO_InitStruct.Pin=GPIO_PIN_0;GPIO_InitStruct.Mode=GPIO_MODE_ANALOG;GPIO_InitStruct.Pull=GPIO_NOPULL;HAL_GPIO_Init(GPIOA,&GPIO_InitStruct);HAL_NVIC_SetPriority(ADC_IRQn,0,0);HAL_NVIC_EnableIRQ(ADC_IRQn);}void HAL_ADC_MspDeInit(ADC_HandleTypeDef*hadc){__HAL_RCC_ADC1_CLK_DISABLE();}void MX_ADC1_Init(void){ADC_ChannelConfTypeDef sConfig={0};hadc1.Instance=ADC1;hadc1.Init.ClockPrescaler=ADC_CLOCK_SYNC_PCLK_DIV4;hadc1.Init.Resolution=ADC_RESOLUTION_12B;hadc1.Init.ScanConvMode=DISABLE;hadc1.Init.ContinuousConvMode=DISABLE;hadc1.Init.DiscontinuousConvMode=DISABLE;hadc1.Init.DataAlign=ADC_DATAALIGN_RIGHT;hadc1.Init.NbrOfConversion=1;hadc1.Init.DMAContinuousRequests=DISABLE;hadc1.Init.EOCSelection=ADC_EOC_SINGLE_CONV;HAL_ADC_Init(&hadc1);sConfig.Channel=ADC_CHANNEL_0;sConfig.Rank=1;sConfig.SamplingTime=ADC_SAMPLETIME_3CYCLES;HAL_ADC_ConfigChannel(&hadc1,&sConfig);}接下来,启动ADC并在中断服务函数中处理中断:void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef*hadc){if(hadc->Instance==ADC1){uint32_t adc_value=HAL_ADC_GetValue(hadc);//在这里处理ADC转换完成中断}}void ADC_IRQHandler(void){HAL_ADC_IRQHandler(&hadc1);}这是一个简单的例程,用于配置和使用STM32的ADC中断功能。

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实例外部中断实验

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。

stm32中断服务函数

stm32中断服务函数

stm32中断服务函数你打开的启动⽂件,例如startup_f10x_hd.s ⾥⾯有很多中断跳转的⼊⼝。

⽤⽩话说就是固件库帮你写好了发⽣什么中断时跳转到哪⾥,这些名字是⼀个函数名,你要把这些函数写出来,然后中断来了就跳到这样函数名的函数⾥⾯来。

这些函数不⼀定要放到stm32f10x_it.c 这个⽂件⾥,随便在哪个 .c ⽂件中都⾏,固件库都搞到这个stm32f10x_it.c⽂件⾥是为了⽅便统⼀管理吧。

中断⽆需声明,没有返回值。

下⾯举⼏个例⼦,希望对你有⽤!DCD EXTI0_IRQHandler ; EXTI Line 0DCD EXTI1_IRQHandler ; EXTI Line 1DCD EXTI2_IRQHandler ; EXTI Line 2DCD EXTI3_IRQHandler ; EXTI Line 3DCD EXTI4_IRQHandler ; EXTI Line 4DCD EXTI9_5_IRQHandler ; EXTI Line 9..5DCD EXTI15_10_IRQHandler ; EXTI Line 15..10在启动⽂件中 __Vectors DCD __initial_sp ; Top of StackDCD Reset_Handler ; Reset HandlerDCD NMI_Handler ; NMI HandlerDCD HardFault_Handler ; Hard Fault HandlerDCD MemManage_Handler ; MPU Fault HandlerDCD BusFault_Handler ; Bus Fault HandlerDCD UsageFault_Handler ; Usage Fault HandlerDCD 0 ; ReservedDCD 0 ; ReservedDCD 0 ; ReservedDCD 0 ; ReservedDCD SVC_Handler ; SVCall HandlerDCD DebugMon_Handler ; Debug Monitor HandlerDCD 0 ; ReservedDCD PendSV_Handler ; PendSV HandlerDCD SysTick_Handler ; SysTick Handler; External InterruptsDCD WWDG_IRQHandler ; Window WatchdogDCD PVD_IRQHandler ; PVD through EXTI Line detectDCD TAMPER_IRQHandler ; TamperDCD RTC_IRQHandler ; RTCDCD FLASH_IRQHandler ; FlashDCD RCC_IRQHandler ; RCCDCD EXTI0_IRQHandler ; EXTI Line 0DCD EXTI1_IRQHandler ; EXTI Line 1DCD EXTI2_IRQHandler ; EXTI Line 2DCD EXTI3_IRQHandler ; EXTI Line 3DCD EXTI4_IRQHandler ; EXTI Line 4DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1DCD DMA1_Channel2_IRQHandler ; DMA1 Channel 2DCD DMA1_Channel3_IRQHandler ; DMA1 Channel 3DCD DMA1_Channel4_IRQHandler ; DMA1 Channel 4DCD DMA1_Channel5_IRQHandler ; DMA1 Channel 5DCD DMA1_Channel6_IRQHandler ; DMA1 Channel 6DCD DMA1_Channel7_IRQHandler ; DMA1 Channel 7DCD ADC1_2_IRQHandler ; ADC1 & ADC2DCD USB_HP_CAN1_TX_IRQHandler ; USB High Priority or CAN1 TXDCD USB_LP_CAN1_RX0_IRQHandler ; USB Low Priority or CAN1 RX0DCD CAN1_RX1_IRQHandler ; CAN1 RX1DCD CAN1_SCE_IRQHandler ; CAN1 SCEDCD EXTI9_5_IRQHandler ; EXTI Line 9..5DCD TIM1_BRK_IRQHandler ; TIM1 BreakDCD TIM1_UP_IRQHandler ; TIM1 UpdateDCD TIM1_TRG_COM_IRQHandler ; TIM1 Trigger and CommutationDCD TIM1_CC_IRQHandler ; TIM1 Capture CompareDCD TIM2_IRQHandler ; TIM2DCD TIM3_IRQHandler ; TIM3DCD TIM4_IRQHandler ; TIM4DCD I2C1_EV_IRQHandler ; I2C1 EventDCD I2C1_ER_IRQHandler ; I2C1 ErrorDCD I2C2_EV_IRQHandler ; I2C2 EventDCD I2C2_ER_IRQHandler ; I2C2 ErrorDCD SPI1_IRQHandler ; SPI1DCD SPI2_IRQHandler ; SPI2DCD USART1_IRQHandler ; USART1DCD USART2_IRQHandler ; USART2DCD USART3_IRQHandler ; USART3DCD EXTI15_10_IRQHandler ; EXTI Line 15..10DCD RTCAlarm_IRQHandler ; RTC Alarm through EXTI LineDCD USBWakeUp_IRQHandler ; USB Wakeup from suspendDCD TIM8_BRK_IRQHandler ; TIM8 BreakDCD TIM8_UP_IRQHandler ; TIM8 UpdateDCD TIM8_TRG_COM_IRQHandler ; TIM8 Trigger and Commutation DCD TIM8_CC_IRQHandler ; TIM8 Capture CompareDCD ADC3_IRQHandler ; ADC3DCD FSMC_IRQHandler ; FSMCDCD SDIO_IRQHandler ; SDIODCD TIM5_IRQHandler ; TIM5DCD SPI3_IRQHandler ; SPI3DCD UART4_IRQHandler ; UART4DCD UART5_IRQHandler ; UART5DCD TIM6_IRQHandler ; TIM6DCD TIM7_IRQHandler ; TIM7DCD DMA2_Channel1_IRQHandler ; DMA2 Channel1DCD DMA2_Channel2_IRQHandler ; DMA2 Channel2DCD DMA2_Channel3_IRQHandler ; DMA2 Channel3DCD DMA2_Channel4_5_IRQHandler ; DMA2 Channel4 & Channel5 __Vectors_End。

基于STM32的_矩阵键盘_驱动(中断方式)

基于STM32的_矩阵键盘_驱动(中断方式)

//==========================Keyboard.h===============================///*----------------------------------------------本程序实现4*5键盘的扫描从左到右,从上到下,键值依次为1-20------------------------------------------------*/#ifndef __KEYBOARD_H#define __KEYBOARD_H#include "stm32f10x_lib.h"//选择扫描模式#define Interrupt_Scan //中断扫描模式,要在NVIC在中打开对应中断/*可以自己定义其它扫描方式*/#define DELAY_COUNT 0x0FFFF/* 键盘控制引脚定义*/#define Keyboard_Control_Port GPIOD#define Keyboard_Line_1 GPIO_Pin_0#define Keyboard_Line_2 GPIO_Pin_1#define Keyboard_Line_3 GPIO_Pin_2#define Keyboard_Line_4 GPIO_Pin_3#define Keyboard_Line_5 GPIO_Pin_4#define Keyboard_Row_1 GPIO_Pin_5#define Keyboard_Row_2 GPIO_Pin_6#define Keyboard_Row_3 GPIO_Pin_7#define Keyboard_Row_4 GPIO_Pin_8#define Keyboard_LineBase Keyboard_Line_1#define Keyboard_RowBase Keyboard_Row_1#define Keyboard_Line (Keyboard_Line_1 | Keyboard_Line_2 | Keyboard_Line_3 | Keyboard_Line_4 | Keyboard_Line_5)#define Keyboard_Row (Keyboard_Row_1 | Keyboard_Row_2 | Keyboard_Row_3 | Keyboard_Row_4)#ifdef Interrupt_Scan /* 中断扫描模式宏定义*/#define Keyboard_EXTI_Row1 EXTI_Line5#define Keyboard_EXTI_Row2 EXTI_Line6#define Keyboard_EXTI_Row3 EXTI_Line7#define Keyboard_EXTI_Row4 EXTI_Line8#define Keyboard_EXTI_PortSource GPIO_PortSourceGPIOD#define Keyboard_EXTI_PinSource1 GPIO_PinSource5#define Keyboard_EXTI_PinSource2 GPIO_PinSource6#define Keyboard_EXTI_PinSource3 GPIO_PinSource7#define Keyboard_EXTI_PinSource4 GPIO_PinSource8#define Keyboard_IRQ_Channel EXTI9_5_IRQChannel#define Keyboard_EXTI_Line (Keyboard_EXTI_Row1 | Keyboard_EXTI_Row2 | Keyboard_EXTI_Row3 | Keyboard_EXTI_Row4)#endif /* 中断扫描模式宏定义*//* 键盘全局变量声明*/extern unsigned int Keyboard_Val ; //当前键值extern unsigned char Keyboard_Change_Flag ; //键值改变标志,读取新的键值后由主程序清零/* 键盘接口函数声明*/#ifdef Interrupt_Scanextern void Init_Keyboard_Interrupt(void) ;//键盘初始化为键盘扫描模式#endifextern void Delay(vu32 nCount) ; //用于延时消抖#endif /* KEYBOARD_H *///=================================================================////============================Keyboard.c=============================//#include "stm32f10x_lib.h"#include "Keyboard.h"unsigned int Keyboard_Val = 0 ; //保存键值unsigned char Keyboard_Change_Flag = 0 ; //键值改变标志,读取键值后清零/****************************************************************函数名称: Init_Keyboard_Interrupt功能: 键盘初始化为中断扫描模式初始化键盘需要的IO,Line1-Line5设为输出低Row1-Row4 接上拉电阻,使能下降沿中断参数: 无返回值: 无*****************************************************************/void Init_Keyboard_Interrupt(void){GPIO_InitTypeDef GPIO_InitStructure ;EXTI_InitTypeDef EXTI_InitStructure ;EXTI_DeInit() ;//Line1-Line5设为输出高GPIO_InitStructure.GPIO_Pin = Keyboard_Line ;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ; //推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz ;GPIO_Init(Keyboard_Control_Port ,&GPIO_InitStructure) ;GPIO_SetBits(Keyboard_Control_Port ,Keyboard_Line) ;//Row1-Row4设置为下拉输入,用来接收上升沿中断GPIO_InitStructure.GPIO_Pin = Keyboard_Row;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD ; //下拉输入GPIO_Init(Keyboard_Control_Port ,&GPIO_InitStructure) ;EXTI_ClearITPendingBit(Keyboard_EXTI_Row1) ; //清除中断标志位GPIO_EXTILineConfig(Keyboard_EXTI_PortSource ,Keyboard_EXTI_PinSource1 ); //Pinsource不能取或EXTI_ClearITPendingBit(Keyboard_EXTI_Row2) ; //清除中断标志位GPIO_EXTILineConfig(Keyboard_EXTI_PortSource ,Keyboard_EXTI_PinSource2 );EXTI_ClearITPendingBit(Keyboard_EXTI_Row3) ; //清除中断标志位GPIO_EXTILineConfig(Keyboard_EXTI_PortSource ,Keyboard_EXTI_PinSource3 );EXTI_ClearITPendingBit(Keyboard_EXTI_Row4) ; //清除中断标志位GPIO_EXTILineConfig(Keyboard_EXTI_PortSource ,Keyboard_EXTI_PinSource4 );//设置Row1-Row4为上升沿中断EXTI_InitStructure.EXTI_Line = Keyboard_EXTI_Line;EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt ;EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising ;EXTI_InitStructure.EXTI_LineCmd = ENABLE ;EXTI_Init(&EXTI_InitStructure) ;}/****************************************************************函数名称: Delay功能: 在扫描按键时,用于延时消抖参数: nCount -- 延时长度返回值: 无*****************************************************************/void Delay(vu32 nCount){for(; nCount!= 0;nCount--);}//==============================================================////=========================stm32f10x_it.c============================//void EXTI9_5_IRQHandler(void){unsigned long tmpFlag=0 ; //保存需要的中断标志位unsigned char i = 0 ; //循环标量tmpFlag = EXTI->PR & Keyboard_EXTI_Line ; //只取设定过的标志位EXTI->PR = tmpFlag ;switch(tmpFlag) //判断是哪个标志位置位{case Keyboard_EXTI_Row1:GPIO_ResetBits(Keyboard_Control_Port ,Keyboard_Line) ;for(i=0 ;i<5 ;i++) //扫描方式判断按键{GPIO_SetBits(Keyboard_Control_Port ,(Keyboard_LineBase<<i)) ;if(GPIO_ReadInputDataBit(Keyboard_Control_Port ,Keyboard_Row_1)) {Delay(DELAY_COUNT) ; //延时消抖if(GPIO_ReadInputDataBit(Keyboard_Control_Port ,Keyboard_Row_1)) {Keyboard_Val = 1+i ;Keyboard_Change_Flag = 1 ;break ;}}}GPIO_SetBits(Keyboard_Control_Port ,Keyboard_Line) ;EXTI->PR = Keyboard_EXTI_Row1 ; //清除中断标志break ;case Keyboard_EXTI_Row2:GPIO_ResetBits(Keyboard_Control_Port ,Keyboard_Line) ;for(i=0 ;i<5 ;i++)//扫描方式判断按键{GPIO_SetBits(Keyboard_Control_Port ,(Keyboard_LineBase<<i)) ;if(GPIO_ReadInputDataBit(Keyboard_Control_Port ,Keyboard_Row_2)) {Delay(DELAY_COUNT) ; //延时消抖if(GPIO_ReadInputDataBit(Keyboard_Control_Port ,Keyboard_Row_2)) {Keyboard_Val = 6+i ;Keyboard_Change_Flag = 1 ;break ;}}}GPIO_SetBits(Keyboard_Control_Port ,Keyboard_Line) ;EXTI->PR = Keyboard_EXTI_Row2 ; //清除中断标志break ;case Keyboard_EXTI_Row3:GPIO_ResetBits(Keyboard_Control_Port ,Keyboard_Line) ;for(i=0 ;i<5 ;i++) //扫描方式判断按键{GPIO_SetBits(Keyboard_Control_Port ,(Keyboard_LineBase<<i)) ;if(GPIO_ReadInputDataBit(Keyboard_Control_Port ,Keyboard_Row_3)) {Delay(DELAY_COUNT) ; //延时消抖if(GPIO_ReadInputDataBit(Keyboard_Control_Port ,Keyboard_Row_3)) {Keyboard_Val = 11+i ;Keyboard_Change_Flag = 1 ;break ;}}}GPIO_SetBits(Keyboard_Control_Port ,Keyboard_Line) ;EXTI->PR = Keyboard_EXTI_Row3 ; //清除中断标志break ;case Keyboard_EXTI_Row4:GPIO_ResetBits(Keyboard_Control_Port ,Keyboard_Line) ;for(i=0 ;i<5 ;i++) //扫描方式判断按键{GPIO_SetBits(Keyboard_Control_Port ,(Keyboard_LineBase<<i)) ;if(GPIO_ReadInputDataBit(Keyboard_Control_Port ,Keyboard_Row_4)) {Delay(DELAY_COUNT) ; //延时消抖if(GPIO_ReadInputDataBit(Keyboard_Control_Port ,Keyboard_Row_4)) {Keyboard_Val = 16+i ;Keyboard_Change_Flag = 1 ;break ;}}}GPIO_SetBits(Keyboard_Control_Port ,Keyboard_Line) ;EXTI->PR = Keyboard_EXTI_Row4 ; //清除中断标志break ;default:break ;}}//注:使用时要使能AFIO时钟和EXTI9_5IRQ //。

野火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 gpio中断 引脚 电平状态 -回复

stm32 gpio中断 引脚 电平状态 -回复

stm32 gpio中断引脚电平状态-回复STM32是一款广泛使用的32位单片机系列,具备强大的性能和丰富的外设功能,其中GPIO(General Purpose Input/Output)引脚是其最基本的输入输出接口之一。

在STM32中,GPIO引脚可以通过中断机制来实现对电平状态的检测和响应。

本文将一步一步介绍STM32 GPIO中断引脚的原理、配置和应用场景。

一、引脚中断基本原理在STM32的GPIO引脚中,每个引脚都有自己的控制寄存器和状态寄存器。

通过设置相关的寄存器值,可以控制引脚的输入输出模式以及电平状态的检测。

当引脚的电平状态发生变化时,会触发GPIO中断并执行相应的中断服务程序。

1.1 引脚控制寄存器引脚控制寄存器用于配置引脚的输入输出模式、上拉/下拉电阻以及引脚输出的初始电平状态。

通过设置寄存器的位值,可以控制引脚的多种状态。

1.2 引脚状态寄存器引脚状态寄存器用于读取引脚的电平状态。

当引脚的电平状态发生变化时,状态寄存器的相应位会被置位,表示引脚中断发生。

1.3 外部中断控制器外部中断控制器用于管理GPIO引脚中断的触发条件和优先级。

可以通过设置相应的寄存器值,来配置引脚的触发模式(上升沿、下降沿、边沿等)以及中断的优先级。

二、引脚中断配置步骤为了使用GPIO引脚中断,需要按照以下步骤进行配置:2.1 GPIO引脚初始化首先,需要初始化GPIO引脚的功能和模式。

可以通过设置引脚控制寄存器的位值,来配置引脚的输入输出模式和上拉/下拉电阻。

例如,可以将引脚设置为输入模式,并启用上拉电阻,以便检测外部信号引脚的电平状态。

2.2 外部中断配置接下来,需要配置外部中断控制器,以确定引脚中断的触发条件和优先级。

可以通过设置中断控制寄存器的位值,来配置引脚的触发模式。

例如,可以将引脚设置为上升沿触发模式,表示仅在引脚电平上升沿触发中断。

2.3 中断服务程序编写当引脚的电平状态发生变化并触发中断时,系统会自动跳转到相应的中断服务程序执行相应的操作。

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