介紹STM32F407外部中斷配置步驟,以按鍵為例,實(shí)現(xiàn)外部中斷配置,使用按鍵觸發(fā)中斷進(jìn)行LED燈控制。
【1】外部中斷相關(guān)知識(shí)介紹
CM4 內(nèi)核支持 256 個(gè)中斷,其中包含了 16 個(gè)內(nèi)核中斷和 240 個(gè)外部中斷,并且具有 256級(jí)的可編程中斷設(shè)置。但 STM32F4 并沒(méi)有使用 CM4 內(nèi)核的全部東西,而是只用了它的一部分。
STM32F40xx/STM32F41xx 總共有 92 個(gè)中斷, STM32F42xx/STM32F43xx 則總共有 96 個(gè)中斷,以下僅以 STM32F40xx/41xx 為例講解。
STM32F40xx/STM32F41xx 的 92 個(gè)中斷里面, 包括 10 個(gè)內(nèi)核中斷和 82 個(gè)可屏蔽中斷,具有 16 級(jí)可編程的中斷優(yōu)先級(jí), 而我們常用的就是這 82 個(gè)可屏蔽中斷。
【2】外部中斷示例代碼
exti.c代碼
#include "exti.h"
?
/*
函數(shù)功能:按鍵外部中斷初始化
硬件連接:
KEY0 --- >PE4 按下為低電平
KEY1 --- >PE3 按下為低電平
KEY2 --- >PE2 按下為低電平
KEY_UP-- >PA0 按下為高電平
*/
void KEY_EXTI_Init(void)
{
/*1. 開(kāi)啟SYSCFG時(shí)鐘 */
RCC- >APB2ENR|=1< 14;
/*2. 開(kāi)放來(lái)自線x上的中斷請(qǐng)求*/
EXTI- >IMR|=1< 0; //中斷線0
EXTI- >IMR|=1< 2; //中斷線2
EXTI- >IMR|=1< 3; //中斷線3
EXTI- >IMR|=1< 4; //中斷線4
/*3. 配置中斷線觸發(fā)邊沿*/
EXTI- >RTSR|=1< 0; //上升沿
EXTI- >FTSR|=1< 0; //下降沿
EXTI- >RTSR|=1< 2; //上升沿
EXTI- >FTSR|=1< 2; //下降沿
EXTI- >RTSR|=1< 3; //上升沿
EXTI- >FTSR|=1< 3; //下降沿
EXTI- >RTSR|=1< 4; //上升沿
EXTI- >FTSR|=1< 4; //下降沿
/*4. 配置產(chǎn)生中斷的對(duì)應(yīng)IO口*/
SYSCFG- >EXTICR[0]&=~(0xf< 0*4);
SYSCFG- >EXTICR[0]|=0x0< 0*4;
SYSCFG- >EXTICR[0]&=~(0xf< 2*4);
SYSCFG- >EXTICR[0]|=0x4< 2*4;
SYSCFG- >EXTICR[0]&=~(0xf< 3*4);
SYSCFG- >EXTICR[0]|=0x4< 3*4;
SYSCFG- >EXTICR[1]&=~(0xf< 0*4);
SYSCFG- >EXTICR[1]|=0x4< 0*4;
/*5. 配置中斷優(yōu)先級(jí)*/
SetNVICPriorityGrouping(EXTI0_IRQn,2,2);
SetNVICPriorityGrouping(EXTI2_IRQn,2,2);
SetNVICPriorityGrouping(EXTI3_IRQn,2,2);
SetNVICPriorityGrouping(EXTI4_IRQn,2,2);
}
?
/*
功 能:外部中斷線0中斷服務(wù)函數(shù)
*/
?
void EXTI0_IRQHandler(void)
{
DelayMs(10);
if(KEY_UP)
{
LED0=!LED0;
LED1=!LED1;
printf("KEY_UP\\r\\n");
}
EXTI- >PR|=1< 0; //清除中斷標(biāo)志位
}
?
/*
功 能:外部中斷線2中斷服務(wù)函數(shù)
*/
void EXTI2_IRQHandler(void)
{
DelayMs(10);
if(KEY2==0)
{
LED0=!LED0;
LED1=!LED1;
printf("KEY2\\r\\n");
}
EXTI- >PR|=1< 2