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