STM32学习笔记之EXTI(外部中断)

摘要:
GPIO_初始化结构);GPIO_ InitStructure.GPIO_引脚=GPIO_引脚_8|GPIO_针脚_9;GPIO_ InitStructure.GPIO_ Mode=GPIO_ Mode_ IN_ FLOATING;GPIO_初始化结构.GPIO_速度=GPIO_速度_ 50MHz;GPIO_ PinSource9);

參考资料:STM32数据手冊、网络资料

=========================================切割线=========================================

      外部中断/事件控制器由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)
  {
    caseExti_From_Pin8:
     EXTI_ClearITPendingBit(EXTI_Line8);
     break;
    caseExti_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寄存器来判

断中断的来源。

转自http://blog.sina.com.cn/s/blog_6623834301018woa.html

免责声明:文章转载自《STM32学习笔记之EXTI(外部中断)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇HTML5 本地文件操作之FileSystemAPI简介zkServer.sh start zkServer启动失败下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

[STM32F103]PWM输入捕获配置

l 初始化定时器和通道对应IO的时钟。 l 初始化IO口,模式为输入:   GPIO_Init();       GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PA0 输入 l 初始化定时器ARR,PSC   TIM_TimeBaseInit(); l 初始化输入捕获通道   TIM_ICInit(); l...

Java-多线程第四篇线程池

1、什么是线程池。     线程池在系统启动的时候即创建大量的空闲的线程,程序将一个Runnable对象或者Callable对象传给线程池,线程池就会启动一个线程来执行它们的run()或者call()方法,当run()或者call()方法执行结束后,该线程并不会死亡,而是再次返回线程池称为空闲状态,等待执行下一个Runable对象的run()或者call(...

BLDC开发笔记2.六步PWM输出

6步PWM互补输出 6步PWM输出是对 F103 的 TIM1 进行配置成PWM输出模式,带刹车和死区功能。按照模块化进行初始化配置。勾选keil中的C99标准(支持任意地方定义变量)。 GPIO初始化 打开相应功能模块时钟,将TIM1 的TIx引脚配置为复用推挽输出模式,BKIN(刹车)引脚配置为浮空输入模式。 通过在头文件进行宏定义配置,在硬件改变的时...

SpringBoot:异步开发之异步调用

前言除了异步请求,一般上我们用的比较多的应该是异步调用。通常在开发过程中,会遇到一个方法是和实际业务无关的,没有紧密性的。比如记录日志信息等业务。这个时候正常就是启一个新线程去做一些业务处理,让主线程异步的执行其他业务。所以,本章节重点说下在SpringBoot中如何进行异步调用及其相关知识和注意点。 何为异步调用 说异步调用前,我们说说它对应的同步调用。...

Gojs学习史(一):基本定义

1. gojs定义 初始化时,先简化gojs本身的方法: var Go = go.GraphObject.make; //简化方法 1.1 画布定义 在声明了Go方法之后,接下来就是定义画布: myDiagram = Go(go.Diagram,"myDiagramDiv",{ initialContentAlignment:go.Spot.Cen...

i.MX6ULL的GPIO简要介绍。

详细介绍可参考《i.MX 6UltraLite Applications ProcessorReference Manual》第 26 章 General Purpose Input/Output (GPIO)(P1133)。GPIO框图   一、IOMUXC复用选择器 1 在IOMUXC 外设中,MUX Mode 和 Pad Settings 寄存器命...