1、外部中斷/事件線映射
從上表可知,STM32F10x 的 EXTI 供外部 IO 口使用的中斷線有 16 根,但是我們使用的 STM32F103 芯片卻遠(yuǎn)遠(yuǎn)不止 16 個(gè) IO 口,那么 STM32F103 芯片怎么解決這個(gè)問(wèn)題的呢?因?yàn)?STM32F103 芯片每個(gè) GPIO 端口均有 16 個(gè)管腳,因此把每個(gè) 端 口 的 16 個(gè) IO 對(duì) 應(yīng) 那 16 根 中 斷 線 EXTI0-EXTI15 。比 如 :GPIOx.0-GPIOx.15(x=A,B,C,D,E,F(xiàn),G)分別對(duì)應(yīng)中斷線 EXTI0-EXTI15,這樣一來(lái)每個(gè)中斷線就對(duì)應(yīng)了最多 7 個(gè) IO 口,比如:GPIOA.0、GPIOB.0、GPIOC.0、GPIOD.0、GPIOE.0、GPIOF.0、GPIOG.0。但是中斷線每次只能連接一個(gè)在 IO 口上,這樣就需要通過(guò) AFIO 的外部中斷配置寄存器 1 的 EXTIx[3:0]位來(lái)決定對(duì)應(yīng)的中斷線映射到哪個(gè) GPIO 端口上,對(duì)于中斷線映射到 GPIO 端口上的配置函數(shù)在stm32f10x_gpio.c 和 stm32f10x_gpio.h 中,所以使用到外部中斷時(shí)要把這個(gè)文件加入到工程中,在創(chuàng)建庫(kù)函數(shù)模板的時(shí)候我們默認(rèn)已經(jīng)添加。
2、EXTI 配置
#include "stm32f10x.h"
uint8_t main_temp = 0; //標(biāo)志位
void LED_Init()
{
GPIO_InitTypeDef GPIO_InitStructure; //定義結(jié)構(gòu)體變量
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0; //選擇你要設(shè)置的IO口
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; //設(shè)置推挽輸出模式
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //設(shè)置傳輸速率
GPIO_Init(GPIOC,&GPIO_InitStructure); //初始化GPIO
GPIO_SetBits(GPIOC,GPIO_Pin_0); //將LED端口拉高,熄滅所有LED
}
void KEY_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure; //定義結(jié)構(gòu)體變量
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0; //選擇你要設(shè)置的IO口
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD; //下拉輸入
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //設(shè)置傳輸速率
GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化GPIO
}
/*
* 簡(jiǎn)單說(shuō)明: 外部中斷初始化
*/
void My_EXTI_Init(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//開(kāi)啟 AFIO 時(shí)鐘
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);//選擇GPIO管腳用作外部中斷線路
//EXTI0 NVIC 配置
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; //EXTI0中斷通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2; //搶占優(yōu)先級(jí)
NVIC_InitStructure.NVIC_IRQChannelSubPriority =3; //子優(yōu)先級(jí)
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
NVIC_Init(&NVIC_InitStructure); //根據(jù)指定的參數(shù)初始化VIC寄存器
EXTI_InitStructure.EXTI_Line=EXTI_Line0; //中斷/事件線
EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt; //中斷模式
EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising; //上升沿觸發(fā)
EXTI_InitStructure.EXTI_LineCmd=ENABLE; //使能
EXTI_Init(&EXTI_InitStructure); //初始化EXTI
}
/*
* 簡(jiǎn)單說(shuō)明: 外部中斷0函數(shù)
*/
void EXTI0_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line0)==1) //判斷中斷線是否有中斷發(fā)生
{
if( main_temp ){
main_temp = 0x00;
}
else{
main_temp = 0xff;
}
}
EXTI_ClearITPendingBit(EXTI_Line0); //清除中斷標(biāo)志位
}
int main( void )
{
LED_Init();
KEY_Init();
My_EXTI_Init();
while(1)
{
if( main_temp == 0x00 ){
GPIO_SetBits(GPIOC,GPIO_Pin_0);
}
else{
GPIO_ResetBits(GPIOC,GPIO_Pin_0);
}
}
}
--END--
-
STM32F10x
+關(guān)注
關(guān)注
1文章
81瀏覽量
20681 -
STM32F103
+關(guān)注
關(guān)注
33文章
477瀏覽量
63599 -
EXTI
+關(guān)注
關(guān)注
0文章
27瀏覽量
3686
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論