做单片机设计,STM32 GPIO外部中断你必须知道

一、stm32中断分组:
stm32 的每一个gpio都能配置成一个外部中断触发源,这点也是 stm32 的强大之处。stm32 通过根据引脚的序号不同将众多中断触发源分成不同的组,比如:pa0,pb0,pc0,pd0,pe0,pf0,pg0为第一组,那么依此类推,我们能得出一共有16 组,stm32 规定,每一组中同时只能有一个中断触发源工作,那么,最多工作的也就是16个外部中断。stm32f103 的中断控制器支持 19 个外部中断/事件请求。每个中断设有状态位,每个中断/事件都有独立的触发和屏蔽设置。stm32f103 的19 个外部中断为:
线 0~15:对应外部 io 口的输入中断。线 16:连接到 pvd 输出。
线 17:连接到 rtc 闹钟事件。
线 18:连接到 usb 唤醒事件。
二:外部中断的配置过程:
1、配置触发源gpio口:
因为gpio口作为触发源使用,所以将gpio口配置成输入模式,触发模式有以下几种:
a.gpio_mode_ain ,模拟输入(adc模拟输入,或者低功耗下省电)
b.gpio_mode_in_floating ,浮空输入
c.gpio_mode_ipd ,带下拉输入
d.gpio_mode_ipu ,带上拉输入 
gpio_inittypedef gpio_initstructure;//定义结构体
rcc_apb2periphclockcmd(rcc_apb2periph_gpioe,enable);//使能时钟
gpio_initstructure.gpio_pin = gpio_pin_2;//选择io口 pe2
gpio_initstructure.gpio_mode = gpio_mode_ipu;//设置成上拉输入
gpio_init(gpioe, &gpio_initstructure);//使用结构体信息进行初始化io口
2、使能afio复用时钟功能:
rcc_apb2periphclockcmd(rcc_apb2periph_afio,enable); 
3、将gpio口与中断线映射起来:
gpio_extilineconfig(gpio_portsourcegpioe,gpio_pinsource2);
4、中断线上进行中断初始化: 
exti_inittypedef exti_initstructure;//定义初始化结构体
exti_initstructure.exti_line=exti_line2; //中断线的标号 取值范围为exti_line0~exti_line15
exti_initstructure.exti_mode = exti_mode_interrupt;//中断模式,可选值为中断 exti_mode_interrupt 和事件 exti_mode_event。
exti_initstructure.exti_trigger = exti_trigger_falling;//触发方式,可以是下降沿触发 exti_trigger_falling,上升沿触发 exti_trigger_rising,或者任意电平(上升沿和下降沿)触发exti_trigger_rising_falling
exti_initstructure.exti_linecmd = enable;
exti_init(&exti_initstructure);//根据结构体信息进行初始化
5、中断优先级配置:
nvic_inittypedef nvic_initstructure;//定义结构体
nvic_initstructure.nvic_irqchannel = exti2_irqn; //使能外部中断所在的通道
nvic_initstructure.nvic_irqchannelpreemptionpriority = 0x02; //抢占优先级 2,
nvic_initstructure.nvic_irqchannelsubpriority = 0x02; //子优先级 2
nvic_initstructure.nvic_irqchannelcmd = enable; //使能外部中断通道
nvic_init(&nvic_initstructure); //根据结构体信息进行优先级初始化
6、外部中断服务函数的编写:
外部中断函数分别为:
export exti0_irqhandler
export exti1_irqhandler
expor t exti2_irqhandler
export exti3_irqhandler
export exti4_irqhandler
export exti9_5_irqhandler
export exti15_10_irqhandler
中断线 0-4 每个中断线对应一个中断函数,中断线 5-9 共用中断函数 exti9_5_irqhandler,中断线 10-15 共用中断函数 exti15_10_irqhandler。 
void exti2_irqhandler(void)
{
if(exti_getitstatus(exti_line2)!=reset)//判断某个线上的中断是否发生
{
 中断逻辑…
 exti_clearitpendingbit(exti_line2); //清除 line 上的中断标志位
}
}
三、关于使用gpio口接按键进行外部中断的配置说明:
使用按键进行外部中断的时候,一般都需要进行按键延时消抖以及松手检测的相关处理,中断函数可以参看以下代码:
void exti2_irqhandler(void)
{
 delay_ms(10);//延时消抖
 if(key2==0) //按键真的被按下
{
 led0=!led0;
}
 while(key2!=0);//等待松手
 exti_clearitpendingbit(exti_line2); //清楚中断标志位
}
当然,如果你的按键是允许长按功能的,那么就进行别的逻辑操作,这里不作研究。

瑞萨电子发布了业界第一款使用28nm工艺的集成闪存微控制器
Omdia发布《5G R16标准和芯片推动垂直行业应用智能化升级》白皮书
小米6最新消息:小米6评测,安兔兔跑分高达17.3万分,多项功能解析
AC/DC 解决方案如何实现空间受限应用的效率提升
浅析无人机图像识别视觉精准降落技术
做单片机设计,STM32 GPIO外部中断你必须知道
联想Z5ProGT评测 滑屏全面屏也会带来更多结构设计上的妥协
2018人才趋势:区块链是最大风口
NVIDIA宣超强GPU芯片Pascal,预计2016年推出
开关稳压电源和线性稳压电源的详细介绍
可穿戴等智能设备出路在哪?做物联网入口
【CDD】诊断数据库创建速成班-课堂(二)
Xilinx全局时钟的使用和DCM模块的使用
位移传感器原理及基础知识
pcb设计覆铜方面需要注意哪些问题
基于区块链技术的软件项目ECOS将解决全球食品饮料行业的伪劣问题
宝马用固态激光雷达传感器和计算机视觉技术推出无人驾驶
Dish启动Boost Infinite网站提供无限的5G服务
万用表查看整流桥好坏的方法
芯和的先进封装建模仿真平台Metis
s