STM32F4 EXTI外部中断(二)

一. 外部中断结构体

1. EXTI_InitTypeDef 结构体

字段 描述
EXTI_Line 中断线标号
EXTI_Mode 中断模式
EXTI_Trigger 触发方式
EXTI_LineCmd 中断线使能

2. 中断线标号

中断线标号 解释
EXTI_Line0 ~~ EXTI_Line22 中断线0~~中断线22
中断/事件线 输入源
EXTI0 PX0(X可为A、B、C、D、E、F~~)
EXIT1 PX1(X可为A、B、C、D、E、F~~)
EXTI2 PX2(X可为A、B、C、D、E、F~~)
EXIT3 PX3(X可为A、B、C、D、E、F~~)
EXTI4 PX4(X可为A、B、C、D、E、F~~)
EXIT5 PX5(X可为A、B、C、D、E、F~~)
EXTI6 PX6(X可为A、B、C、D、E、F~~)
EXIT7 PX7(X可为A、B、C、D、E、F~~)
EXTI8 PX8(X可为A、B、C、D、E、F~~)
EXIT9 PX9(X可为A、B、C、D、E、F~~)
EXTI10 PX10(X可为A、B、C、D、E、F~~)
EXIT11 PX11(X可为A、B、C、D、E、F~~)
EXTI12 PX12(X可为A、B、C、D、E、F~~)
EXIT13 PX13(X可为A、B、C、D、E、F~~)
EXTI14 PX14(X可为A、B、C、D、E、F~~)
EXIT15 PX15(X可为A、B、C、D、E、F~~)
EXTI16 PVD输出
EXIT17 RTC闹钟事件
EXTI18 USB OTG FS唤醒事件
EXIT19 太网唤醒事件
EXTI20 USB OTG HS(在FS中配置)唤醒事件
EXIT21 连接到RTC入侵和时间戳事件
EXTI22 连接到RTC唤醒事件

3. 中断模式

字段 解释
EXTI_Mode_Interrupt 中断请求
EXTI_Mode_Event 事件请求

4. 触发方式

字段 解释
EXTI_Trigger_Falling 下降沿触发
EXTI_Trigger_Rising 上升沿触发
EXTI_Trigger_Rising_Falling 上升沿与下降沿触发

5. 中断服务函数名

字段 解释
EXTI0_IRQHandler 中断线0服务函数
EXTI1_IRQHandler 中断线1服务函数
EXTI2_IRQHandler 中断线2服务函数
EXTI3_IRQHandler 中断线3服务函数
EXTI4_IRQHandler 中断线4服务函数
EXTI9_5_IRQHandler 中断线5 ~ 9服务函数
EXTI15_10_IRQHandler 中断线10 ~ 15服务函数

二. 外部中断配置

1. 配置时钟与建立引脚与中断线联系

操作 调用函数/结构体
开启SYSCFG时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
设置IO与中断线映射关系 SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOx,EXTI_PinSource0)

2.配置GPIO为输入

详解GPIO笔记

3.配置EXTI_InitTypeDef结构体

操作 调用函数/结构体
定义外部中断配置结构体 EXTI_InitTypeDef
配置中断线标号 EXTI_Line
配置中断模式 EXTI_Mode
配置触发方式 EXTI_Trigger
使能中断线 EXTI_LineCmd
初始化外部中断配置 EXTI_Init(&EXTI_InitStructure);

4. 配置NVIC中断结构体

详解NVIC笔记

5. 编写中断服务函数

操作 函数
判断外部中断发生 EXTI_GetITStatus(中断线标号)
清除中断标志位 EXTI_ClearITPendingBit(中断线标号);

2. 例

配置PB14为外部中断

void exti_init(void)
{
    //配置GPIOB_14引脚为输入
    //使能GPIO时钟
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);
    //定义GPIO_InitTypeDef 结构体
    GPIO_InitTypeDef GPIO_InitStructure;
    //选择引脚
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
    //配置工作模式为输入模式
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; 
    //配置工作频率
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
    //配置上拉模式
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
    //初始化IO参数
    GPIO_Init(GPIOF,&GPIO_InitStructure);
    
    //使能时钟
    //使能SYSCFG时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG,ENABLE);
    //建立中断线14与PB14连接
    SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOB,EXTI_PinSource14);
    
    //配置EXTI外部中断结构体
    //定义结构体
    EXTI_InitTypeDef EXTI_InitStructure;
    //配置外部中断线14
    EXTI_InitStructure.EXTI_Line = EXTI_Line14;
    //配置模式为中断请求
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
    //配置触发方式为下降沿触发
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
    //使能外部中断
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    //配置外部中断
    EXTI_Init(&EXTI_InitStructure);
    
    //配置NVIC结构体
    //定义结构体
    NVIC_InitTypeDef NVIC_InitStructure;
    //配置中断源为外部中断15~10
    NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10IRQn;
    //配置抢占优先级
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    //配置响应优先级
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
    //使能中断通道
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    //配置中断参数
    NVIC_Init(&NVIC_InitStructure);
    
}

//中断服务函数
void EXTI15_10_IRQHandler(void{
    //判断外部中断14是否发生
    if(EXTI_GetITStatus(EXTI_Line14) != RESET)
	{
        //清除中断标志位
		 EXTI_ClearITPendingBit(EXTI_Line13);
	 }
}

你可能感兴趣的:(#,STM32标准库,STM32,stm32)