stm32-05-中断

exit简介

exit:外部中断/事件控制器
在这里插入图片描述
在这里插入图片描述

中断流程

GPIO -> exit -> nvic

中断/事件线

在这里插入图片描述
通过这个寄存器来配置使用
在这里插入图片描述

我的理解(思路)

关于中断,是可以在任何地方产生的,比如按键,这个按键是通过GPIO去读取电位来感知。如上面所讲, EXTI1有20个事件线组成(16个GPIOX1+4个其他),但这只是,EXTI1还有更多的EXTI2,EXTI3 …,所以在这些GPIO上我们都可以让他产生中断,下面拿按键来做例子:

第一步:GPIO相关配置

在这里插入图片描述
如图中我们可以看到GPIOA0是来读取电位来判断按键是否按下的
一开始因为电阻和地相连接是下拉电阻所以是低电平

在这里插入图片描述
按键按下电阻与电源连接,是上拉电阻是高电极,同时按键按下,电位由低到高是上升沿
在这里插入图片描述

第二步配置代码

bsp_exti.h宏定义GPIO相关参数

#define KEY1_GPIO_PIN    GPIO_Pin_0
#define KEY1_GPIO_PORT   GPIOA
#define KEY1_GPIO_CLK    RCC_APB2Periph_GPIOA

bsp_exti.c初始化GPIO

void EXTI_KEY_Config(void){
	GPIO_InitTypeDef  GPIO_InitStruct;
	RCC_APB2PeriphClockCmd(KEY1_GPIO_CLK,ENABLE);
	
	GPIO_InitStruct.GPIO_Pin = KEY1_GPIO_PIN;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入,原本是什么就是什么
	GPIO_Init(KEY1_GPIO_PORT,&GPIO_InitStruct);
}

第三步将GPIOA0设置为EXTI0的信号源

bsp_exti.c设置GPIOA0为EXTI0的信号源

//为可以为EXTI分配信号源的GPIO_AFIO寄存器进行时钟配置,让其可以进行工作
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); 
//配置GPIOA0为EXTI0的信号源
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);

第四步配置EXTI

bsp_exti.c设置EXTI0并且指向的是GPIOA0(第三步,第四步相互绑定)

EXTI_InitTypeDef  EXTI_InitStruct;

//因为第三步使用的0管脚,所以这里绑定的也是0管脚
EXTI_InitStruct.EXTI_Line      =    EXTI_Line0;  
//EXTI 为中断模式
EXTI_InitStruct.EXTI_Mode      =    EXTI_Mode_Interrupt;
//上升沿中断
EXTI_InitStruct.EXTI_Trigger   =    EXTI_Trigger_Rising;
// 使能中断  (使能中断,意思是给中断使能)
EXTI_InitStruct.EXTI_LineCmd   =    ENABLE;
//根据上面的进行初始化
EXTI_Init(&EXTI_InitStruct);

第五步配置NVIC中断

bsp_exti.c设置NVIC中断

static void EXIT_NVIC_Config(){
	NVIC_InitTypeDef NVIC_Initstruct;
	
	//配置 NVIC 为优先级组 1
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
	
	//配置中断源:按键 1
	NVIC_Initstruct.NVIC_IRQChannel = EXTI0_IRQn ;
	//配置抢占优先级:1 
	NVIC_Initstruct.NVIC_IRQChannelPreemptionPriority = 1;
	//配置子优先级:1
	NVIC_Initstruct.NVIC_IRQChannelSubPriority = 1;
	//使能中断通道
	NVIC_Initstruct.NVIC_IRQChannelCmd  = ENABLE;
	NVIC_Init(&NVIC_Initstruct);

}

在void EXTI_KEY_Config(void)中调用NVIC中断

EXTI_KEY_Config()

第六步配置中断服务函数(即在发生中断后该做些什么)

stm32f10x_it.h中编写中断服务函数,使用的头文件也注意去添加

#include "bsp_key.h"
#include "bsp_exti.h"
#include "bsp_led.h"
/**
  * @brief  This function handles EXTI0 IRQHandler.
  * @param  None
  * @retval None
  */
//函数名是通过startup_stm32f10x_hd.s中的中断向量表来进行配置的
void EXTI0_IRQHandler(void){
	//RESET = 0 约定俗称
	//获取EXTI—Line0的状态
	if(EXTI_GetITStatus(EXTI_Line0) != RESET){
		LED_TOGGLE;
	}
	//清除
	EXTI_ClearITPendingBit(EXTI_Line0);
}

至此一个通过按键产生中断,中断后led灯明暗进行切换的中断就完成了
还是那个顺序 GPIO -> EXTI -> NVIC

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值