一、什么是外部中断?
在这里,为了好理解,作者就不讲理论了,害怕各位有点迷,直接上图: 这张图就是整个中断系统的示意图。
二、怎么使用中断及配置
1.引脚中断配置
我们在使用中断时,有很多类型的中断,比如说,定时器中断、DMA中断、串口中断等等,我们在这里采用的按键提供中断源,注意:我们这里使用的中断和按键都是使用的按键,但是他俩有着很大的区别,他们两个从根上是不一样的,所以我们要分清。
开发板的中断引脚
我们使用的是正点原子开发板 我们采用的的中断引脚是PE4和PE3,所以在这里就要配置相关的数据。
2.代码编写
#include "exit.h"
#include "delay.h"
#include "led.h"
void EXTI_INIT()
{
GPIO_InitTypeDef GPIO_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE|RCC_APB2Periph_AFIO,ENABLE);
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOE,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOE,&GPIO_InitStructure);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource4);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource3);
EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_Line=EXTI_Line4;
EXTI_InitStructure.EXTI_LineCmd=ENABLE;
EXTI_Init(&EXTI_InitStructure);
EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_Line=EXTI_Line3;
EXTI_InitStructure.EXTI_LineCmd=ENABLE;
EXTI_Init(&EXTI_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel=EXTI4_IRQn;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=2;
NVIC_Init(&NVIC_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel=EXTI3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=2;
NVIC_Init(&NVIC_InitStructure);
}
void EXTI4_IRQHandler()
{
delay_ms(10);
if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4)==0)
{
delay_ms(10);
if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4)==0)
{
LED0_ON;
EXTI_ClearITPendingBit(EXTI_Line4);
}
}
}
void EXTI3_IRQHandler()
{
delay_ms(10);
if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3)==0)
{
delay_ms(10);
if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3)==0)
{
LED0_OFF;
EXTI_ClearITPendingBit(EXTI_Line3);
}
}
}
main.c文件
#include "stm32f10x.h"
#include "delay.h"
#include "led.h"
#include "exit.h"
int main(void)
{
LED_Init();
EXTI_INIT();
delay_init();
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
while(1)
{
}
}
总结
剩下的就是自己看实验结果了,代码基本上每行都有注释,便于理解,还有每个函数啥意思,都有解释。 最后源代码放在最后:需要的自行下载 链接:https://pan.baidu.com/s/1pkWfGbgqz3NNfIaHSzoBbw 提取码:s09h
|