首先介绍什么是中断,指CPU对外部事件发出的中断请求进行响应和处理,完成后返回程序断点处继续之前的工作。打一个很简单的比方,你在家看电视时突然门铃响了,这就是一个中断请求,然后你就去开门,结果发现是快递来了,你签收完快递回到家继续看电视,这就是一整个中断过程。
再来说说中断的抢占优先级和响应优先级,当你看电视时家里的电话和门铃同时响了,也就是同时有两个中断发生,那么CPU要响应先那个中断就要看中断优先级,如果中断优先级相同时再看响应优先级。STM32F4中需要设置中断优先级分组,如果不设置就是默认抢占优先级和响应优先级都占两位,也就是从零到三,值越小优先级越高。
整个中断过程可以分为三步:
1.中断检测
2.中断响应
3.中断挂起
在STM32F4中以按键外部中断为例,需要以下几个步骤:
1.定义NVIC、EXTI结构体
2.使能系统时钟
3.设置IO口和中断的映射关系
4.配置外部中断EXTI控制寄存器
5.配置NVIC控制寄存器
6.中断服务函数
关于NVIC和EXTI寄存器的区别:NVIC是嵌套向量中断控制器,而EXTI为外部中断控制器。NVIC相当于控制中断的大开关,而EXTI只是系统中断里面外部中断的小开关。
为什么要使能系统时钟:STM32F4有两条总线:AHP即advanced high performance bus 高级高性能总线和APB即advanced periphoral bus高级外设总线。如图
在每次芯片复位后,所有外设时钟都被关闭了,SRAM和FLASH除外,所以在使用外设时需要使能时钟,这么做的目的是为了降低芯片的功耗,开启时钟相当于提供电源。在STM32F4中文参考手册2.2节存储器组织结构中可以看到外设挂载到那根总线上。
代码如下:
`#include “EXTI.h”
void EXTI2_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line2)!=RESET)
{
GPIO_WriteBit(GPIOE,GPIO_Pin_13,!GPIO_ReadOutputDataBit(GPIOE,GPIO_Pin_13));
}
EXTI_ClearITPendingBit(EXTI_Line2);
}
void InitExit(void)
{
NVIC_InitTypeDef NVIC_InitStruct;
EXTI_InitTypeDef EXTI_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG,ENABLE);
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE,EXTI_PinSource2);
EXTI_InitStruct.EXTI_Mode=EXTI_Mode_Interrupt;
EXTI_InitStruct.EXTI_Trigger=EXTI_Trigger_Falling;
EXTI_InitStruct.EXTI_Line=EXTI_Line2;
EXTI_InitStruct.EXTI_LineCmd=ENABLE;
EXTI_Init(&EXTI_InitStruct);
NVIC_InitStruct.NVIC_IRQChannel=EXTI2_IRQn;
NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=2;
NVIC_InitStruct.NVIC_IRQChannelSubPriority=1;
NVIC_Init(&NVIC_InitStruct);
}
`
从keil软件复制过来注释全乱了,所以删掉了注释,那么两个结构体的成员变量怎么设置如图:
需要注意的就是怎么选择中断线,在哪个GPIO管脚上就选择那根线,这是内部结构决定的,如图是用选择器来进行选择的。
还有一点必须注意中断服务函数名称不能写错,都为EXTI2(此处为中断线编号)_IRQHandler如果写错既不会报错也无法进入中断服务函数。
首先介绍什么是中断,指CPU对外部事件发出的中断请求进行响应和处理,完成后返回程序断点处继续之前的工作。打一个很简单的比方,你在家看电视时突然门铃响了,这就是一个中断请求,然后你就去开门,结果发现是快递来了,你签收完快递回到家继续看电视,这就是一整个中断过程。
再来说说中断的抢占优先级和响应优先级,当你看电视时家里的电话和门铃同时响了,也就是同时有两个中断发生,那么CPU要响应先那个中断就要看中断优先级,如果中断优先级相同时再看响应优先级。STM32F4中需要设置中断优先级分组,如果不设置就是默认抢占优先级和响应优先级都占两位,也就是从零到三,值越小优先级越高。
整个中断过程可以分为三步:
1.中断检测
2.中断响应
3.中断挂起
在STM32F4中以按键外部中断为例,需要以下几个步骤:
1.定义NVIC、EXTI结构体
2.使能系统时钟
3.设置IO口和中断的映射关系
4.配置外部中断EXTI控制寄存器
5.配置NVIC控制寄存器
6.中断服务函数
关于NVIC和EXTI寄存器的区别:NVIC是嵌套向量中断控制器,而EXTI为外部中断控制器。NVIC相当于控制中断的大开关,而EXTI只是系统中断里面外部中断的小开关。
为什么要使能系统时钟:STM32F4有两条总线:AHP即advanced high performance bus 高级高性能总线和APB即advanced periphoral bus高级外设总线。如图
在每次芯片复位后,所有外设时钟都被关闭了,SRAM和FLASH除外,所以在使用外设时需要使能时钟,这么做的目的是为了降低芯片的功耗,开启时钟相当于提供电源。在STM32F4中文参考手册2.2节存储器组织结构中可以看到外设挂载到那根总线上。
代码如下:
`#include “EXTI.h”
void EXTI2_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line2)!=RESET)
{
GPIO_WriteBit(GPIOE,GPIO_Pin_13,!GPIO_ReadOutputDataBit(GPIOE,GPIO_Pin_13));
}
EXTI_ClearITPendingBit(EXTI_Line2);
}
void InitExit(void)
{
NVIC_InitTypeDef NVIC_InitStruct;
EXTI_InitTypeDef EXTI_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG,ENABLE);
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE,EXTI_PinSource2);
EXTI_InitStruct.EXTI_Mode=EXTI_Mode_Interrupt;
EXTI_InitStruct.EXTI_Trigger=EXTI_Trigger_Falling;
EXTI_InitStruct.EXTI_Line=EXTI_Line2;
EXTI_InitStruct.EXTI_LineCmd=ENABLE;
EXTI_Init(&EXTI_InitStruct);
NVIC_InitStruct.NVIC_IRQChannel=EXTI2_IRQn;
NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=2;
NVIC_InitStruct.NVIC_IRQChannelSubPriority=1;
NVIC_Init(&NVIC_InitStruct);
}
`
从keil软件复制过来注释全乱了,所以删掉了注释,那么两个结构体的成员变量怎么设置如图:
需要注意的就是怎么选择中断线,在哪个GPIO管脚上就选择那根线,这是内部结构决定的,如图是用选择器来进行选择的。
还有一点必须注意中断服务函数名称不能写错,都为EXTI2(此处为中断线编号)_IRQHandler如果写错既不会报错也无法进入中断服务函数。
举报