一 、什么是中断 ?
单片机的中断具有外部中断和内部中断,对于中断的理解很多博主讲解得很好,大家可以去学习一下,中断在单片机的学习过程中是非常重要的内容。
我认为中断最为简单的理解就是: 暂停当前的工作,去处理别的工作,别的工作处理完成后再回来继续完成当前的工作。假如你正在吃饭,妈妈叫你去收衣服,此时你便要停止吃饭,去收衣服,当衣服收完后,你又回来接着吃饭。
外部中断: 通过外部给定一个特定的信号,单片机监测该信号,最后做出相应的反应。
二、实现效果:
通过外部按键(按键连接PA0引脚: “实际控制中最好进行消抖处理”)实现Led灯闪烁一次 (LED连接 PC13引脚)
三、中断程序配置
本程序中使用的EXTI0外部中断。
Code: Exti.c
#include "exti.h"
#include "delay.h"
void My_EXTI_Init(void)
{
EXTI_InitTypeDef EXTI_InitStruct; //定义外部中断结构体
NVIC_InitTypeDef NVIC_InitStruct; //定义中断源结构体
// KEY_Init();
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //打开复用端口使用,因为外部中断使用的引脚是与普通I/O进行复用的
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0); //外部中断使用GPIOA上的PIN0引脚
EXTI_InitStruct.EXTI_Line=EXTI_Line0; //使用的外部中断线为EXTI0
EXTI_InitStruct.EXTI_LineCmd=ENABLE; // 使能外部中断
EXTI_InitStruct.EXTI_Mode=EXTI_Mode_Interrupt; // 中断模式
EXTI_InitStruct.EXTI_Trigger=EXTI_Trigger_Falling; //使用下降沿触发外部中断
EXTI_Init(&EXTI_InitStruct); //初始化外部中断结构体
NVIC_InitStruct.NVIC_IRQChannel=EXTI0_IRQn; // 中断源为外部中断EXTI0
NVIC_InitStruct.NVIC_IRQChannelCmd =ENABLE; //使能中断源
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority =2; //主中断优先级为2
NVIC_InitStruct.NVIC_IRQChannelSubPriority =2; //子中断优先级为2
NVIC_Init(&NVIC_InitStruct); //初始化中断源结构体
}
//中断函数
void EXTI0_IRQHandler(void) //中断函数的名称是不能自己随意命名的,在特定的文件中查找你,前面的串口通信中断部分已经详细的讲解,请看前面的文章。
{
GPIO_ResetBits(GPIOC,GPIO_Pin_13);
delay(50000);
GPIO_SetBits(GPIOC,GPIO_Pin_13);
delay(50000);
GPIO_ResetBits(GPIOC,GPIO_Pin_13);
EXTI_ClearFlag(EXTI_Line0); //清除中断标志位
}
Code: Exti.h
#ifndef _EXTI_H_
#define _EXTI_H_
#include "stm32f10x.h"
void My_EXTI_Init(void);
#endif
#include "stm32f10x.h"
#include "led.h"
#include "delay.h"
#include "exti.h"
#include "led.h"
#include "delay.h"
//LED初始化
void Led_funcing(){
GPIO_DeInit(LED_GPIO_PORT);// 注意这里的函数非常的重要,这里是将对应的GPIO端口初始化成默认的样子,因为这个端口可能在以前使用过,其他的配置可能发生了改变
GPIO_InitTypeDef GPIOC_LED_Init; // 定义GPIO的结构体,也就是外设的结构体
RCC_APB2PeriphClockCmd( LED_GPIO_CLK,ENABLE); //打开对应的GPIO的时钟,注意这里不同的外设可能挂载的时钟不同,所以需要开原理图,
GPIOC_LED_Init.GPIO_Pin=LED_GPIO_PIN ; // 配置需要使用的引脚
GPIOC_LED_Init.GPIO_Mode=GPIO_Mode_Out_PP; //配置引脚的输出的模式
GPIOC_LED_Init.GPIO_Speed=GPIO_Speed_50MHz; // 配置输出的频率,这个在输入的时候不需要配置
GPIO_Init(LED_GPIO_PORT,&GPIOC_LED_Init); // 使用初始化函数初始化刚刚定义的结构体,以及对应的GPIO端口
GPIO_SetBits(LED_GPIO_PORT,LED_GPIO_PIN);
}
//按键初始化 (外部中断触发器)
void Key_Init(void )
{
GPIO_DeInit(GPIOA);
GPIO_InitTypeDef Key_GPIO_Struct;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA,ENABLE);
Key_GPIO_Struct.GPIO_Pin= GPIO_Pin_0;
Key_GPIO_Struct.GPIO_Mode=GPIO_Mode_IPU; // 输入端口的模式为上拉输入,表示该该引脚在空闲时处于高电平状态,常用的浮空输入是空闲时引脚点电平处于不确定状态
GPIO_Init(GPIOA,&Key_GPIO_Struct);
}
Main.c
int main()
{
Led_funcing();
Key_Init();
My_EXTI_Init();
while(1)
{
}
}
文章来源: 博客园
- 还没有人评论,欢迎说说您的想法!