中断相当于,在做一件事的时候,如果遇到另外一件事就去先完成这件事再来继续这件事。
首先对于中断配置过程代码
#include"exti.h"
#include <stm32f10x.h>
void Exti_Init(void)
{
GPIO_InitTypeDef fire_init;
EXTI_InitTypeDef exti_init;
NVIC_InitTypeDef nvic_init;
NVIC_PriorityGroupConfig( NVIC_PriorityGroup_2);//
//1.配置nvic抢占优先级
RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB2PeriphResetCmd(RCC_APB2Periph_AFIO,ENABLE); //配置中断寄存器
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource1);//外部中断线的配置
fire_init.GPIO_Mode = GPIO_Mode_IPU ;
fire_init.GPIO_Pin = GPIO_Pin_1;
fire_init.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_Init(GPIOA, &fire_init);
//2.配置外部中断
exti_init.EXTI_Line = EXTI_Line1;//这是GPIO1所以是1
exti_init.EXTI_LineCmd = ENABLE;//使能
exti_init.EXTI_Mode = EXTI_Mode_Interrupt;//中断模式
exti_init.EXTI_Trigger = EXTI_Trigger_Falling;//正常时高电平,反应后是低电平,所以这里是降压中断
EXTI_Init(&exti_init);
//3.配置nvic中断器,在内核中找miss.c
nvic_init.NVIC_IRQChannel = EXTI1_IRQn;//这里是找因为是GPIO1#include <stm32f10x.h>
nvic_init.NVIC_IRQChannelCmd = ENABLE;
nvic_init.NVIC_IRQChannelPreemptionPriority = 1;//先根据这个进行第一次优先级排
nvic_init.NVIC_IRQChannelSubPriority = 1;//其次根据这个来进行第二次优先级
NVIC_Init(&nvic_init); //NVIC初始化
}
中断函数去使用,可以避免取进行while死循环的浪费资源
#include "stm32f10x.h"
#include "main.h"
#include"relay.h"
#include"led.h"
#include"fire.h"
#include"exti.h"
void i_delay(uint16_t x)
{
uint16_t m;
uint16_t L;
for(L=x;L>0;L--){
for(m=1000;m>0;m--);
}
}
int main()
{
int i=0;
// Relay_Init();
LED_Init();
Fire_Init();
Exti_Init();
GPIO_SetBits(GPIOC, GPIO_Pin_13);
for(i=3;i>0;i--)
{
GPIO_ResetBits(GPIOC, GPIO_Pin_13);
i_delay(10000);
GPIO_SetBits(GPIOC, GPIO_Pin_13);
i_delay(10000);
}
while(1)
{
/* if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1)==1)
{
GPIO_ResetBits(GPIOA, GPIO_Pin_3);
i_delay(10000);
GPIO_SetBits(GPIOC, GPIO_Pin_3);
i_delay(10000);
}
else
{
GPIO_SetBits(GPIOA, GPIO_Pin_3);
}*/
}
}
void EXTI1_IRQHandler(void)//在启动文件中去找中断函数
{
if(EXTI_GetITStatus(EXTI_Line1)!=0)// RESET代表0判断是否发生中断,这里相当于GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
{
GPIO_ResetBits(GPIOA, GPIO_Pin_3);
i_delay(10000);
GPIO_SetBits(GPIOC, GPIO_Pin_3);
i_delay(10000);
}
else{
GPIO_SetBits(GPIOC, GPIO_Pin_3);
}
EXTI_ClearITPendingBit(EXTI_Line1);
}