STM32-外部中断EXTI(标准库+代码)

一、外部中断简介

        中断即打断,当单片机在顺序执行当前程序时,由于系统出现了某种需要紧急处理的情况,单片机暂停正在执行的程序,转而去执行紧急事务,当处理结束后单片机自动返回到原先暂停的程序中继续执行,这种执行过程由于外界的原因被打断的情况叫做中断。

EXTI支持配置20个中断和事件屏蔽位;
GPIO端口连接到16个外部中断/事件线上;EXTI_Line0 — EXTI_Line15;
EXTI_Line16 连接到PVD输出 ;
EXTI_Line17连接到RTC闹钟事件;
EXTI_Line18连接到USB唤醒事件;
EXTI_Line19连接到以太网唤醒事件(只适用于互联型产品);

二、中断服务函数

三、配置流程

一般使用GPIO的外部中断功能,都需要有以下几个步骤:

  1. 开启时钟
  2. 配置GPIO模式
  3. 使能NVIC中断并且配置优先级
  4. 配置GPIO中断
  5. 使能中断和清楚中断标志位
  6. 编写中断服务函数

STM32单片机的任意引脚都可以配置为外部中断触发,我们对应的去使能引脚的外部中断功能即可。

四、代码实现 

KEY.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "KEY.h"

uint8_t Key_Value; 

static void NVIC_Configuration(void)
{
	NVIC_InitTypeDef NVIC_InitStructure;
	
	/* 配置NVIC为优先级组1 */
	/* 提示 NVIC_PriorityGroupConfig() 在整个工程只需要调用一次来配置优先级分组*/
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
	
	/* 配置中断源:KEY1 */
	NVIC_InitStructure.NVIC_IRQChannel = KEY1_INT_EXTI_IRQ;
	/* 配置抢占优先级 */
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
	/* 配置自然优先级 */
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
	/* 使能中断通道 */
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStructure);
}

/*
*   函数内容:初始化按键GPIO
*   函数参数:无
*   返回值:  无
*/
void KEY_Init()
{
	GPIO_InitTypeDef GPIO_InitStructure;
	EXTI_InitTypeDef EXTI_InitStructure;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO,ENABLE);
	
	/* 配置 NVIC 中断 */
	NVIC_Configuration();
	
	/* 配置为上拉输入 */
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_InitStructure.GPIO_Pin = KEY1_INT_GPIO_PIN;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB,&GPIO_InitStructure);
	
	/* 选择EXTI的信号源 */
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,KEY1_INT_EXTI_PINSOURCE);
	EXTI_InitStructure.EXTI_Line = KEY1_INT_EXTI_LINE;
	/* EXTI为中断模式 */
	EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
	/* 下降沿中断 */
	EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
	/* 使能中断 */	
	EXTI_InitStructure.EXTI_LineCmd = ENABLE;
	EXTI_Init(&EXTI_InitStructure);
	
	EXTI_ClearFlag(KEY1_INT_EXTI_LINE);
}

//独立按键中断
void EXTI15_10_IRQHandler(void)
{
  if(EXTI_GetITStatus(KEY1_INT_EXTI_LINE)!=RESET)
  {
    Delay_ms(5);
    if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_13)==RESET)
    {    
        Key_Value = 1;
    }
    //清除标志位
    EXTI_ClearFlag(KEY1_INT_EXTI_LINE);
  }
}

KEY.h

#ifndef __KEY_H_
#define __KEY_H_
#include "stm32f10x.h"                  // Device header
#include "main.h"



//按键引脚定义
#define KEY1_INT_GPIO_PORT         GPIOB
#define KEY1_INT_GPIO_CLK          (RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO)
#define KEY1_INT_GPIO_PIN          GPIO_Pin_13
#define KEY1_INT_EXTI_PORTSOURCE   GPIO_PortSourceGPIOB
#define KEY1_INT_EXTI_PINSOURCE    GPIO_PinSource13
#define KEY1_INT_EXTI_LINE         EXTI_Line13
#define KEY1_INT_EXTI_IRQ          EXTI15_10_IRQn
#define KEY1_IRQHandler            EXTI15_10_IRQHandler


void KEY_Init();

#endif

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值