历史上的今天
返回首页

历史上的今天

今天是:2024年12月29日(星期日)

2018年12月29日 | stm32学习笔记(四)外部中断

2018-12-29 来源:eefocus

#include "exti.h"

#include "led.h"

#include "key.h"

#include "delay.h"

#include "usart.h"

 

//////////////////////////////////////////////////////////////////////////////////  

//本程序只供学习使用,未经作者许可,不得用于其它任何用途

//Mini STM32开发板

//外部中断 驱动代码    

//正点原子@ALIENTEK

//技术论坛:www.openedv.com

//修改日期:2010/12/01  

//版本:V1.0

//版权所有,盗版必究。

//Copyright(C) 正点原子 2009-2019

//All rights reserved   

//////////////////////////////////////////////////////////////////////////////////   

 

 

//外部中断初始化函数

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寄存器

 

    //GPIOA.15   中断线以及中断初始化配置

  GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource15);

 

  EXTI_InitStructure.EXTI_Line=EXTI_Line15;

  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寄存器

 

    //GPIOA.0   中断线以及中断初始化配置

  GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);

 

    EXTI_InitStructure.EXTI_Line=EXTI_Line0;

  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;

  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;

  EXTI_InitStructure.EXTI_LineCmd = ENABLE;

  EXTI_Init(&EXTI_InitStructure); //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器

 

 

 

  NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; //使能按键所在的外部中断通道0-4有单独的中断服务函数

  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //抢占优先级2 

  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02; //子优先级1

  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道

  NVIC_Init(&NVIC_InitStructure);    //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器


NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn; //使能按键所在的外部中断通道 5-9共用一个中断服务函数

  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //抢占优先级2, 

  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01; //子优先级1

  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道

  NVIC_Init(&NVIC_InitStructure); 

 

 

    NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn; //使能按键所在的外部中断通道 9-15共用一个中断服务函数

  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //抢占优先级2, 

  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00; //子优先级1

  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道

  NVIC_Init(&NVIC_InitStructure); 

 

}

 

 

void EXTI0_IRQHandler(void)

{

  delay_ms(10);    //消抖

if(WK_UP==1)

{   

LED0=!LED0;

LED1=!LED1;

}

EXTI_ClearITPendingBit(EXTI_Line0);  //清除EXTI0线路挂起位

}

 void EXTI9_5_IRQHandler(void)

{

delay_ms(10);   //消抖  

if(KEY0==0) {

LED0=!LED0;

}

  EXTI_ClearITPendingBit(EXTI_Line5);    //清除LINE5上的中断标志位  

}

 

 

void EXTI15_10_IRQHandler(void)

{

  delay_ms(10);    //消抖  

  if(KEY1==0) {

LED1=!LED1;

}

EXTI_ClearITPendingBit(EXTI_Line15);  //清除LINE15线路挂起位

}


STM32中,每一个GPIO都可以触发一个外部中断,但是,GPIO的中断是以组位一个单位的,同组间的外部中断同一时间只能使用一个。比如说,PA0,PB0,PC0,PD0,PE0,PF0,PG0这些为1组,如果我们使用PA0作为外部中断源,那么别的就不能够再使用了,在此情况下,我们智能使用类似于PB1,PC2这种末端序号不同的外部中断源。每一组使用一个中断标志EXTIx。EXTI0 – EXTI4这5个外部中断有着自己的单独的中断响应函数,EXTI5-9共用一个中断响应函数,EXTI10-15共用一个中断响应函数。


中断配置



      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寄存器


 

    


S TM32中断控制器支持20个外部中断/事件请求:    线0-15:外部IO口输入中断


     线16:连接到PVD输出

     线17:连接到RTC闹钟事件

     线18:连接到USB唤醒事件


     线19:Ethernet Wakeup event




中断模式 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;




中断优先级配置

NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; //使能按键所在的外部中断通道0-4有单独的中断服务函数

  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //抢占优先级2 

  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02; //子优先级1

  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道

  NVIC_Init(&NVIC_InitStructure);    //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器



中断服务函数


EXTI0 – EXTI4这5个外部中断有着自己的单独的中断响应函数,EXTI5-9共用一个中断响应函数,EXTI10-15共用一个中断响应函数。


抢占优先级和响应优先级

STM32 的中断向量具有两个属性,一个为抢占属性,另一个为响应属性,

其属性编号越小,表明它的优先级别越高。


当两个中断同时到来,先响应抢占优先级搞得中断。


当两个中断抢占优先级一样,先进入响应优先级高的中断。




EXTI_ClearITPendingBit(EXTI_Line5)


中断函数响应完中断之后,要清除中断线路挂起位

推荐阅读

史海拾趣

Great American Electronics公司的发展小趣事

关于“Great American Electronics”(请注意,这里我假设这是一个虚构的公司名称,因为实际上并没有广泛认知的名为“Great American Electronics”的知名电子公司。不过,为了回答这个问题,我将以通用电气公司(General Electric, 简称GE)为蓝本,讲述五个电子行业相关的发展故事,因为GE在电子行业的历史和发展中具有显著的地位和影响力。)

1. 电气时代的开创者

故事背景:通用电气公司(GE)的起源可以追溯到美国发明家托马斯·阿尔瓦·爱迪生。1878年,爱迪生成立了爱迪生电灯公司,并在新泽西州的门洛帕克实验室发明了第一只商用白炽灯。1882年,爱迪生照明公司在纽约建造了美国第一个中央发电站,开启了电气时代。尽管爱迪生并未直接参与GE的成立,但他的贡献为GE的后续发展奠定了坚实的基础。

关键事件:爱迪生将电力商业化,使电力成为了一种可以广泛应用的能源形式。这一创举不仅改变了人们的生活方式,也为GE在电气行业的崛起提供了历史性的机遇。

2. 合并与转型的里程碑

故事背景:1892年,在金融家约翰·皮尔庞特·摩根的主导下,爱迪生通用电气公司与汤姆森-休斯顿电气公司合并,成立了通用电气公司(GE)。这一合并标志着GE从单一的电力业务向多元化发展的转型。

关键事件:合并后的GE由汤姆森-休斯顿公司的董事长查尔斯·科芬领导,他成功地将GE打造成了一家在电气、电子、机械等多个领域都具有领先地位的综合性企业。科芬的管理理念和组织结构设计为GE日后的长期发展奠定了坚实的基础。

3. 科研与创新的典范

故事背景:在查尔斯·科芬的领导下,GE建立了美国第一家研究实验室,并致力于推动科技创新和产品研发。这一举措使得GE在多个技术领域取得了重大突破。

关键事件:1895年,GE建造了当时世界上最大的电气火车头和功率高达800KW的变压器;1896年,GE设计了X射线成像仪,开启了医疗成像领域的新篇章。这些创新成果不仅展示了GE的技术实力,也为公司带来了丰厚的商业回报。

4. 战争与扩张的机遇

故事背景:两次世界大战为GE提供了巨大的发展机遇。在战争期间,GE凭借其强大的生产能力和技术实力,为军队提供了大量的电气设备和武器装备。

关键事件:第一次世界大战后,GE在新兴的电工技术部门——无线电方面居于统治地位;第二次世界大战则使GE的产量和利润额急剧增长。战争期间的扩张不仅增强了GE的市场地位,也为公司带来了丰富的技术积累和人才储备。

5. 全球化与多元化的战略

故事背景:进入20世纪后半叶,GE开始实施全球化和多元化战略,通过并购和合作等方式不断拓展业务范围和市场版图。

关键事件:在杰克·韦尔奇的领导下,GE从一家制造企业转变为以服务业和电子商务为导向的企业巨头。韦尔奇推行的“六西格玛”质量标准、全球化和电子商务战略几乎重新定义了现代企业。同时,GE还通过收购阿尔斯通、贝克休斯等知名企业进一步巩固了其在轨道交通、电力电网、油气等领域的领先地位。如今,GE已经成为全球最大的提供技术和服务业务的跨国公司之一,在电子行业中具有举足轻重的地位。

Brainboxes公司的发展小趣事

Brainboxes公司成立于1984年,总部位于英国利物浦市。创立之初,公司专注于数据和I/O连接产品的设计和制造。凭借对串行通信技术的深刻理解,Brainboxes迅速在行业内崭露头角。其早期产品,如串口服务器和适配器,因高度可配置和可靠的特性而受到市场的欢迎。随着业务的发展,公司逐渐扩大产品线,涵盖IO模块等多个领域。

DENWIRE公司的发展小趣事

Brainboxes拥有一流的内部制造设施和全球供应链,这使得公司在产品研发和生产方面具有极大的灵活性。内部制造设施保证了产品的高品质和快速交付,而全球供应链则确保了公司能够及时获取所需的原材料和零部件。这种高效的生产模式使得Brainboxes能够迅速响应市场需求,为客户提供优质的产品和服务。

Delta Electronics公司的发展小趣事

近年来,网络安全问题日益严重。2022年,Delta Electronics遭遇了一起勒索软件攻击。面对这一挑战,公司迅速启动了应急响应机制,与专业的网络安全机构合作,成功阻止了攻击者的进一步行动。这一事件虽然给公司带来了一定的损失,但也让Delta更加重视网络安全问题,加强了公司网络安全防护体系的建设。

FOX [Fox Electronics]公司的发展小趣事

进入21世纪后,Fox Electronics意识到全球化对于企业发展的重要性。为了更好地服务全球客户,公司开始在全球范围内布局生产基地和销售网络。通过在亚洲、欧洲和北美等地设立分厂和办事处,Fox Electronics不仅缩短了交货周期,还降低了生产成本,提高了市场竞争力。同时,公司还加强了与全球供应链伙伴的合作,通过优化供应链管理,确保产品质量和交货期的稳定性。

正泰公司的发展小趣事

2014年,正泰公司接到了一份来自美国光伏巨头SE的大订单。然而,客户对车间现场使用的安规测试仪的检测方法提出了质疑,要求限期完成整改。面对这一挑战,正泰公司的员工曹敬乐根据国际标准中的相关要求,结合实际参数,重新对检测工装进行改进设计和样品制备。经过不断测试和改进,最终满足了外方的要求,订单顺利投产。这一事件不仅展示了正泰公司的技术实力和创新能力,也体现了公司对市场变化的敏锐度和应对挑战的能力。

问答坊 | AI 解惑

[赠送]2本台历

某供货商送到,自己有很多本了。 如果近的话,最好自取(快递费比台历价值还高呢)。 公司地址为:上海市静安区 靠近美琪大戏院(江宁路北京西路) 家庭地址为:人民广场新世界附近 …

查看全部问答>

一种高精度电流检测电路的设计

一种高精度电流检测电路的设计…

查看全部问答>

IP核互连策略及规范

IP核互连策略及规范…

查看全部问答>

关于24C64芯片的问题,大家帮忙看看

谁有关于24C64芯片的资料??? 想看下跑4M 晶桢需要延时多久。 知道的帮下忙,在线等。。…

查看全部问答>

1602电子钟 带年月日 可以调整 绝对经典

1602电子钟 带年月日  可以调整 绝对经典…

查看全部问答>

怎样DIY电路板的网站

发现个新网站  不错   http://elm-chan.org/docs/wire/wiring_e.html 电路版 DIY…

查看全部问答>

modelsim是否可以保存仿真结果?

请问modelsim的仿真结果可不可以保存下来?q2和ISE的仿真结果是可以回写到仿真文件中的,不知道modelsim行不行?我试过保存为.do文件,但每次重新load后只有编辑的输入信号波形,而上次仿真得到的输出信号波形都没了,怎样才能保存呢?…

查看全部问答>

STM32耗电问题

1)正常运行于19MHz,电流19mA(包括片上外设GPIOA-E、SPI2、TIM2-5、ADC1),和理论值0.5mA/Hz有很大差距。 2)0.5mA/Hz是不是只是指内核耗电情况?不包括片上外设? 3)进入Stop模式后,电流有2-3mA,关闭了片上外设也降不下来。 有没 ...…

查看全部问答>

IARReadonlydata的疑问

                                 stm32用IAR5.4的环境,我是新手,请教一下各位大侠,我程序中很多字符串,发现编译器将字符串都放在Readonly data ...…

查看全部问答>