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 上的中断标志位
}
}
使用按键进行外部中断的时候,一般都需要进行按键延时消抖以及松手检测的相关处理,中断函数可以参看以下代码:
void exti2_irqhandler(void)
{
delay_ms(10);//延时消抖
if(key2==0) //按键真的被按下
{
led0=!led0;
}
while(key2!=0);//等待松手
exti_clearitpendingbit(exti_line2); //清楚中断标志位
}
当然,如果你的按键是允许长按功能的,那么就进行别的逻辑操作,这里不作研究。
在哪里可以找到Netflix代码
千万别乱买儿童智能手表,因为还有这些危害你不知道
远传积极布局5G与NB-IoT,日前已提前完成台湾地区NB-IoT网络布建
亚马逊云科技与多家企业一同打造“云上新故事”
华为MateBookXPro体验 到底怎么样
每一个GPIO如何配置成一个外部中断触发源
新型平板显示器介绍
浅谈12芯多模光缆,12芯多模光纤,室内室外12芯多模光缆
西门子与GlobalFoundries合作提供可信硅光子验证
机架式服务器行业定义、分类及特征
预计2018年中国工业机器人减速器需求将超过40万台,市场容量将超过30亿元
贸泽电子启动2021 Empowering Innovation Together计划全新播客版块探索5G技术
汽车车内数据接收智能化新时代
如何在CP2102上使用ESP-12分支板
C6CN标准版智能家居摄像机你确定你不看一下?
AirTag 即将发布,iOS 14.3 隐藏项目揭示 “查找”功能
电瓶修复技术-电池好坏可以看小时率高低吗?「问答」
智能化数控机床的特点
使用AI来为实时受损的助听器优化听觉帮助的方法
oppor11、iphone7plus对比评测:颜值和拍照的较量