关于STM32按键中断总结

发布者:科技思想家最新更新时间:2021-06-22 来源: eefocus关键字:STM32  按键中断  外部中断 手机看文章 扫描二维码
随时随地手机看文章

stm32学习笔记——按键(外部中断)


目的:使用外部中断方式触发按键,会使用外部中断的操作


配置文件:#include "stm32f10x_gpio.h"


#include "stm32f10x_rcc.h"


#include "stm32f10x_exti.h"


寄存器:EXTI_IMR:高13位保留,低19位对应19个中断线编号,置1时开放该线上外部 中断


EXTI_EMR:高13位保留,低19位对应19个中断线编号,置1时开放该线上事 件中断


EXTI_RTSR:高13位保留,低19位对应19个中断线编号,置1时允许上升沿触 发事件和外部中断


EXTI_FTSR:高13位保留,低19位对应19个中断线编号,置1时允许下降沿触发事件和外部中断


EXTI_SWIER:高13位保留,低19位对应19个中断线编号,置1时允许软件中 断,引起EXTI_PR挂起位置1,在IMR或EMR允许时产生中断


EXTI_PR:发生触发请求时置1,向该位写1可清除标志位


结构体定义:


中断向量初始化结构体:


typedef struct


{


uint8_t NVIC_IRQChannel; //中断通道


uint8_t NVIC_IRQChannelPreemptionPriority;//抢占优先级


uint8_t NVIC_IRQChannelSubPriority; //次优先级


FunctionalState NVIC_IRQChannelCmd; / /使能中断


} NVIC_InitTypeDef;


其中宏定义有


typedef enum {DISABLE = 0, ENABLE = !DISABLE} FunctionalState;//使能宏定义


中断通道宏定义(注意中断线5以后的标号有变化)


EXTI0_IRQn = 6,


EXTI1_IRQn = 7,


EXTI2_IRQn = 8,


EXTI3_IRQn = 9,


EXTI4_IRQn = 10,


EXTI9_5_IRQn = 23,


EXTI15_10_IRQn = 40,


中断优先级设置表


中断初始化结构体


typedef struct


{


uint32_t EXTI_Line; //无符号32位变量设置中断线


EXTIMode_TypeDef EXTI_Mode; //中断模式


EXTITrigger_TypeDef EXTI_Trigger;//中断触发方式


FunctionalState EXTI_LineCmd; //中断使能


}EXTI_InitTypeDef;


其中有几个宏定义枚举量:


typedef enum//中断模式选择,外部中断和事件中断


{


EXTI_Mode_Interrupt = 0x00,


EXTI_Mode_Event = 0x04


}EXTIMode_TypeDef;


typedef enum //下降沿,上升沿,两者兼有


{


EXTI_Trigger_Rising = 0x08,


EXTI_Trigger_Falling = 0x0C,


EXTI_Trigger_Rising_Falling = 0x10


}EXTITrigger_TypeDef;

中断线定义


#define EXTI_Line0 ((uint32_t)0x00001)


#define EXTI_Line1 ((uint32_t)0x00002)


#define EXTI_Line2 ((uint32_t)0x00004)


#define EXTI_Line3 ((uint32_t)0x00008)


#define EXTI_Line4 ((uint32_t)0x00010)


#define EXTI_Line5 ((uint32_t)0x00020)


#define EXTI_Line6 ((uint32_t)0x00040)


#define EXTI_Line7 ((uint32_t)0x00080)


#define EXTI_Line8 ((uint32_t)0x00100)


#define EXTI_Line9 ((uint32_t)0x00200)


#define EXTI_Line10 ((uint32_t)0x00400)


#define EXTI_Line11 ((uint32_t)0x00800)


#define EXTI_Line12 ((uint32_t)0x01000)


#define EXTI_Line13 ((uint32_t)0x02000)


#define EXTI_Line14 ((uint32_t)0x04000)


#define EXTI_Line15 ((uint32_t)0x08000)


#define EXTI_Line16 ((uint32_t)0x10000)


#define EXTI_Line17 ((uint32_t)0x20000)


#define EXTI_Line18 ((uint32_t)0x40000)


#define EXTI_Line19 ((uint32_t)0x80000)


库函数:


NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup)


NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct) //中断向量初始化函数,参数:中断向量初始化结构体


EXTI_DeInit(void) 中断初始化为缺省值


EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct) 中断初始化为中断初始化结构体中的指定值


参数:中断初始化结构体


EXTI_StructInit(EXTI_InitTypeDef* EXTI_InitStruct)中断初始化为复位值 参数:中断初始化结构体


FlagStatus EXTI_GetFlagStatus(uint32_t EXTI_Line) 查询中断标志位,参数,无符号32位中断线标号,返回该中断线的中断标志位是否置1


EXTI_ClearFlag(uint32_t EXTI_Line) 清除中断标志位,参数,无符号32位中断线标号


ITStatus EXTI_GetITStatus(uint32_t EXTI_Line)查询中断标志位并查看是否被屏蔽,参数,无符号32位中断线标号,返回中断线上标志位是否置1而且未被屏蔽


EXTI_ClearITPendingBit(uint32_t EXTI_Line)清空中断标志位,与之前那个完全相同,参数,无符号32位中断线标号


GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource),这个函数属于GPIO的配置,所以单独列写,用于指定IO口作为中断的输入口,这个函数的参数有如下宏定义:


#define GPIO_PinSource0 ((uint8_t)0x00)


#define GPIO_PinSource1 ((uint8_t)0x01)


#define GPIO_PinSource2 ((uint8_t)0x02)


#define GPIO_PinSource3 ((uint8_t)0x03)


#define GPIO_PinSource4 ((uint8_t)0x04)


#define GPIO_PinSource5 ((uint8_t)0x05)


#define GPIO_PinSource6 ((uint8_t)0x06)


#define GPIO_PinSource7 ((uint8_t)0x07)


#define GPIO_PinSource8 ((uint8_t)0x08)


#define GPIO_PinSource9 ((uint8_t)0x09)


#define GPIO_PinSource10 ((uint8_t)0x0A)


#define GPIO_PinSource11 ((uint8_t)0x0B)


#define GPIO_PinSource12 ((uint8_t)0x0C)


#define GPIO_PinSource13 ((uint8_t)0x0D)


#define GPIO_PinSource14 ((uint8_t)0x0E)


#define GPIO_PinSource15 ((uint8_t)0x0F)




#define GPIO_PortSourceGPIOA ((uint8_t)0x00)


#define GPIO_PortSourceGPIOB ((uint8_t)0x01)


#define GPIO_PortSourceGPIOC ((uint8_t)0x02)


#define GPIO_PortSourceGPIOD ((uint8_t)0x03)


#define GPIO_PortSourceGPIOE ((uint8_t)0x04)


#define GPIO_PortSourceGPIOF ((uint8_t)0x05)


#define GPIO_PortSourceGPIOG ((uint8_t)0x06)






注意:FlagStatus EXTI_GetFlagStatus(uint32_t EXTI_Line)只是检测是否产生了中断标志位,并不一定响应中断


ITStatus EXTI_GetITStatus(uint32_t EXTI_Line)出了检测是否中断标志位是否置1外还确认是不是中断不被屏蔽,会响应中断


EXTI_ClearITPendingBit(uint32_t EXTI_Line)与EXTI_ClearFlag(uint32_t EXTI_Line) 功能是相同的,都是清除中断标志位的。


程序代码分析(代码出自FIRE)


static void NVIC_Configuration(void) // 配置中断向量


{


NVIC_InitTypeDef NVIC_InitStructure; //结构体定义中断向量结构体



NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);


NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;//设置中断向量通道


NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//设置抢占优先级


NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;//设置子优先级


NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//中断向量通道使能


NVIC_Init(&NVIC_InitStructure);


}


void EXTI_PA0_Config(void)//中断配置函数


{


GPIO_InitTypeDef GPIO_InitStructure;


EXTI_InitTypeDef EXTI_InitStructure;//结构体定义中断结构体


RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO,ENABLE); //开启GPIOA时钟和第二功能时钟


NVIC_Configuration();//中断向量配置


GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;


GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; // 上拉输入


GPIO_Init(GPIOA, &GPIO_InitStructure);


GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0); //选择A0为中断口


EXTI_InitStructure.EXTI_Line = EXTI_Line0;//中断线0


EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//中断模式


EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿中断


EXTI_InitStructure.EXTI_LineCmd = ENABLE;//中断使能


EXTI_Init(&EXTI_InitStructure); //调用中断初始化函数


}


开放总中断和关闭总中断的宏定义,中断前需调用


#define CLI() __set_PRIMASK(1)/


#define SEI() __set_PRIMASK(0)/


中断服务函数


void EXTI0_IRQHandler(void)


{


if(EXTI_GetITStatus(EXTI_Line0) != RESET) //检查中断是否开启


{


LED1_TOGGLE;//进入中断则led取反


EXTI_ClearITPendingBit(EXTI_Line0); //清除中断标志位


}


}



小总结:1、配置中断首先配置中断向量,再配置中断,配置中断时要调用中断向量的配置,并在GPIO中配置中断口的选择


2、中断函数开始时需确认中断是否响应,结束时需要清除中断标志位


3、Stm32有19个中断线,其中16个为IO口外部中断,每一个对应IO口编号(A...E),一共有80个中断,其它的3个 EXTI线16连接到PVD输出 EXTI线17连接到RTC闹钟事件 EXTI线18连接到USB唤醒事件


4、中断挂起寄存器实际上就是中断标志位寄存器


5、中断服务函数在stm32f10x_it.c 文件中定义,这里定义了一些基本的中断服务函数


关键字:STM32  按键中断  外部中断 引用地址:关于STM32按键中断总结

上一篇:144个stm32开发相关的问题,看你了解几个
下一篇:带你走进STM32

推荐阅读最新更新时间:2024-11-13 13:04

STM32单片机(10) 数码管输出实验[补] 静态(共阳)+动态(共阴)
注:使用普中科技开发板测试时,需要拔掉Boot1插口 参考手册、电路图等参见 STM32单片机学习(1) 总记 学习资料+参考手册+LED灯 静态数码管实验 /******************************************************************************* * * 软件功能: 静态数码管实验(软件延时方式) * *******************************************************************************/ #include stm32f10x.h #include de
[单片机]
判断STM32 GPIO输入口的输入状态(高电平或低电平)
以PE2和PE4为例: ① 判断单个端口是否为高电平: if(GPIOE- IDR& GPIO_IDR_IDR2) { 函数体; } 当PE2端口为高电平时,if条件为真;当PE2口为低电平时,if条件为假; ② 判断单个端口是否为低电平: if((~GPIOE- IDR)& GPIO_IDR_IDR2) { 函数体; } 分析:首先通过 &GPIO_IDR_IDR屏蔽掉PE2之外的其他PE口。当PE2为高电平时,GPIO-〉IDR的bit2为‘1’,取反后为‘0’,因此条件为假;当PE2为低电平时,GPIO-〉IDR的bit2为‘0’,取反后为‘1’,因此条件为真;通过此方法
[单片机]
采用STM32 单片机的太阳能LED街灯解决方案
随着化石类能源的日益减少,以及温室气体的过度排放导致全球变暖问题越来越受到重视,人们一方面在积极开发各类可再生新能源,另一方面也在倡导节能减排的绿色环保技术。太阳能作为取之不尽、用之不竭的清洁能源,成为众多可再生能源的重要代表;而在照明领域,寿命长、节能、安全、绿色环保、色彩丰富、微型化的LED固态照明也已被公认为世界一种节能环保的重要途径。太阳能-LED街灯同时整合了这两者的优势,利用清洁能源以及高效率的LED实现绿色照明。 本文介绍的太阳能-LED街灯方案,能自动检测环境光以控制路灯的工作状态,最大功率点追踪(MPPT)保证最大太阳能电池板效率,恒电流控制LED,并带有蓄电池状态输出以及用户可设定LED工作时间等功能。 系统结
[电源管理]
采用<font color='red'>STM32</font> 单片机的太阳能LED街灯解决方案
STM32系列第15篇--灵活的静态存储控制器FSMC
FSMC特性 FSMC管理1GB空间,拥有4个Bank连接外部存储器 每个Bank有独立的片选信号 每个Bank有独立的时序配置 同步批量传输访问最高频率可达60MHz fCLK= HCLK /2 静态地址映射存储器支持的存储器类型 SRAM PSRAM NOR/ONENAND ROM LCD接口-支持8080和6800模式 NANDFlash和16位PCCard,NAND Flash具有硬件ECC 结构 FSMC分为四块BANK,每块各占256M字节空间,每块分为四个区,每个区占64M。 NOR/PSRAM 256M字节的空间需要28根地址线寻址 HADDR是内部AHB地址总线 HADDR 来自外部存储器
[单片机]
<font color='red'>STM32</font>系列第15篇--灵活的静态存储控制器FSMC
一种基于STM32和FPGA的多轴运动控制器的设计与实现
引言 数控系统在工矿领域已得到广泛应用,计算机数控系统通过对数字化信息的处理和运算,并转化成脉冲信号,实现对电机的控制,进而控制数控机床动作和零件加工。随着嵌入式技术的发展,我们可以设计规模更小,成本更低,功能更特定的嵌入式系统来完成传统计算机数控系统所完成的工作。 1、设计方案 本系统以嵌入式处理器STM32和FPGA芯片为核心,运动控制方案中的处理部分都放在FPGA内部实现。这是1种硬件软化的方案,即具有软件可编程、可重构的特点,又有硬件那样高性能、高可靠、高一致性的优点。其系统原理框图如图1所示。 图1 系统原理 STM32从SD卡中读取数据文件并进行相关算法处理,通过键盘扫描电路设置系统加减速的初始速度、最大速度、
[单片机]
一种基于<font color='red'>STM32</font>和FPGA的多轴运动控制器的设计与实现
如何使用STM32单片机设置PWM输出
环境: 主机:XP 开发环境:MDK4.23 MCU:STM32F103CBT6 说明: 使用内部8M晶振,倍频到64M供给TIM3定时器,PA6(通道1)上产生640K,50%方波 源代码: 初始化时钟: //初始化RCC时钟 voidinit_rcc(void) { //将外设RCC寄存器重设为缺省值 RCC_DeInit(); //内部晶振使能 RCC_HSICmd(ENABLE); //等待工作稳定 while(RCC_GetFlagStatus(RCC_FLAG_HSIRDY)==RESET); //LSI的启动,提供给看门狗时钟 RCC_LSICmd(ENABLE);//打开LSI while(RCC_GetF
[单片机]
如何使用<font color='red'>STM32</font>单片机设置PWM输出
STM32 TIM2重映射
stm32的TIM2的端口使用组合有下面四种: 1.当不重映射时,默认TIM2四个的IO口是PA0、PA1、PA2、PA3 2.要使用PA15、PB3、PA2、PA3的端口组合,要调用下面的语句进行部分重映射: RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //重映射必须要开AFIO时钟 GPIO_PinRemapConfig(GPIO_PartialRemap1_TIM2, ENABLE); 3.要使用PA0、PA1、PB10、PB11的端口组合,要调用下面的语句进行部分重映射: RCC_APB2PeriphClockCmd(RCC_APB2Perip
[单片机]
stm32教你如何编译出LIB文件
这个是生成LIB的技巧.也许大家在网上看到某些程序会发现,他们用这个方式来包含STM32 的库文件: 而不是像DX32的例程那样一堆C: 那么,本技巧篇例程就是教大家怎么生成那个.LIB 的文件的. 首先打开本程序,大家看到的整个工程就只有库文件: 因为这是把STM32的函数库编译成库的形式,所以你只需要包含函数库就行. 然后注意一点,stm32f10x_conf.h 文件中,所有的include都要开放 #include stm32f10x_adc.h #include stm32f10x_bkp.h #include stm32f10x_can.h #include stm32f10x_crc.h #i
[单片机]
<font color='red'>stm32</font>教你如何编译出LIB文件
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
更多往期活动

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved