历史上的今天
返回首页

历史上的今天

今天是:2024年09月11日(星期三)

正在发生

2018年09月11日 | STM32学习笔记之EXTI(外部中断)

2018-09-11 来源:eefocus

一:EXTI(外部中断)说明

 

=========================================分割线=========================================

 

       外部中断/事件控制器由19个产生事件/中断要求的边沿检测器组成。每个输入线可以独立地配置

输入类型(脉冲或挂起)和对应的触发事件(上升沿或下降沿或者双边沿都触发)。每个输入线都可以被独

立的屏蔽。挂起寄存器保持着状态线的中断要求。

=========================================分割线=========================================

19个中断如下:

未命名

17——EXTI线16连接到PVD输出

18——EXTI线17连接到RTC闹钟事件

19——EXTI线18连接到USB唤醒事件

 

注:有上图可知EXTI0连接的引脚为PA0、PB0、PC0、PD0、PE0、PF0、PG0,其他外部中断EXTI1——

EXTI15类似。所以在使用时尽量将需要的外部中断配置在不同的EXTIx上。

      例如需要3个外部中断,我们可以配置到PA0、PB4、PG3上,此时每个中断都有自己的中断处理程

     序段。如果配置到PA0、PB0、PC1,则PA0和PB0将公用一个中断程序段。当然如果特殊需要,也

     可以这样设计。

=========================================分割线=========================================


配置使用方法:


初始化相应的GPIO管脚

配置外部中断源并进行中断源和GPIO的连接

编写相应中断源的中断处理程序

=========================================分割线=========================================


程序代码


初始化相应的GPIO管脚

GPIO_InitTypeDef GPIO_InitStructure;

 

 

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);           

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

 

 

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;   

GPIO_Init(GPIOE, &GPIO_InitStructure);

 

 

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;   

GPIO_Init(GPIOB, &GPIO_InitStructure);

 

注:GPIO的复用功能必须打开,如红字部分

 


配置外部中断源并进行中断源和GPIO的连接

 


GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource0);

GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource1);

GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource8);

GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource9);

 

 

EXTI_InitStructure.EXTI_Line = EXTI_Line0|EXTI_Line1|EXTI_Line8|EXTI_Line9;

EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;

EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;

EXTI_InitStructure.EXTI_LineCmd = ENABLE;

EXTI_Init(&EXTI_InitStructure);

 


编写相应中断源的中断处理程序

 


void EXTI0_IRQHandler(void)

{

  if(Sys_Status > MIN_STATUS)

  {

    Sys_Status --;

  }

  EXTI_ClearITPendingBit(EXTI_Line0);

}

 

 

void EXTI1_IRQHandler(void)

{

  PEout(2) = ~PEout(2);

  EXTI_ClearITPendingBit(EXTI_Line1);

}

 

 

#define Exti_From_Pin8 0x00000100

#define Exti_From_Pin9 0x00000200

 

void EXTI9_5_IRQHandler(void)

{

 

  u32 Temp = 0x00; 

 

  PEout(2) = ~PEout(2);

  Temp = EXTI->PR;       //取读是那个引脚的中断

  switch(Temp)

  {

    case Exti_From_Pin8:

      EXTI_ClearITPendingBit(EXTI_Line8);

      break;

    case Exti_From_Pin9:

      if(Sys_Status < MAX_STATUS)

      {

        Sys_Status ++;

      }

      EXTI_ClearITPendingBit(EXTI_Line9);

      break;

    default:break;

  }

}

=========================================分割线=========================================


中断处理程序说明,由于外部中断EXTI5——EXTI9公用了一个中断(EXTI10——EXTI15类似)所以要


区分不同的中断源需要进行相应的判断。如上EXTI9_5_IRQHandler中,通过取读EXTI->PR寄存器来判


断中断的来源。



硬件情况:采用PA11管脚


需要明确的是,PxN管脚共用外部中断线EXTIN和外部中断向量EXTIN_IRQn和中断服务程序入口EXTIN_IRQHandler,但是需要注意的是[9...5]共用EXTI9_5_IRQn和EXTI9_5_IRQHandler、[15...10]共用EXTI15_10_IRQn和EXTI15_10_IRQHandler


 


二:Stm32 外部中断EXTI使用


基本过程:


1、设置时钟



RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);  

注意需要打开AFIO时钟


2、配置GPIO


 


GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;  

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;  

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  

GPIO_Init(GPIOA, &GPIO_InitStructure);  

采用浮空输入方式


3、将GPIO管脚与外部中断线连接




GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource11);  

相当重要


4、配置EXTI



EXTI_InitStructure.EXTI_Line = EXTI_Line11;  

EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;  

EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;  

EXTI_InitStructure.EXTI_LineCmd = ENABLE;  

EXTI_Init(&EXTI_InitStructure);  

包括触发方式等等


6、配置NVIC




NVIC_InitTypeDef NVIC_InitStructure;      

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);  

   

NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn; //PPP外部中断线  

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;  

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;  

NVIC_Init(&NVIC_InitStructure);  

7、写中断服务程序




void EXTI15_10_IRQHandler(void)  

{  

    if (EXTI_GetITStatus(EXTI_Line11) != RESET)  

    {  

        EXTI_ClearITPendingBit(EXTI_Line11);//清除标志  

        ...  

    }  

}

 


推荐阅读

史海拾趣

BUSSMANN公司的发展小趣事

1914年,Bussmann五兄弟在家中地下室开始了他们的创业之旅。那时的电子行业正处于起步阶段,熔断器作为电路保护的关键部件,市场需求巨大但供应不足。五兄弟凭借对电子技术的热情和家族传承的工匠精神,不断尝试、创新,终于成功制造出了高质量的熔断器。他们凭借出色的产品质量和口碑,逐渐赢得了市场的认可,业务也从小小的地下室扩展到了一间小型厂房。

Custom Electronics Inc公司的发展小趣事

随着公司规模的扩大和产品质量的提升,CEI开始寻求更广阔的市场空间。通过与全球知名电子产品制造商建立合作关系,CEI的产品逐渐进入国际市场。同时,CEI还积极参与国际电子行业的交流与合作,不断引进先进的生产技术和管理经验,为公司的长远发展奠定了坚实基础。

Andon Electronics公司的发展小趣事

在全球环保意识的日益增强下,CEI积极响应国家节能减排的号召,将环保理念融入企业的生产和经营中。公司引进先进的环保设备和技术,优化生产工艺流程,减少能源消耗和废弃物排放。同时,CEI还倡导绿色消费和循环经济理念,推动电子行业的绿色发展和可持续发展。

请注意,以上故事仅为基于一般情况和假设情境的概述,并非CEI公司的实际发展历程。如有需要,建议查阅相关文献资料或咨询行业专家以获取更准确的信息。

Hi-Light Electronic Co Ltd公司的发展小趣事

随着科技的快速发展和市场需求的变化,CEI不断调整自身的发展战略和业务结构。公司加大了对新技术、新产品的研发投入,推动产业结构的升级和转型。同时,CEI还积极探索新的商业模式和市场机会,为公司的可持续发展提供了有力保障。

DDK公司的发展小趣事

在电子行业中,产品质量是企业生存和发展的关键。DDK公司深知这一点,因此始终将产品质量放在首位。公司建立了严格的质量管理体系,从原材料采购到产品生产、检测的每一个环节都严格把控,确保每一件产品都符合高标准、严要求。这种对品质的执着追求,让DDK公司的产品在市场上赢得了良好的声誉,赢得了消费者的信任和忠诚。

Codeco Corporation Of Vermont公司的发展小趣事

随着电子行业的快速发展和变革,Codeco面临着新的挑战和机遇。为了应对这些变革,公司及时调整战略,加大在人工智能、物联网等领域的投入。通过与高校、研究机构的合作,Codeco不断吸收新的技术和理念,推出了一系列符合市场需求的创新产品。这些举措使得Codeco在行业中保持了领先地位。

问答坊 | AI 解惑

RFID将广泛应用于纺织品物流管理和防伪

[摘要]法国一些大型服装品牌连锁店已经计划装备RFID技术,对商店和仓库的库存进行清点管理。由于RFID技术还可以检测各种物质的化学成分和惰性金属,因此可用于纺织品防伪鉴别。      据法国《纺织报》消息,一种被称 ...…

查看全部问答>

元件模特秀--图文并茂、简单易懂

无意间发现一篇很有创意的介绍元件的原理、外形、封装、功能的文章---元件模特秀。 原作者是“爱因迪生”。在这里我转帖过来,大家一起欣赏 文件比较大,还有很多图片,发帖比较麻烦,我直接先传PDF文档得了。这个是我从网上下来后做的PDF,希望 ...…

查看全部问答>

测量系统中的误差分析及解决方法

测量系统中的误差分析及解决方法…

查看全部问答>

我要动态加载一个流驱动,总是不成功,why?

        HANDLE device=ActivateDevice(_T(\"\\\\HKEY_LOCAL_MACHINE\\\\Drivers\\\\HGPIOs\"),NULL);         if(device==0)         {           &nbs ...…

查看全部问答>

ad转换器

请问AD转换器可以和PC直接相连么,可以的话推荐一款…

查看全部问答>

!!请问Windows中的缺页中断处理是在那个中断级别啊,是APC_LEVEL吗 ???

我看到一篇文章写道:“APC_LEVEL当一个asynchsonous procedure call产生时,processor进入到APC_LEVEL。在这个level上,会无视其他的APC,屏蔽APC LEVEL的中断,比如,一些I/O completion APC。可以访问pagable memory。系统在APC_LEVEL处理缺页中 ...…

查看全部问答>

请教 惠普 ProBook 4411s(VA045PA) 多少钱可以买到手?

惠普 ProBook 4411s(VA045PA)  报价 5999元 我随便问了下老板多少钱,他说5200. 多少钱可以买到手?…

查看全部问答>

电子产品焊接工艺

电子产品焊接工艺…

查看全部问答>

怎么样将应用层的数据传到IAP中?

   ST的IAP方案需要按键,可是我设计的板子没有按键,只是通过串口实现控制。这样话IAP就没法工作了。所以想从用户层跳到IAP层进行IAP编程,可是需要从应用层传递一个变量。怎么样传递变量呢?   …

查看全部问答>

MSP430选型样本,给需要的朋友

问淘宝店家要来的,放上来看看有没有人需要哈!…

查看全部问答>