外部中断

硬件连接

按键连接

main.c

#include "stm32f10x.h"   // 相当于51单片机中的  #include <reg51.h>

#include "bsp_led.h"
#include "bsp_exti.h"

int main(void)
{
	LED_GPIO_Config();		//LED灯初始配置
	EXTI_Key_Config();		//EXTI初始化
	while(1)
	{
	}
}

bsp_exti.h

#ifndef __BSP_EXTI_H
#define __BSP_EXTI_H

#include "stm32f10x.h"

/*******  KEY1相关宏  ********/
/*--------KEY1的GPIO---------*/
#define KEY1_INT_GPIO_PORT 	GPIOA					//按键端口
#define KEY1_INT_GPIO_PIN 	GPIO_Pin_0				//按键引脚
#define KEY1_INT_GPIO_CLK 	(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO)	//按键及中断时钟

/*--------KEY1的中断---------*/
#define KEY1_INT_EXTI_PORTSOURCE 			GPIO_PortSourceGPIOA		//中断信号源端口
#define KEY1_INT_EXTI_PINSOURCE 			GPIO_PinSource0				//中断信号源引脚
#define KEY1_INT_EXTI_LINE 					EXTI_Line0					//中断信号输入线
#define KEY1_INT_EXTI_IRQ 					EXTI0_IRQn					//中断源编号

/*--------KEY1的中断处理程序---------*/
#define KEY1_IRQHandler 		EXTI0_IRQHandler
//中断服务处理程序名,由启动文件startup_stm32f10x_hd.s查找,写入stm32f10x_it.c中。


/*******  KEY2相关宏  ********/
/*--------KEY2的GPIO---------*/
#define KEY2_INT_GPIO_PORT 				GPIOC			//按键端口
#define KEY2_INT_GPIO_PIN 				GPIO_Pin_13		//按键引脚
#define KEY2_INT_GPIO_CLK 				(RCC_APB2Periph_GPIOC|RCC_APB2Periph_AFIO)	//按键及中断时钟

/*--------KEY2的中断---------*/
#define KEY2_INT_EXTI_PORTSOURCE 			GPIO_PortSourceGPIOC		//中断信号源端口
#define KEY2_INT_EXTI_PINSOURCE 			GPIO_PinSource13			//中断信号源引脚
#define KEY2_INT_EXTI_LINE 					EXTI_Line13					//中断信号输入线
#define KEY2_INT_EXTI_IRQ 					EXTI15_10_IRQn				//中断源

/*--------KEY2的中断处理程序---------*/
#define KEY2_IRQHandler 			EXTI15_10_IRQHandler		
//中断服务处理程序名,由启动文件startup_stm32f10x_hd.s查找,写入stm32f10x_it.c中。


void EXTI_Key_Config(void);

#endif /* __BSP_EXTI_H */

bsp_exti.c

#include "bsp_exti.h"

static void EXTI_NVIC_Config(void)
{
	NVIC_InitTypeDef NVIC_InitStruct;			//定义NVIC中断优先级结构体
	
	/*--------KEY1中断优先级配置---------*/
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);				//配置中断优先级分组
	
	NVIC_InitStruct.NVIC_IRQChannel = KEY1_INT_EXTI_IRQ;		//配置中断源编号
	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;		//配置主优先级
	NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;				//配置次优先级
	NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;				//中断使能
	
	NVIC_Init(&NVIC_InitStruct);				//中断优先级初始化
	

	/*--------KEY2中断优先级配置---------*/
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);				//配置中断优先级分组
	
	NVIC_InitStruct.NVIC_IRQChannel = KEY2_INT_EXTI_IRQ;
	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;		//配置主优先级为1
	NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;				//配置次优先级为0
	NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;				//中断使能
	
	NVIC_Init(&NVIC_InitStruct);				//中断优先级初始化
}

void EXTI_Key_Config(void)
{
	GPIO_InitTypeDef  	GPIO_InitStruct;        //定义GPIO结构体
	EXTI_InitTypeDef  	EXTI_InitStruct;		//定义EXTI结构体
	
	/*-------初始化中断优先级---------*/
	EXTI_NVIC_Config();
	
	
	/********  KEY1配置  **********/
	/*-------初始化GPIO口---------*/
	RCC_APB2PeriphClockCmd(KEY1_INT_GPIO_CLK, ENABLE); 			//使能GPIO口时钟

	GPIO_InitStruct.GPIO_Pin = KEY1_INT_GPIO_PIN;      			//配置GPIO引脚
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;			//配置为浮动输入
	
	GPIO_Init(KEY1_INT_GPIO_PORT , &GPIO_InitStruct);			//GPIO口初始化
	
	/*------- 初始化EXTI ---------*/
	GPIO_EXTILineConfig(KEY1_INT_EXTI_PORTSOURCE , \
						KEY1_INT_EXTI_PINSOURCE);				//配置中断信号源
	EXTI_InitStruct.EXTI_Line = KEY1_INT_EXTI_LINE;				//配置中断输入线
	EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;			//配置中断模式
	EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising;			//配置中断触发形式
	EXTI_InitStruct.EXTI_LineCmd = ENABLE;						//使能中断
	
	EXTI_Init( &EXTI_InitStruct );				//中断初始化
	
	
	/********  KEY2配置  **********/
	/*-------初始化GPIO口---------*/
	RCC_APB2PeriphClockCmd(KEY2_INT_GPIO_CLK, ENABLE); 			//使能GPIO口时钟

	GPIO_InitStruct.GPIO_Pin = KEY2_INT_GPIO_PIN;      			//配置GPIO口
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;			//配置为浮动输入
	
	GPIO_Init(KEY2_INT_GPIO_PORT , &GPIO_InitStruct);			//GPIO口初始化
	
	/*------- 初始化EXTI ---------*/
	GPIO_EXTILineConfig(KEY2_INT_EXTI_PORTSOURCE , \
						KEY2_INT_EXTI_PINSOURCE);				//配置中断信号源
	EXTI_InitStruct.EXTI_Line = KEY2_INT_EXTI_LINE;				//配置中断输入线
	EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;			//配置中断模式
	EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising;			//配置中断触发形式
	EXTI_InitStruct.EXTI_LineCmd = ENABLE;						//使能中断
	
	EXTI_Init( &EXTI_InitStruct );			//中断初始化
}

stm32f10x_hd.c 添加中断处理程序

oid KEY1_IRQHandler(void)
{
	if(EXTI_GetITStatus(KEY1_INT_EXTI_LINE) != RESET)		//识别出中断标志位置1
	{
		LED_G_TOGGLE;
	}
	EXTI_ClearITPendingBit(KEY1_INT_EXTI_LINE);				//清楚中断标志位
}

void KEY2_IRQHandler(void)
{
	if(EXTI_GetITStatus(KEY2_INT_EXTI_LINE) != RESET)		//识别出中断标志位置1
	{
		LED_R_TOGGLE;
	}
	EXTI_ClearITPendingBit(KEY2_INT_EXTI_LINE);				//清楚中断标志位
}

bsp_led.h 及 bsp_led.c

点亮LED灯(固件库版)

代码内容参考野火视频,有所修改

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值