目錄
中斷簡(jiǎn)介
程序
?注:
中斷簡(jiǎn)介
(1)????????EXTI(外部中斷):EXTI是ST公司在其STM32產(chǎn)品上擴(kuò)展的外中斷控制。它負(fù)責(zé)管理映射到GPIO引腳上的外中斷和片內(nèi)幾個(gè)集成外設(shè)的中斷,以及軟件中斷。其輸出最終被映射到NVIC的相應(yīng)通道。因此,配置EXTI中斷的過(guò)程必然包含對(duì)NVIC的配置。
(2)????????NVIC(嵌套向量中斷):嵌套向量中斷控制器,屬于內(nèi)核外設(shè), 管理著包括內(nèi)核和片上所有外設(shè)的中斷相關(guān)的 功能。嵌套向量中斷控制器(NVIC)和處理器核的接口緊密相連,可以實(shí)現(xiàn)低延遲的中斷處理和高效地 處理晚到的中斷。
?????????至于兩者的作用,我們就舉個(gè)例子來(lái)說(shuō)一下。
????????例如下面配置EXTI0的過(guò)程,就要首先配置EXTI控制器(使能相應(yīng)的中斷線,選擇中斷/事件模式,觸發(fā)邊沿極性),然后再配置NVIC控制器(EXTI0映射在NVIC上的通道號(hào),中斷優(yōu)先級(jí),中斷屏蔽狀態(tài))。也就是EXTI類(lèi)比成小門(mén),而NVIC是大門(mén),二者是相互聯(lián)通的,我們使用EXTI來(lái)選擇中斷的中斷源,NVIC判決中斷源的執(zhí)行順序。
?程序的編寫(xiě)就是按照這個(gè)流程來(lái)的,這里是有兩條線路,一條事件中斷,另一條為NVIC中斷控制器,編寫(xiě)程序已NVIC中斷為例!
程序
? ? ? ? 為了大家更好的理解,我們就寫(xiě)一個(gè)按鍵中斷來(lái)檢驗(yàn)一下。
LED.c
#include "bsp_led.h"
/**
* @brief 初始化控制LED的IO
* @param 無(wú)
* @retval 無(wú)
*/
void LED_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
RCC_APB2PeriphClockCmd(LED_GPIO_CLK,ENABLE);
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP ;
GPIO_InitStruct.GPIO_Pin=LED_RED_PIN|LED_GREEN_PIN|LED_YELLOW_PIN;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz ;
GPIO_SetBits(LED_PORT,LED_RED_PIN|LED_GREEN_PIN|LED_YELLOW_PIN);
GPIO_Init(LED_PORT,&GPIO_InitStruct);
}
LED.h
#ifndef __LED_H
#define __LED_H
#include "stm32f10x.h"
//LED
#define LED_GPIO_CLK RCC_APB2Periph_GPIOB
#define LED_GREEN_PIN GPIO_Pin_0
#define LED_PORT GPIOB
#define LED_RED_PIN GPIO_Pin_5
#define LED_YELLOW_PIN GPIO_Pin_1
#define ON 1
#define OFF 0
#define LED_GREEN(a) if(a)\
{GPIO_ResetBits(LED_PORT,LED_GREEN_PIN);}\
else\
{GPIO_SetBits(LED_PORT,LED_GREEN_PIN);}
#define LED_RED(a) if(a)\
{GPIO_ResetBits(LED_PORT,LED_RED_PIN);}\
else\
{GPIO_SetBits(LED_PORT,LED_RED_PIN);}
#define LED_YELLOW(a) if(a)\
{GPIO_ResetBits(LED_PORT,LED_YELLOW_PIN);}\
else\
{GPIO_SetBits(LED_PORT,LED_YELLOW_PIN);}
//打開(kāi)燈
#define LED_G {LED_GREEN(ON);LED_RED(OFF);LED_YELLOW(OFF);}
#define LED_R {LED_GREEN(OFF);LED_RED(ON);LED_YELLOW(OFF);}
#define LED_B {LED_GREEN(OFF);LED_RED(OFF);LED_YELLOW(ON);}
#define LED_G_TOGGLE {LED_PORT->ODR^=GPIO_Pin_0;}
//BEEPER
#define BEEP_GPIO_CLK RCC_APB2Periph_GPIOA
#define BEEP_PIN GPIO_Pin_8
#define BEEP_PORT GPIOA
void LED_GPIO_Config(void);
void BEEP_Config(void);
#endif /* __LED_H */
KEY.h
#ifndef ___bsp_key____H
#define ___bsp_key____H
#include "stm32f10x.h"
//KEY1
#define KEY1_GPIO_CLK RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO
#define KEY1_GPIO_PIN GPIO_Pin_0
#define KEY1_PORT GPIOA
#define KEY1_IRQn EXTI0_IRQn
#define KEY1_PortSource GPIO_PortSourceGPIOA
#define KEY1_PinSource GPIO_PinSource0
#define KEY1_IRQHandler EXTI0_IRQHandler
#define KEY1_Line EXTI_Line0
//KEY2
#define KEY2_GPIO_CLK RCC_APB2Periph_GPIOC|RCC_APB2Periph_AFIO
#define KEY2_GPIO_PIN GPIO_Pin_13
#define KEY2_PORT GPIOC
#define KEY2_IRQn EXTI15_10_IRQn
#define KEY2_PortSource GPIO_PortSourceGPIOC
#define KEY2_PinSource GPIO_PinSource13
#define KEY2_IRQHandler EXTI15_10_IRQHandler
#define KEY2_Line EXTI_Line13
void KEY_Config(void);
#endif
KEY.c
#include "bsp_key.h"
static void NVIC_Config()
{
NVIC_InitTypeDef NVIC_Initstruct;
//嵌套向量KEY1中斷控制器
//配置優(yōu)先級(jí)組為1,級(jí)別越低,等級(jí)越高
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
//選擇中斷源——KEY1按鍵
NVIC_Initstruct.NVIC_IRQChannel=KEY1_IRQn;
//搶占優(yōu)先級(jí)配置為1
NVIC_Initstruct.NVIC_IRQChannelPreemptionPriority=1;
//子優(yōu)先級(jí)為1
NVIC_Initstruct.NVIC_IRQChannelSubPriority=1;
//使能中斷通道
NVIC_Initstruct.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_Initstruct);
//KEY2按鍵和上面的都一樣
NVIC_Initstruct.NVIC_IRQChannel=KEY2_IRQn;
NVIC_Init(&NVIC_Initstruct);
}
void KEY_Config(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
EXTI_InitTypeDef EXTI_Initatruct;
//KEY1/2時(shí)鐘使能
RCC_APB2PeriphClockCmd(KEY1_GPIO_CLK,ENABLE);
RCC_APB2PeriphClockCmd(KEY2_GPIO_CLK,ENABLE);
// 初始化中斷控制器
NVIC_Config();
//按鍵屬于輸入,所以這里上拉輸入
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN_FLOATING ;
GPIO_InitStruct.GPIO_Pin=KEY1_GPIO_PIN;
//EXTI信號(hào)源的選擇
GPIO_EXTILineConfig(KEY1_PortSource,KEY1_PinSource);
EXTI_Initatruct.EXTI_Line=EXTI_Line0;
//配置為中斷模式
EXTI_Initatruct.EXTI_Mode=EXTI_Mode_Interrupt;
//上升沿檢測(cè),這里也可以是下降沿后上升下降沿
EXTI_Initatruct.EXTI_Trigger=EXTI_Trigger_Rising;
//使能中斷
EXTI_Initatruct.EXTI_LineCmd=ENABLE;
EXTI_Init(&EXTI_Initatruct);
GPIO_Init(KEY1_PORT,&GPIO_InitStruct);
//KEY2初始化
RCC_APB2PeriphClockCmd(KEY2_GPIO_CLK,ENABLE);
GPIO_InitStruct.GPIO_Pin=KEY2_GPIO_PIN;
GPIO_Init(KEY2_PORT,&GPIO_InitStruct);
GPIO_EXTILineConfig(KEY2_PortSource,KEY2_PinSource);
EXTI_Initatruct.EXTI_Line=EXTI_Line13;
EXTI_Initatruct.EXTI_Mode=EXTI_Mode_Interrupt;
EXTI_Initatruct.EXTI_Trigger=EXTI_Trigger_Falling;
EXTI_Initatruct.EXTI_LineCmd=ENABLE;
EXTI_Init(&EXTI_Initatruct);
}
stm32f10x_it.c
void KEY1_IRQHandler(void)
{
if(EXTI_GetITStatus(KEY1_Line)!=RESET)
{
LED_B;//這里是根據(jù)自己的要求實(shí)現(xiàn)不同的函數(shù),這里以LED燈的亮滅為例
}
EXTI_ClearITPendingBit(KEY1_Line);
}
void KEY2_IRQHandler(void)
{
if(EXTI_GetITStatus(KEY2_Line)!=RESET)
{
LED_G_TOGGLE;
}
EXTI_ClearITPendingBit(KEY2_Line);
}
?把這些放入程序里面就可以了,當(dāng)然相應(yīng)的頭文件自己注意下,這里沒(méi)有其他的頭文件。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-402476.html
?注:
????????中斷函數(shù)里面的執(zhí)行的函數(shù)依據(jù)自己的要求,這里以LED燈為例。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-402476.html
到了這里,關(guān)于STM32—按鍵中斷的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!