历史上的今天
返回首页

历史上的今天

今天是:2025年01月09日(星期四)

正在发生

2019年01月09日 | STM32学习笔记一一外部中断

2019-01-09 来源:eefocus

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_Line15


EXTIMode_TypeDef EXTI_Mode;//中断模式,可选为中断 EXTI_Mode_Interrupt 和事件 EXTI_Mode_Event。


EXTITrigger_TypeDef EXTI_Trigger;//触发方式,可以是下降沿触发 EXTI_Trigger_Falling,上升沿触发 EXTI_Trigger_Rising,或者任意电平(上升沿和下降沿)触发EXTI_Trigger_Rising_Falling


FunctionalState 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; //子优先级 2

NVIC_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——外部中断


推荐阅读

史海拾趣

E-Mark Inc公司的发展小趣事

ABC公司专注于研发先进的驾驶辅助系统。为了确保产品的合规性和市场竞争力,ABC公司主动寻求E-Mark认证。在认证过程中,公司不断优化产品设计,提高产品性能,成功获得了E-Mark认证。凭借这一认证,ABC公司的产品在欧洲市场得到了广泛应用,公司也因此获得了技术革新的声誉和市场份额的扩大。

BULGIN公司的发展小趣事

随着技术的不断进步和市场的扩大,BULGIN公司在20世纪60年代成为了当时世界上最大的、产品线最为齐全的电子零件制造商之一。公司保持着快速的创新与发展,BULGIN品牌开始覆盖多国市场,为全球各地的客户提供优质的产品和服务。

Hilscher Gesellschaft für Systemautomation mbH公司的发展小趣事

随着在高压电源领域的深入发展,HVPSI逐渐参与到行业标准的制定工作中。公司凭借其在技术上的深厚积累和市场经验,为行业标准的制定提供了宝贵的建议和数据支持。这些标准的出台不仅规范了市场秩序,也进一步巩固了HVPSI在行业内的领先地位。

Global Components & Controls公司的发展小趣事
电位器(RP1和RP2)的旋轴损坏或引脚间短路也可能导致台灯无法调节亮度。此时需要更换电位器或修复其旋轴。
Base Two (2) Systems公司的发展小趣事

品质是Base Two (2) Systems的生命线。公司始终坚持严格的质量管理体系,从原材料采购到生产制造的每一个环节都进行严格把控。这种对品质的执着追求,使得公司的产品在市场上赢得了客户的广泛信赖。许多客户与公司建立了长期稳定的合作关系,成为公司发展的重要支撑。

全鹏(CHAMPION)公司的发展小趣事

随着全鹏在巴西市场的稳固地位,公司决定在2006年创立C3 TECH品牌,以进一步提升其品牌影响力。C3 TECH品牌的创立不仅增强了全鹏在巴西市场的竞争力,还为公司带来了更多的商机。通过精心策划的市场营销活动和优质的产品质量,C3 TECH品牌迅速获得了当地消费者的认可,并在市场上树立了良好的口碑。

问答坊 | AI 解惑

LED信号机检测报警仪的设计

小弟毕设是这个题目,谁能给点资料啊,急啊,要开题了都,还没有眉目…

查看全部问答>

深圳清华远见《WinCE系统和驱动开发6天培训》价值3200元现1200元转让!

在微软嵌入式研讨会抽奖得来。个人用不上,所以低价转让,特意咨询过清华远见方面是可以转让的。 联系方式:oywb168##TOM.com(请替换##为@),QQ: 39222503,有效期至2010年6月30日 培训地点深圳,课程安排转自:http://www.farsight.com.cn/cour ...…

查看全部问答>

WINCE怎么能读写SD卡的六个寄存器?

WINCE怎么能读写SD卡的六个寄存器? 那位大哥有程序吗?  或指引一下。    给个方向 …

查看全部问答>

usb通讯的问题(很菜)

我想PC通过usb与PDA通讯传文件,但不要利用activesync,请教各位有什么办法不?网上有没有这方面的示例? PDA的OS是wince4.2的。…

查看全部问答>

问一个中断调用主函数变量的问题

  union     Bit_str {     vu8 BitValue[3];     vu32 WordValue;  }ReadData;是定义在主函数main中的共用体,现在需要在_ ...…

查看全部问答>

TI杯聲音定位討論 185056997

TI杯聲音定位討論 185056997…

查看全部问答>

请教一下,AD 转换结果狂跳的问题

uint mega16_ad() {          uint addata;          DDRA=0X00;          PORTA=0X00;          cli();   &nbs ...…

查看全部问答>

大伙用的是什么样的热风枪?安泰信的吗?

现在很多实验室甚至连电烙铁都没有,有些人就是张哈弗式的人物 只会说不会做。一些基本的工具是应该具备的,大伙用的电烙铁和热风枪 一般是什么牌子的,那种牌子的好用,安泰信还是快克?或是别的什么。 …

查看全部问答>