STM32学习笔记一一外部中断

来源:互联网 发布:js删除数组里面空格 编辑:程序博客网 时间:2024/05/16 17:56

1.STM32 外部中断简介

STM32 的每个 IO 都可以作为外部中断的中断输入口。 STM32F103 的中断控制器支持 19 个外部中断/事件请求。每个中断设有状态位,每个中断/事件都有独立的触发和屏蔽设置。代码主要分布在固件库的 stm32f10x_exti.h 和 stm32f10x_exti.c 文件。

STM32F103的 19 个外部中断为:

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

线 16:连接到 PVD 输出。

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

线 18:连接到 USB 唤醒事件

触发方式:STM32 的外部中断是通过边沿来触发的,不支持电平触发。

2.外部中断分组

STM32 的每一个GPIO都能配置成一个外部中断触发源,STM32 通过根据引脚的序号不同将众多中断触发源分成不同的组,比如:PA0,PB0,PC0,PD0,PE0,PF0,PG0为第一组,那么依此类推,我们能得出一共有16 组,STM32 规定,每一组中同时只能有一个中断触发源工作,那么,最多工作的也就是16个外部中断。

这里写图片描述

3.中断的初始化函数 EXTI_Init()

void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct);
范例:

EXTI_InitTypeDef EXTI_InitStructure;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_InitStruct 中指定的参数初始化外设 EXTI 寄存器

结构体 EXTI_InitTypeDef 的成员变量:

typedef struct{uint32_t EXTI_Line;//中断线的标号,取值范围为EXTI_Line0~EXTI_Line15EXTIMode_TypeDef EXTI_Mode;//中断模式,可选为中断 EXTI_Mode_Interrupt 和事件 EXTI_Mode_Event。EXTITrigger_TypeDef EXTI_Trigger;//触发方式,可以是下降沿触发 EXTI_Trigger_Falling,上升沿触发 EXTI_Trigger_Rising,或者任意电平(上升沿和下降沿)触发EXTI_Trigger_Rising_FallingFunctionalState EXTI_LineCmd;//使能中断线}EXTI_InitTypeDef;

4.设置 NVIC 中断优先级
范例:

NVIC_InitTypeDef NVIC_InitStructure;NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn; //使能按键外部中断通道NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //抢占优先级 2,NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02; //子优先级 2NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道NVIC_Init(&NVIC_InitStructure); //中断优先级分组初始化

5.中断服务函数

中断服务函数的名字是在 MDK 中事先有定义的, STM32 的 IO 口外部中断函数只有 6 个。

IO 口外部中断函数 中断线 EXTI0_IRQHandler 中断线 0 EXTI1_IRQHandler 中断线 1 EXTI2_IRQHandler 中断线 2 EXTI3_IRQHandler 中断线 3 EXTI4_IRQHandler 中断线 4 EXTI9_5_IRQHandler 中断线 5-9 EXTI15_10_IRQHandler 中断线 10-15

注:

在编写中断服务函数的时候会经常使用到两个函数,第一个函数是判断某个中断线上的中断是否发生(标志位是否置位):
ITStatus EXTI_GetITStatus(uint32_t EXTI_Line);
这个函数一般使用在中断服务函数的开头判断中断是否发生。

另一个函数是清除某个中断线上的中断标志位:
void EXTI_ClearITPendingBit(uint32_t EXTI_Line);
这个函数一般应用在中断服务函数结束之前,清除中断标志位。

6.使用 IO 口外部中断的一般步骤

1)初始化IO口为输入。

设置作为外部中断输入的IO口的状态,可以设置为上拉 / 下拉输入 / 浮空输入,但浮空的时候外部一定要带上拉,或者下拉电阻。否则可能导致中断不停的触发。在干扰较大的地方,就算使用了上拉/下拉,也建议使用外部上拉/下拉电阻,这样可以一定程度防止外部干扰带来的影响。

2)开启IO口复用时钟,设置IO口与中断线的映射关系。

STM32的IO口与中断线的对应关系需要配置外部中断配置寄存器EXTICR,这样我们要先开启复用时钟,然后配置IO口与中断线的对应关系。才能把外部中断与中断线连接起来。

3)开启与该IO口相对的线上中断/事件,设置触发条件。

这一步,我们要配置中断产生的条件,STM32可以配置成上升沿触发,下降沿触发,或者任意电平变化触发,但是不能配置成高电平触发和低电平触发。这里根据自己的实际情况来配置。同时要开启中断线上的中断,这里需要注意的是:如果使用外部中断,并设置该中断的EMR位的话,会引起软件仿真不能跳到中断,而硬件上是可以的。而不设置EMR,软件仿真就可以进入中断服务函数,并且硬件上也是可以的。建议不要配置EMR位。

4)配置中断分组(NVIC),并使能中断。

这一步,我们就是配置中断的分组,以及使能,对STM32的中断来说,只有配置了NVIC的设置,并开启才能被执行,否则是不会执行到中断服务函数里面去的。

5)编写中断服务函数。

这是中断设置的最后一步,中断服务函数,是必不可少的,如果在代码里面开启了中断,但是没编写中断服务函数,就可能引起硬件错误,从而导致程序崩溃!所以在开启了某个中断后,一定要记得为该中断编写服务函数。在中断服务函数里面编写你要执行的中断后的操作。

7.例程分析:

(1)外部中断初始化函数

void EXTIX_Init(void){      EXTI_InitTypeDef EXTI_InitStructure;      NVIC_InitTypeDef NVIC_InitStructure;      RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//外部中断,需要使能AFIO时钟      KEY_Init();//初始化按键对应io模式    //GPIOC.5 中断线以及中断初始化配置    GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource5);    EXTI_InitStructure.EXTI_Line=EXTI_Line5;    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;     EXTI_InitStructure.EXTI_Trigger =        EXTI_Trigger_Falling;//下降沿触发    EXTI_InitStructure.EXTI_LineCmd = ENABLE;    EXTI_Init(&EXTI_InitStructure);  //根据 EXTI_InitStruct中指定的参数初始化外设EXTI寄存器    NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;            //使能按键所在的外部中断通道    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;    //抢占优先级2     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;                   //子优先级1    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                             //使能外部中断通道    NVIC_Init(&NVIC_InitStructure);       //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器 }

(2) 中断服务函数

void EXTI0_IRQHandler(void){  delay_ms(10);    //消抖    if(WK_UP==1)    {             LED0=!LED0;        LED1=!LED1;     }    EXTI_ClearITPendingBit(EXTI_Line0);  //清除EXTI0线路挂起位}

参考:

1.STM32-外部中断实验

2.STM32-外部中断学习笔记

3.STM32之EXTI——外部中断

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 宝宝语言发育迟缓怎么办 两岁宝宝叛逆怎么办 宝宝不愿意学说话怎么办 一岁多宝宝嘴臭怎么办 三岁多了不说话怎么办 宝宝说话夹舌头怎么办 两岁不会说话怎么办 三周岁不会说话怎么办 两岁半宝宝说话结巴怎么办 孩子咬字不清怎么办 夜里睡觉腿抽筋怎么办 宝宝脾气很不好怎么办 4岁不讲话怎么办 宝宝就是不说话怎么办 说话伤害了朋友怎么办 小孩不开口说话怎么办 左胸口比右胸高怎么办 小孩动不动就生气怎么办 小孩生气手抽筋怎么办 孩子玩电脑游戏成瘾怎么办 加减法孩子学不会怎么办 孩子学习学不会怎么办 脸部五官太小怎么办 小班教案我该怎么办 鼠标不能拖拽怎么办 病了怎么办教学反思 想开水果店没经验怎么办 婴儿听力筛查未通过怎么办 怀孕吐到胃出血怎么办 hp打印机颜色浅怎么办 爱普生打印机没有红色怎么办 孕吐吐到胃出血怎么办 孩子不会写2怎么办 口渴了怎么办大班教案 小班健康跌倒了怎么办 刷油漆有纹路怎么办 纯白门会发黄怎么办 发现小孩子偷钱怎么办 青春期孩子偷钱怎么办 孩子偷钱屡教不改怎么办 孩子经常偷钱怎么办