1. STM32 外部中斷簡(jiǎn)介
STM32 的每個(gè) IO 都可以作為外部中斷的中斷輸入口。STM32F103 的中斷控制器支持 19 個(gè)外部中斷/事件請(qǐng)求。每個(gè)中斷設(shè)有狀態(tài)位,每個(gè)中斷/事件都有獨(dú)立的觸發(fā)和屏蔽設(shè)置。代碼主要分布在固件庫(kù)的 stm32f10x_exti.h 和 stm32f10x_exti.c 文件。
STM32F103的 19 個(gè)外部中斷為:
觸發(fā)方式:STM32 的外部中斷是通過(guò)邊沿來(lái)觸發(fā)的,不支持電平觸發(fā)。
2. 外部中斷分組
STM32 的每一個(gè) GPIO 都能配置成一個(gè)外部中斷觸發(fā)源,STM32 通過(guò)根據(jù)引腳的序號(hào)不同將眾多中斷觸發(fā)源分成不同的組。
比如:PA0,PB0,PC0,PD0,PE0,PF0,PG0 為第一組。
依此類推,我們能得出一共有16 組,STM32 規(guī)定,每一組中同時(shí)只能有一個(gè)中斷觸發(fā)源工作,那么,最多工作的也就是16個(gè)外部中斷。
3. 使用 IO 口外部中斷的配置步驟
3.1 初始化 IO 口為輸入
設(shè)置作為外部中斷輸入的 IO 口的狀態(tài),可以設(shè)置為上拉 / 下拉輸入 / 浮空輸入,但浮空的時(shí)候外部一定要帶上拉,或者下拉電阻。否則可能導(dǎo)致中斷不停的觸發(fā)。在干擾較大的地方,就算使用了內(nèi)部上拉/下拉,也建議使用外部上拉/下拉電阻,這樣可以一定程度防止外部干擾帶來(lái)的影響。
3.2 開(kāi)啟 IO 口復(fù)用時(shí)鐘,設(shè)置 IO 口與中斷線的映射關(guān)系
STM32 的 IO 口與中斷線的對(duì)應(yīng)關(guān)系需要配置外部中斷配置寄存器 EXTICR,這樣我們要先開(kāi)啟復(fù)用時(shí)鐘,然后配置 IO 口與中斷線的對(duì)應(yīng)關(guān)系。才能把外部中斷與中斷線連接起來(lái)。
3.3 開(kāi)啟與該IO口相對(duì)的線上中斷/事件,設(shè)置觸發(fā)條件
配置中斷產(chǎn)生的條件,STM32 可以配置成上升沿觸發(fā),下降沿觸發(fā),或者任意電平變化觸發(fā),但是不能配置成高電平觸發(fā)和低電平觸發(fā)。同時(shí)要開(kāi)啟中斷線上的中斷。
注意:
如果使用外部中斷,并設(shè)置該中斷的 EMR 位的話,會(huì)引起軟件仿真不能跳到中斷,而硬件上是可以的。而不設(shè)置 EMR,軟件仿真就可以進(jìn)入中斷服務(wù)函數(shù),并且硬件上也是可以的。建議不要配置 EMR 位。
3.4 配置中斷分組NVIC
配置中斷的分組,以及使能,對(duì) STM32 的中斷來(lái)說(shuō),只有配置了 NVIC 的設(shè)置,并開(kāi)啟才能被執(zhí)行,否則是不會(huì)執(zhí)行到中斷服務(wù)函數(shù)里面去的。
3.5 編寫(xiě)中斷服務(wù)函數(shù)
這是中斷設(shè)置的最后一步,中斷服務(wù)函數(shù),是必不可少的,如果在代碼里面開(kāi)啟了中斷,但是沒(méi)編寫(xiě)中斷服務(wù)函數(shù),就可能引起硬件錯(cuò)誤,從而導(dǎo)致程序崩潰!所以在開(kāi)啟了某個(gè)中斷后,一定要記得為該中斷編寫(xiě)服務(wù)函數(shù)。在中斷服務(wù)函數(shù)里面編寫(xiě)你要執(zhí)行的中斷后的操作。
4. 例程分析
4.1 配置外部中斷對(duì)應(yīng)IO
//---------------------------------------------------------------------------------------------------------------------------------------------
// 函 數(shù) 名: exti_gpio_config
// 功能說(shuō)明: 外部中斷GPIO參數(shù)配置
// 形 參: 無(wú)
// 返 回 值: 無(wú)
// 日 期: 2020-04-25
// 備 注:
// 作 者: by 霽風(fēng)AI
//---------------------------------------------------------------------------------------------------------------------------------------------
static void exti_gpio_config(void)
{
GPIO_InitTypeDef gpio_init_config;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//使能PORTA時(shí)鐘
gpio_init_config.GPIO_Pin = GPIO_Pin_0;//PA0
gpio_init_config.GPIO_Mode = GPIO_Mode_IPD; //PA0設(shè)置成輸入,默認(rèn)下拉
GPIO_Init(GPIOA, &gpio_init_config);//初始化GPIOA.0
}
4.2 配置外部中斷參數(shù)
//---------------------------------------------------------------------------------------------------------------------------------------------
// 函 數(shù) 名: exti_config
// 功能說(shuō)明: 外部中斷參數(shù)配置
// 形 參: 無(wú)
// 返 回 值: 無(wú)
// 日 期: 2020-04-25
// 備 注:
// 作 者: by 霽風(fēng)AI
//---------------------------------------------------------------------------------------------------------------------------------------------
static void exti_config(void)
{
EXTI_InitTypeDef exti_init_config;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //外部中斷,需要使能AFIO時(shí)鐘
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0); //PA0設(shè)置為外部中斷
exti_init_config.EXTI_Line = EXTI_Line0;
exti_init_config.EXTI_Mode = EXTI_Mode_Interrupt;
exti_init_config.EXTI_Trigger = EXTI_Trigger_Rising;//上升沿觸發(fā)
exti_init_config.EXTI_LineCmd = ENABLE;
EXTI_Init(&exti_init_config); //根據(jù)EXTI_InitTypeDef中指定的參數(shù)初始化外設(shè)EXTI寄存器
}
4.3 配置中斷向量
//---------------------------------------------------------------------------------------------------------------------------------------------
// 函 數(shù) 名: exit_nvic_config
// 功能說(shuō)明: 中斷向量參數(shù)配置
// 形 參: 無(wú)
// 返 回 值: 無(wú)
// 日 期: 2020-04-25
// 備 注:
// 作 者: by 霽風(fēng)AI
//---------------------------------------------------------------------------------------------------------------------------------------------
static void exti_nvic_config(void)
{
NVIC_InitTypeDef nvic_init_config;
nvic_init_config.NVIC_IRQChannel = EXTI0_IRQn;//使能按鍵所在的外部中斷通道
nvic_init_config.NVIC_IRQChannelPreemptionPriority = 0x02;//搶占優(yōu)先級(jí)2
nvic_init_config.NVIC_IRQChannelSubPriority = 0x02;//子優(yōu)先級(jí)1
nvic_init_config.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&nvic_init_config);
}
4.4 統(tǒng)一外部中斷調(diào)用接口
//---------------------------------------------------------------------------------------------------------------------------------------------
// 函 數(shù) 名: exti_init
// 功能說(shuō)明: 外部中斷初始化
// 形 參: exti_no:中斷號(hào)
// 返 回 值: 無(wú)
// 日 期: 2020-04-25
// 備 注: 外部調(diào)用此函數(shù),實(shí)現(xiàn)EXTI的初始化配置
// 作 者: by 霽風(fēng)AI
//---------------------------------------------------------------------------------------------------------------------------------------------
void exti_init(uint8_t exti_no)
{
if (exti_no == 0)
{
exti_gpio_config();
exti_config();
exti_nvic_config();
}
}
4.5 編寫(xiě)中斷服務(wù)函數(shù)
//---------------------------------------------------------------------------------------------------------------------------------------------
// 函 數(shù) 名: EXTI0_IRQHandler
// 功能說(shuō)明: 外部中斷0服務(wù)函數(shù)
// 形 參: 無(wú)
// 返 回 值: 無(wú)
// 日 期: 2020-04-25
// 備 注:
// 作 者: by 霽風(fēng)AI
//---------------------------------------------------------------------------------------------------------------------------------------------
void EXTI0_IRQHandler(void)
{
if (EXTI_GetITStatus(EXTI_Line0) != RESET)
{
g_exti_cnt++;
if (g_exti_cnt % 2)
{
Bsp_LedOn(0); //點(diǎn)亮OLED0
}
else
{
Bsp_LedOff(0); //熄滅OLED0
}
if (g_exti_cnt > 200)
{
g_exti_cnt = 0;
}
EXTI_ClearITPendingBit(EXTI_Line0); //清除EXTI0線路掛起
}
}
補(bǔ)充:
在編寫(xiě)中斷服務(wù)函數(shù)的時(shí)候會(huì)經(jīng)常使用到兩個(gè)函數(shù)。
(1)第一個(gè)函數(shù)是判斷某個(gè)中斷線上的中斷是否發(fā)生(標(biāo)志位是否置位):
ITStatus EXTI_GetITStatus(uint32_t EXTI_Line);
這個(gè)函數(shù)一般使用在中斷服務(wù)函數(shù)的開(kāi)頭判斷中斷是否發(fā)生。
(2)第二個(gè)是清除某個(gè)中斷線上的中斷標(biāo)志位:
void EXTI_ClearITPendingBit(uint32_t EXTI_Line);
這個(gè)函數(shù)一般應(yīng)用在中斷服務(wù)函數(shù)結(jié)束之前,清除中斷標(biāo)志位。
-
STM32
+關(guān)注
關(guān)注
2293文章
11032瀏覽量
364777 -
RTC
+關(guān)注
關(guān)注
2文章
622瀏覽量
68847 -
GPIO
+關(guān)注
關(guān)注
16文章
1280瀏覽量
54066 -
外部中斷
+關(guān)注
關(guān)注
1文章
133瀏覽量
16201 -
中斷控制器
+關(guān)注
關(guān)注
0文章
61瀏覽量
9673
發(fā)布評(píng)論請(qǐng)先 登錄
STM32單片機(jī)學(xué)習(xí)筆記(8):外部中斷

STM32學(xué)習(xí)筆記之外部中斷EXTI學(xué)習(xí)
STM32學(xué)習(xí)筆記——外部中斷的初步了解

STM32學(xué)習(xí)心得十五:外部中斷實(shí)驗(yàn)

STM32學(xué)習(xí)筆記(4)——NVIC中斷優(yōu)先級(jí)管理和外部中斷EXTI

STM32F407學(xué)習(xí)記錄---外部中斷實(shí)驗(yàn)

【STM32學(xué)習(xí)筆記】外部中斷/事件

STM32(六)-------中斷(外部中斷)

第二節(jié): 外部中斷學(xué)習(xí)(用CubeMX學(xué)習(xí)STM32)

STM32_EXTI外部中斷學(xué)習(xí)筆記

評(píng)論