zoukankan      html  css  js  c++  java
  • stm32 外部中断学习

    今天我们看看STM32的外部中断实验。

    STM32 供 IO 口使用的中断线只有 16 个,但是 STM32 的 IO 口却远远不止 16 个,那么 STM32 是怎么把 16 个中断线和 IO 口一一对应起来的呢?

    STM32 这样设计,GPIO 的管脚 GPIOx.0 ~ GPIOx.15 (x=A,B,C,D,E,F,G)分别对应中断线 0~15.

    这样每个中断线对应了 7 个 IO 口。以线 0 为例:它对应了 GPIOA.0、GPIOB.0、GPIOC.0、GPIOD.0、GPIOE.0、GPIOF.0、GPIOG.0。

    但是一根中断线每次只能连接到 1 个 IO 口上,这就需要通过配置来决定连到哪个IO口。

    下面我们看看 GPIO 跟中断线的映射关系图: 


    只截取了部分,但是其中的关系一目了然。举例说,假如0号线和PA0相连,那么用的库函数是:

    GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);


    这个实验,我们通过按键来触发外部中断。按键的电路原理图如下:


    这里从上到下4个按键分别接到MCU的PA0,PE4,PE3,PE2.

    我们看看代码。

    首先是IO口的配置。

    void key_init(void) 
    { 
     	GPIO_InitTypeDef GPIO_InitStructure;
     	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOE,ENABLE);//PORTA,PORTE时钟使能
    
    	//KEY0-->GPIOE.4,    KEY1-->GPIOE.3,   KEY2-->GPIOE.2,
    	GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4; //PE2~4
    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;                    //上拉输入
     	GPIO_Init(GPIOE, &GPIO_InitStructure);
    
    	//WK_UP-->GPIOA.0	 
    	GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_0;
    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;                   //下拉输入
    	GPIO_Init(GPIOA, &GPIO_InitStructure);
    
    }
    


    然后是中断配置。
    void EXTIx_Init(void)
    {
     
     	EXTI_InitTypeDef EXTI_InitStructure;
     	NVIC_InitTypeDef NVIC_InitStructure;
    
      	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);	
    	//通过AFIO_EXTICRx配置GPIO线上的外部中断/事件,必须先使能AFIO时钟
    	
    	//注意:只有使用了AFIO的事件控制寄存器、AFIO的重映射功能以及外部中断(EXTI)控制寄存器才需要开启AFIO的时钟
    
            //GPIOE.2-4中断线的配置
      	GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource2);
    	GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource3);
    	GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource4);
    
      	EXTI_InitStructure.EXTI_Line = EXTI_Line2 | EXTI_Line3 | 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);	 	
    
     
    
    	//GPIOA.0中断线配置
     	GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0); 
    
     	EXTI_InitStructure.EXTI_Line = EXTI_Line0;
      	EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; //上升沿触发
      	EXTI_Init(&EXTI_InitStructure);		
    
    	//优先级配置
      	NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;			
      	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;	
      	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x03;					
      	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;								
      	NVIC_Init(&NVIC_InitStructure); 
    
            NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn;			
      	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;	
      	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;					
      	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;								
      	NVIC_Init(&NVIC_InitStructure);
    
    
      	NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn;			
      	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;	
      	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01;					
      	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;								
      	NVIC_Init(&NVIC_InitStructure);  	  
    
    	NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQn;			
      	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;	
      	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;					
      	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;								
      	NVIC_Init(&NVIC_InitStructure);  	  
     
    }
    

    最后是中断服务函数。

    #define KEY3  GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)//读取按键WK_UP
    
    void EXTI0_IRQHandler(void)
    {
    	delay_ms(10);    //消除抖动
    	if(KEY3==1)	 //WK_UP
    	{				 
    		printf("您按下的是 WK_UP 
    
    ");
    	}
    	EXTI_ClearITPendingBit(EXTI_Line0); //清除中断标志位
    }
     
    其他服务函数类似,就不贴了。

    看看实验效果吧。





  • 相关阅读:
    转 UICollectionView 详解
    springboot配置ssl证书
    服务器ganglia安装(带有登录验证)
    eureka配置说明
    Servlet中获取请求参数问题
    apidoc学习(接口文档定义取代word)
    markdown语法
    JVM分析
    ftp上传或下载文件工具类
    ubuntu命令安装
  • 原文地址:https://www.cnblogs.com/longintchar/p/5224427.html
Copyright © 2011-2022 走看看