【STM32】(4) 外部中断实验

一、实验目的

KEY_UP控制DSO,DS1互斥点亮;KEY2控制DS0,按一次亮,再按一次灭;KEY1控制DS1,效果同KEY2;KEYO则同时控制DS0和DS1,按一次,他们的状态就翻转一次。

二、硬件连接

三、代码及分析

exti.c

#include"exti.h"
#include"key.h"
#include"led.h"
#include"delay.h"
#include"key.h"

u8 led0sta=1,led1sta=1;		    //LED0,LED1的当前状态	    //LED0,LED1的当前状态
void EXTI_Init(void)
{
   GPIO_InitTypeDef GPIO_Initure;
   __HAL_RCC_GPIOA_CLK_ENABLE();           //开启GPIOA时钟
   __HAL_RCC_GPIOC_CLK_ENABLE();           //开启GPIOC时钟
   __HAL_RCC_GPIOH_CLK_ENABLE();           //开启GPIOH时钟
    GPIO_Initure.Pin=GPIO_PIN_0;            //PA0
    GPIO_Initure.Mode=GPIO_MODE_IT_RISING ;   // 外部中断上升沿触发
    GPIO_Initure.Pull=GPIO_PULLDOWN;        //下拉
    GPIO_Initure.Speed=GPIO_SPEED_HIGH;     //高速
    HAL_GPIO_Init(GPIOA,&GPIO_Initure);
    
    GPIO_Initure.Pin=GPIO_PIN_13;           //PC13
    GPIO_Initure.Mode=GPIO_MODE_IT_FALLING; //外部中断下降沿触发
    GPIO_Initure.Pull=GPIO_PULLUP;          //上拉
    GPIO_Initure.Speed=GPIO_SPEED_HIGH;     //高速
    HAL_GPIO_Init(GPIOC,&GPIO_Initure);
    
    GPIO_Initure.Pin=GPIO_PIN_2|GPIO_PIN_3; //PH2,3
    HAL_GPIO_Init(GPIOH,&GPIO_Initure);
	
    HAL_NVIC_EnableIRQ(EXTI0_IRQn);				//使能中断线0中断通道
	HAL_NVIC_SetPriority(EXTI0_IRQn,2,0);		//抢占优先级3,子优先级3

    HAL_NVIC_EnableIRQ(EXTI2_IRQn);				//使能中断线2中断通道
	HAL_NVIC_SetPriority(EXTI0_IRQn,2,1);		//抢占优先级3,子优先级3

    HAL_NVIC_EnableIRQ(EXTI3_IRQn);				//使能中断线3中断通道
	HAL_NVIC_SetPriority(EXTI0_IRQn,2,2);		//抢占优先级3,子优先级3
	
	HAL_NVIC_EnableIRQ(EXTI15_10_IRQn);				//使能中断线0中断通道
	HAL_NVIC_SetPriority(EXTI15_10_IRQn,2,3);		//抢占优先级3,子优先级3
	
	
}
void EXTI0_IRQHandler (void)  
{
   HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);           //调用公用中断处理函数
}

void EXTI2_IRQHandler (void)  
{
  HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_2);
}

void EXTI3_IRQHandler (void)  
{
  HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_3);
}
void EXTI15_10_IRQHandler (void)  
{
   HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_13);
}

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)

{
	delay_ms(100);
    switch(GPIO_Pin)
	{
		case GPIO_PIN_0 :  			// WK_UP
			
		  if(WK_UP==1)	         //控制LED0,LED1互斥点亮
            {
                led1sta=!led1sta;
                led0sta=!led1sta;
                LED1(led1sta);
                LED0(led0sta);
			}
			break ;
		
	    case GPIO_PIN_13 :  		//KEY2
			
		      if(KEY2==0)  	//控制LED0翻转
            {
                led0sta=!led0sta;
                LED0(led0sta);
            }
            break;
		
		case GPIO_PIN_2 :            //KEY1
		
		 if(KEY1==0) 	//控制LED1翻转	
            {
                led1sta=!led1sta;
                LED1(led1sta);	
            };
            break;
					
	
	    case GPIO_PIN_3 :            //KEY0
			
		   if(KEY0==0)  	//同时控制LED0,LED1翻转 
            {
                led1sta=!led1sta;
                led0sta=!led0sta;
                LED1(led1sta);
                LED0(led0sta); 
            }
            break;			
	}
}

 在void EXTI_Init( ) 中调用HAL_GPIO_Init( ) 进行IO口的初始化,配置好中断线映射关系后,使能中断线,并设置中断优先级。
 在void EXTI0_IRQHandler ( )    中调用公用中断处理函数HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);  该函数会调用void  HAL_GPIO_EXTI_Callback( ),我们只需要在它里面编写真正的控制逻辑就行了。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值