【嵌入式学习笔记】STM32中断配置及相关知识
中断
中断配置
1、使能GPIO
2、使能系统时钟
3、配置引脚
4、配置映射关系
5、配置EXTI
6、启用并设置EXTI
#include "stm32f4xx.h" // Device header
#include "sys.h"
#include "delay.h"
#include "led.h"
void init_exti(void)
{
EXTI_InitTypeDef EXTI_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
/* Enable GPIOE clock */
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);
/* Enable SYSCFG clock */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
/* Configure PE2 pin as input floating */ /* 配置PE2引脚为输入浮动 */
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; // 输入模式
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP ; // 上拉电阻
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_Init(GPIOE, &GPIO_InitStructure);
/* Connect EXTI Line2 to PE2 pin */ /* 配置映射关系 */
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource2);
/* Configure EXTI Line2 */
/* 配置 EXTI Line2 */
EXTI_InitStructure.EXTI_Line = EXTI_Line2;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; // 中断模式
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; // 下降沿触发
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
/* Enable and set EXTI Line2 Interrupt to the lowest priority */
/* 启用并设置EXTI Line2 Interrupt为最低优先级 */
NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0F;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0F;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
void EXTI2_IRQHandler(void) // 中断服务函数
{
if(EXTI_GetITStatus(EXTI_Line2) != RESET)
{
PFout(9) ^= 1; // 异或赋值,
/* Clear the EXTI line 0 pending bit */
EXTI_ClearITPendingBit(EXTI_Line2); // 清除中断标志位
}
}
int main()
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
init_exti();
init_led();
while(1)
{
}
}
描述一下中断的执行流程?
答:CPU正在执行当前程序,由于某个事件的发生产生了中断请求,导致CPU暂停当前程序执行,中断请求会经过中断通道到达NVIC,NVIC去调用专门的中断服务函数执行,执行完毕返回当前程序继续执行。
中断服务函数应该注意的四大点:
答: 1.中断服务函数不能传入参数; 2.中断服务函数不能有返回值; 3.中断服务函数应做到短小精悍; 4.不要在中断函数中使用printf函数,会带来重入和性能问题
为什么要在中断服务函数中清除中断标志位?
如果进入中断不清除标志位,那么这一中断服务程序结束后由于标志位还是置位的并且中断是允许的,那么还会再次进入该中断,就会发生一直在执行中断程序的情况。
为什么中断服务函数不能自定义函数名?
硬件要求:ISR名称需与中断向量表中的条目匹配,确保中断能正确路由到相应的处理函数。 自动生成的代码:编译器和工具链可能自动生成ISR的名称和相关代码,自定义名称可能导致不匹配。 编译器规范:编译器和链接器有特定规则来识别ISR名称,使用不匹配的名称会引发错误。 标准化:统一的ISR名称有助于代码的可维护性和一致性。
关于中断的知识点
1、当CPU正在执行某个程序时,由计算机内部或外部的原因引起的紧急事件向CPU发出请求处理的信号,CPU在允许的情况下响应请求处理信号,暂时停止正在执行的程序,保护好断点处的现场,转向执行一个用于处理该紧急事件的程序,处理完后又返回被中止的程序断点处,继续执行原程序,这一过程就称为中断。 2、在Cortex-M3内核中集成了中断控制器和中断优先级控制寄存器,Cortex-M3内核支持256个中断,其中包含16个内核中断(也称为系统异常)和240个外部中断,并具有256级可编程的中断优先级设置。其中,除个别异常的优先级被固定外,其他优先级都是可编程的。 3、STM32有84个中断,包括16个Cortex-M3内核中断线和68个可屏蔽中断通道,具有16级可编程中断优先级的设置(仅使用中断优先级设置8位中的高4位)。 4、STM32内核有两个中断优先级,分别是抢占优先级和响应优先级(也称为子优先级),每个中断源都需要指定这两种中断优先级。具有高抢占优先级的中断,可以在具有低抢占优先级的中断处理过程中被响应,即中断嵌套。 5、 STM32外部中断编程主要涉及外部中断/事件管理库函数、嵌套向量中断控制器NVIC库函数以及中断服务函数等。