1.中断基本知识
1.知识点: STM32的所有中断(内部或外部)都是由NVIC(嵌套向量中断控制器)控制
注意:在KEIL5工程中的fwlib分组中,misc.c文件提供了NVIC相关的固件库函数。
2.中断源 :引起CPU中断的根源,称为中断源。
3.中断源向CPU提出的中断请求。CPU暂时中断原来的事务A,转去处玛事件B。对事件B处理完毕后,再回到原来被中断的地方(即断点),称为中断返回。实现上述中断功能的部件称为中断系统(中断机构)。
2.中断分类
1. STM32中断系统包括内部中断和外部中断
1.内部中断是指STM32内置外设或接口产生的中断,如定时器TIMx、串口UART中断等。
2.外部中断是指独立于STM32的外部器件,通过I/O引脚产生的请求STM32处理的中断,
FLASH如按键、Lora模块请求的中断等。
3.中断分组 ,每个组的优先级,与响应优先级
4.内部中断的使用 的配置
1.第一步:配置NVIC属性,包括:
1.配置IRQ号;
2.中断优先级(组优先级和组内子优先级)
3.使能对应的IRQ中断。
5.外部中断的使用 配置
1.配置外部的中断线
2. 配置流程
3.代码:
.h 文件
#ifndef __MYEXIT_H__
#define __MYEXIT_H__
void MYEXIT_init(void);//初始化
#endif
.cpp
#include "MYEXIT.h"
#include "stm32f4xx.h" //头文件
#include "stm32f4xx_rcc.h"
#include "stm32f4xx_gpio.h"
#include "KEY.h"
#include "LED.h"
#include "mysystick.h"
void MYEXIT_init(void)//初始化
{
EXTI_InitTypeDef EXTI_InitStructure;
NVIC_InitTypeDef NVIC_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG,ENABLE);//中断使能
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//分组
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE,EXTI_PinSource5);//绑定端口
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE,EXTI_PinSource4);//绑定端口
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE,EXTI_PinSource6);//绑定端口
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOC,EXTI_PinSource13);//绑定端口
EXTI_InitStructure.EXTI_Line = EXTI_Line5 | EXTI_Line4 |EXTI_Line6 |EXTI_Line13;//那根中断线
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//设置中断和事件
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;//下降沿触发
EXTI_InitStructure.EXTI_LineCmd = ENABLE; //中断使能
EXTI_Init(&EXTI_InitStructure);
NVIC_InitStruct.NVIC_IRQChannel = EXTI4_IRQn;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority =1;//设置抢占优先级
NVIC_InitStruct.NVIC_IRQChannelSubPriority =1; //设置响应优先级
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;//使能
NVIC_Init(&NVIC_InitStruct);
NVIC_InitStruct.NVIC_IRQChannel = EXTI9_5_IRQn;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority =2;//设置抢占优先级
NVIC_InitStruct.NVIC_IRQChannelSubPriority =2; //设置响应优先级
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;//使能
NVIC_Init(&NVIC_InitStruct);
NVIC_InitStruct.NVIC_IRQChannel = EXTI15_10_IRQn;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority =2;//设置抢占优先级
NVIC_InitStruct.NVIC_IRQChannelSubPriority =1; //设置响应优先级
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;//使能
NVIC_Init(&NVIC_InitStruct);
}
void EXTI9_5_IRQHandler(void)
{
static int BEEP_a=1;
static int LED=1;
if(EXTI_GetITStatus(EXTI_Line5) != RESET)//按下KEY2
{
delay_ms(20);
if(key_youxi()==2)
{
if(LED%2==1)
{
select_led(2);
LED++;
}
else if(LED%2==0)
{
close_num_led(2);
LED++;
}
}
EXTI_ClearITPendingBit(EXTI_Line5);
}
else if(EXTI_GetITStatus(EXTI_Line6) != RESET) //按下KEY3
{
delay_ms(20); //消除抖动
if(key_youxi()==3)
{
if(BEEP_a%2==1)
{
openBeep();
BEEP_a++;
}
else if(BEEP_a%2==0)
{
closeBeep();
BEEP_a++;
}
}
EXTI_ClearITPendingBit(EXTI_Line6);
}
}
void EXTI4_IRQHandler(void)
{
static int LED=1;
delay_ms(20);
if(key_youxi()==1)
{
if(LED%2==1)
{
select_led(1);
LED++;
}
else if(LED%2==0)
{
close_num_led(1);
LED++;
}
}
EXTI_ClearITPendingBit(EXTI_Line4);
}
void EXTI15_10_IRQHandler(void)
{
static int LED=1;
delay_ms(20); //消除抖动
if(key_youxi()==4)
{
if(LED%2==1)
{
select_led(3);
LED++;
}
else if(LED%2==0)
{
close_num_led(3);
LED++;
}
}
EXTI_ClearITPendingBit(EXTI_Line13);
}