目录
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