【實(shí)驗(yàn)三】外部中斷實(shí)驗(yàn)
一、實(shí)驗(yàn)?zāi)康?/p>
1)了解STM32外部中斷相關(guān)知識(shí);
2)使用STM32外部中斷,實(shí)現(xiàn)兩個(gè)LED燈亮滅;
二、STM32外部中斷簡(jiǎn)介
1)STM32F103系列有60個(gè)可屏蔽中斷;支持19個(gè)外部中斷/事件請(qǐng)求。每個(gè)中斷設(shè)有狀態(tài)位,每個(gè)中斷/事件都有獨(dú)立的觸發(fā)和屏蔽設(shè)置。
STM32F103 的19 個(gè)外部中斷為:
線 0~15:對(duì)應(yīng)外部 IO 口的輸入中斷。
線 16:連接到 PVD 輸出。
線 17:連接到 RTC 鬧鐘事件。
線 18:連接到 USB 喚醒事件。
中斷線對(duì)應(yīng)為:
2)外部中斷函數(shù):
EXPORT EXTI0_IRQHandler
EXPORT EXTI2_IRQHandler
EXPORT EXTI4_IRQHandler
EXPORT EXTI15_10_IRQHandler
EXPORT EXTI9_5_IRQHandler
EXPORT EXTI1_IRQHandler
EXPORT EXTI3_IRQHandler
中斷線 0-4 每個(gè)中斷線對(duì)應(yīng)一個(gè)中斷函數(shù), 中斷線 5-9 共用中斷函數(shù) EXTI9_5_IRQHandler,中斷線 10-15 共用中斷函數(shù) EXTI15_10_IRQHandler。
在編寫中斷服務(wù)函數(shù)的時(shí)候會(huì)經(jīng)常使用到兩個(gè)函數(shù), 第一個(gè)函數(shù)是判斷某個(gè)中斷線上的中斷是否發(fā)生(標(biāo)志位是否置位):
ITStatus EXTI_GetITStatus(uint32_t EXTI_Line);
這個(gè)函數(shù)一般使用在中斷服務(wù)函數(shù)的開(kāi)頭判斷中斷是否發(fā)生。 另一個(gè)函數(shù)是清除某個(gè)中斷線上的中斷標(biāo)志位:
void EXTI_ClearITPendingBit(uint32_t EXTI_Line);
這個(gè)函數(shù)一般應(yīng)用在中斷服務(wù)函數(shù)結(jié)束之前, 清除中斷標(biāo)志位。
3)IO口外部中的一般步驟
1) 初始化 IO 口為輸入。
2) 開(kāi)啟 IO 口復(fù)用時(shí)鐘,設(shè)置 IO 口與中斷線的映射關(guān)系。
3) 初始化線上中斷, 設(shè)置觸發(fā)條件等。
4) 配置中斷分組( NVIC),并使能中斷。
5) 編寫中斷服務(wù)函數(shù)。
三、硬件設(shè)計(jì)
LED燈、按鍵。
四、軟件設(shè)計(jì)
exti.c 主要涉及初始化以及中斷函數(shù)的實(shí)現(xiàn)
//外部中斷0服務(wù)程序
voidEXTIX_Init(void)
{
EXTI_InitTypeDefEXTI_InitStructure;
NVIC_InitTypeDefNVIC_InitStructure;
KEY_Init();//按鍵端口初始化
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//使能復(fù)用功能時(shí)鐘
//GPIOE.2中斷線以及中斷初始化配置下降沿觸發(fā)
GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource2);
EXTI_InitStructure.EXTI_Line=EXTI_Line2;//KEY2
EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd=ENABLE;
EXTI_Init(&EXTI_InitStructure);//根據(jù)EXTI_InitStruct中指定的參數(shù)初始化外設(shè)EXTI寄存器
NVIC_InitStructure.NVIC_IRQChannel=EXTI0_IRQn;//使能按鍵WK_UP所在的外部中斷通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x02;//搶占優(yōu)先級(jí)2,
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x03;//子優(yōu)先級(jí)3
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;//使能外部中斷通道
NVIC_Init(&NVIC_InitStructure);//使能外部中斷通道
NVIC_Init(&NVIC_InitStructure);//根據(jù)NVIC_InitStruct中指定的參數(shù)初始化外設(shè)NVIC寄存器
}
中斷函數(shù)實(shí)現(xiàn):功能的實(shí)現(xiàn)也主要是在中斷函數(shù)中實(shí)現(xiàn)
voidEXTI0_IRQHandler(void)
{
delay_ms(10);//消抖
if(KEY3==1)//按鍵KEY3
{
LED0=!LED0;
}
EXTI_ClearITPendingBit(EXTI_Line0);//清除LINE0上的中斷標(biāo)志位
}
五、實(shí)驗(yàn)結(jié)果
成功!