STM32学习笔记之EXTI(外部中断) 一:EXTI(外部中断)说明 二:Stm32 外部中断EXTI使用

一: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将公用一个中断程序段。当然如果特殊需要,也

     可以这样设计。

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

配置使用方法:

  1. 初始化相应的GPIO管脚
  2. 配置外部中断源并进行中断源和GPIO的连接
  3. 编写相应中断源的中断处理程序

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

程序代码

  • 初始化相应的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、设置时钟

[cpp]  view plain  copy
  1. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);  
注意需要打开AFIO时钟

2、配置GPIO

[cpp]  view plain  copy
  1. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;  
  2. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;  
  3. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  
  4. GPIO_Init(GPIOA, &GPIO_InitStructure);  
采用浮空输入方式

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

[cpp]  view plain  copy
  1. GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource11);  
相当重要

4、配置EXTI

[cpp]  view plain  copy
  1. EXTI_InitStructure.EXTI_Line = EXTI_Line11;  
  2. EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;  
  3. EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;  
  4. EXTI_InitStructure.EXTI_LineCmd = ENABLE;  
  5. EXTI_Init(&EXTI_InitStructure);  
包括触发方式等等

6、配置NVIC

[cpp]  view plain  copy
  1. NVIC_InitTypeDef NVIC_InitStructure;      
  2. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);  
  3.    
  4. NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn; //PPP外部中断线  
  5. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;  
  6. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  
  7. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;  
  8. NVIC_Init(&NVIC_InitStructure);  

7、写中断服务程序

[cpp]  view plain  copy
  1. void EXTI15_10_IRQHandler(void)  
  2. {  
  3.     if (EXTI_GetITStatus(EXTI_Line11) != RESET)  
  4.     {  
  5.         EXTI_ClearITPendingBit(EXTI_Line11);//清除标志  
  6.         ...  
  7.     }  
  8. }

猜你喜欢

转载自blog.csdn.net/weibo1230123/article/details/80798200