一 、什麼是中斷 ? 單片機的中斷具有外部中斷和內部中斷,對於中斷的理解很多博主講解得很好,大家可以去學習一下,中斷在單片機的學習過程中是非常重要的內容。 我認為中斷最為簡單的理解就是: 暫停當前的工作,去處理別的工作,別的工作處理完成後再回來繼續完成當前的工作。假如你正在吃飯,媽媽叫你去收衣服,此 ...
一 、什麼是中斷 ?
單片機的中斷具有外部中斷和內部中斷,對於中斷的理解很多博主講解得很好,大家可以去學習一下,中斷在單片機的學習過程中是非常重要的內容。
我認為中斷最為簡單的理解就是: 暫停當前的工作,去處理別的工作,別的工作處理完成後再回來繼續完成當前的工作。假如你正在吃飯,媽媽叫你去收衣服,此時你便要停止吃飯,去收衣服,當衣服收完後,你又回來接著吃飯。
外部中斷: 通過外部給定一個特定的信號,單片機監測該信號,最後做出相應的反應。
二、實現效果:
通過外部按鍵(按鍵連接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)
{
}
}