標(biāo)題:
STM32之外部中斷
[打印本頁]
作者:
51黑tt
時間:
2016-3-4 20:18
標(biāo)題:
STM32之外部中斷
試驗?zāi)康模罕敬卧囼炗冒存I來控制兩個LED,使用外部中斷的方式來觸發(fā)
試驗平臺:基于STM32F103C8T6的彩屏開發(fā)板
接口:KEY1——PA9
KEY2——PA10
LED1——PA11
LED2——PA12
試驗基本步驟:1)初始化IO 口為輸入。
2)開啟IO 口復(fù)用時鐘,設(shè)置IO 口與中斷線的映射關(guān)系。
3)開啟與該IO 口相對的線上中斷/事件,設(shè)置觸發(fā)條件。
4)配置中斷分組(NVIC),并使能中斷。
5)編寫中斷服務(wù)函數(shù)。
程序代碼:led.c led.h key.h key.c 和之前的按鍵以致
新加的
exit.h
#ifndef EXIT_H
#define EXIT_H
void EXTIX_Init(void);
#endif
僅僅是申明了一個中斷初始化函數(shù)
exit.c
#include<stm32f10x_lib.h>
#include"common.h"
#include"exit.h"
#include"key.h"
#include"led.h"
void EXTI15_10_IRQHandler(void) //中斷服務(wù)函數(shù)
{
delay_ms(10); //消抖
if(KEY1==0) //按鍵0
{
LED1=!LED1;
}else if(KEY2==0)//按鍵1
{
LED2=!LED2;
}
EXTI->PR=1<<11; //清除LINE13上的中斷標(biāo)志位
EXTI->PR=1<<12; //清除LINE15上的中斷標(biāo)志位
}
void EXTIX_Init(void)
{
RCC->APB2ENR|=1<<2;
GPIOA->CRH&=0xfff00fff; //配置為推挽輸出
GPIOA->CRH|=0x00088000;
GPIOA->ODR|=1<<11; //拉高
GPIOA->ODR|=1<<12;
Ex_NVIC_Config(GPIO_A,11,FTIR); //下降沿觸發(fā)
Ex_NVIC_Config(GPIO_A,12,FTIR);
MY_NVIC_Init(2,1,EXTI15_10_IRQChannel,2); //搶占2,子優(yōu)先級1,組2
}
exit.c 文件總共包含2個函數(shù)。一個是外部中斷初始化函數(shù)voidEXTIX_Init(void),另外一個是中斷服務(wù)函數(shù)。voidEXTI15_10_IRQHandler(void)是外部中斷10~15 的中斷服務(wù)函數(shù),這里
我們是用了中斷11 和12,這兩個中斷共用一個中斷服務(wù)函數(shù)。下面我們分別介紹這幾個函數(shù)。
首先是外部中斷初始化函數(shù) void EXTIX_Init(void),該函數(shù)嚴(yán)格按照我們之前的步驟來初
始化外部中斷,這里面調(diào)用了兩個函數(shù) Ex_NVIC_Config和MY_NVIC_Init,其作用是設(shè)置中斷的觸發(fā)方式和中斷的優(yōu)先級。KEY1 和KEY2 是低電平有效的,KEY1
和KEY2 設(shè)置成上拉輸入。當(dāng)中斷觸發(fā)的時候,而KEY1 和
KEY2 會產(chǎn)生下降沿。這里我們把分配到第二組。
接 下 來 我 們 介 紹 中 斷 服 務(wù) 函 數(shù) 。 中
斷服務(wù)函數(shù)void EXTI15_10_IRQHandler(void),從
函數(shù)名就可以看出是給中斷線10~15 服務(wù)的,也就是多個中斷線上的中斷共用一個中斷服務(wù)函
數(shù)。在該函數(shù)里面我們先對進入中斷的信號進行區(qū)分(通過中斷輸入IO 口上的電平判斷),再
分別進行處理。最后也是通過向EXTI->PR 的對應(yīng)位寫1 清除中斷線上的中斷請求。
主函數(shù)
main.c
//外部中斷的實驗,有兩個按鍵來觸發(fā)控制LED
#include<stm32f10x_lib.h>
#include"common.h"
#include"led.h"
#include"exit.h"
int main(void)
{
Stm32_Clock_Init(9);//系統(tǒng)時鐘初始化
delay_init(72);//延時函數(shù)的初始化
LED_Init();//LED燈的初始化
EXTIX_Init();//外部中斷的初始化
while(1)
{ }//等待中斷
}
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1