STM32與51相比,多了很多資源,其中外部中斷就是被擴展了很多。51的外部中斷只有2個,但是STM32不是,STM32的每個IO都可以作為外部中斷輸入。
STM32的中斷控制器支持19個外部中斷/事件請求:
線0~15:對應外部IO口的輸入中斷。
線16:連接到PVD輸出。
線17:連接到RTC鬧鐘事件。
線18:連接到USB喚醒事件。
每個外部中斷線可以獨立的配置觸發方式(上升沿,下降沿或者雙邊沿觸發),觸發/屏蔽,專用的狀態位。
IO口外部中斷在中斷向量表中只分配了7個中斷向量,也就是只能使用7個中斷服務函數:
從表中可以看出,外部中斷線5~9分配一個中斷向量,共用一個服務函數,外部中斷線10~15分配一個中斷向量,共用一個中斷服務函數。
中斷服務函數列表:
EXTI0_IRQHandler
EXTI1_IRQHandler
EXTI2_IRQHandler
EXTI3_IRQHandler
EXTI4_IRQHandler
EXTI9_5_IRQHandler
EXTI15_10_IRQHandler
STM32F103系列上面,總共有60個可屏蔽中斷,相比于51多了那么多中斷,那么對于這些中斷的管理也是比51更加的復雜。
中斷管理方法:
首先,對STM32中斷進行分組,組0~4。同時,對每個中斷設置一個搶占優先級和一個響應優先級值。
分組配置是在寄存器SCB->AIRCR中配置:
搶占優先級 & 響應優先級區別:
高優先級的搶占優先級是可以打斷正在進行的低搶占優先級中斷的。
搶占優先級相同的中斷,高響應優先級不可以打斷低響應優先級的中斷。
搶占優先級相同的中斷,當兩個中斷同時發生的情況下,哪個響應優先級高,哪個先執行。
如果兩個中斷的搶占優先級和響應優先級都是一樣的話,則看哪個中斷先發生就先執行;
舉例:
假定設置中斷優先級組為2,然后設置中斷3(RTC中斷)的搶占優先級為2,響應優先級為1。中斷6(外部中斷0)的搶占優先級為3,響應優先級為0。中斷7(外部中斷1)的搶占優先級為2,響應優先級為0。
那么這3個中斷的優先級順序為:中斷7>中斷3>中斷6。
特別說明:
一般情況下,系統代碼執行過程中,只設置一次中斷優先級分組,比如分組2,設置好分組之后一般不會再改變分組。隨意改變分組會導致中斷管理混亂,程序出現意想不到的執行結果。
中斷初始化一般步驟:
注:每一塊開發板對應電路都不相同,編寫代碼需要對應自己的板子,本人兩個LED燈對應的GPIO為:GPIOD13和GPIOD14,并且是共陰極。兩個按鍵對應的GPIO為:GPIOC13和GPIOE0,并且共陰極。
本實驗用到了按鍵和LED,初始化程序前文已講,
LED初始化函數:
#include "stm32f10x.h" #define LED1 PDout(13)// PB13 #define LED2 PDout(14)// PB14 void LED_Init(void) { GPIO_InitTypeDef GPIOINIT; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE); GPIOINIT.GPIO_Mode = GPIO_Mode_Out_PP; GPIOINIT.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14; GPIOINIT.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOD, &GPIOINIT); GPIO_ResetBits(GPIOD, GPIO_Pin_13 | GPIO_Pin_14); }
KEY初始化函數:
#include "stm32f10x.h" #define KEY0 GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_13) #define KEY1 GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_0) void KEY_Init(void) { GPIO_InitTypeDef GPIOInit; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOE, ENABLE); GPIOInit.GPIO_Mode = GPIO_Mode_IPU; GPIOInit.GPIO_Pin = GPIO_Pin_13; GPIOInit.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC, &GPIOInit); GPIOInit.GPIO_Mode = GPIO_Mode_IPU; //上拉輸入 GPIOInit.GPIO_Pin = GPIO_Pin_0; GPIOInit.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOE, &GPIOInit); }
中斷初始化函數:
void EXIT_Init(void) { GPIO_InitTypeDef GPIOInit; EXTI_InitTypeDef EXTIInit; NVIC_InitTypeDef NVICInit; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); GPIOInit.GPIO_Mode = GPIO_Mode_IPU; GPIOInit.GPIO_Pin = GPIO_Pin_13; GPIOInit.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC, &GPIOInit); RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource13); EXTIInit.EXTI_Line = EXTI_Line13; EXTIInit.EXTI_LineCmd = ENABLE; EXTIInit.EXTI_Mode = EXTI_Mode_Interrupt; EXTIInit.EXTI_Trigger = EXTI_Trigger_Falling; EXTI_Init(&EXTIInit); NVICInit.NVIC_IRQChannel = EXTI15_10_IRQn; NVICInit.NVIC_IRQChannelCmd = ENABLE; NVICInit.NVIC_IRQChannelPreemptionPriority = 2; NVICInit.NVIC_IRQChannelSubPriority = 2; NVIC_Init(&NVICInit); }
中斷服務子程序:
void EXTI15_10_IRQHandler(void) { delay_ms(10); if(KEY0 == 0) { LED1 = !LED1; LED2 = !LED2; } EXTI_ClearITPendingBit(EXTI_Line13); }
主函數:
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
delay_init();
LED_Init();
EXIT_Init();
KEY_Init();
uart_init(115200);
LED1 = 1;
while(1)
{
printf("okrn");
delay_ms(1000);
}
}
上一篇:STM32 嵌入式學習入門(0)——C語言基礎復習
下一篇:嵌入式stm32學習:外部中斷
推薦閱讀
史海拾趣
1973年,DIOTEC半導體股份有限公司在德國的海特爾斯海姆正式成立。公司創始人以半導體和整流產品的研發為起點,立志在電子行業中占據一席之地。在創立初期,DIOTEC就注重技術創新和品質控制,不斷推出符合市場需求的高品質產品。憑借這種執著和堅持,DIOTEC逐漸在歐洲市場嶄露頭角。
為了進一步完善全球產業布局,DIOTEC于2007年在印度普納建立了新的生產基地。這座工廠緊鄰印度的“門戶城市”孟買,為DIOTEC在印度市場的拓展提供了有力支持。印度工廠的投產,不僅加強了DIOTEC在全球市場的競爭力,也進一步鞏固了其在亞洲市場的地位。
DC Components公司成立于1992年,總部位于臺灣臺中市。公司自創立之初,就專注于二極管橋式整流器的研發與生產。在創立初期,公司面臨著資金、技術和市場的諸多挑戰。然而,憑借對技術的執著追求和對市場的敏銳洞察,DC Components公司逐漸在二極管橋式整流器領域樹立了專業形象,為未來的發展奠定了堅實基礎。
在電子產品行業,產品質量是企業生存和發展的基石。Datakey Electronics始終堅守品質至上的原則,從原材料采購到生產流程控制,再到產品檢驗和售后服務,每一個環節都嚴格把關。正是這種對品質的執著追求,使Datakey Electronics的產品在市場上樹立了良好的口碑,贏得了客戶的信賴。
長園維安自成立以來,始終堅持技術創新為核心競爭力。在早期發展階段,公司投入大量資源研發新型線路保護元器件,如PPTC、CPTC等。這些產品憑借其卓越的性能和穩定性,迅速在通訊、汽車電子等領域獲得廣泛應用。通過不斷創新,長園維安在電子行業樹立了技術領先的形象。
在電子組裝行業,品質是企業的生命線。一家名為“品質電子組裝”的公司,從創立之初就堅持以品質為核心競爭力。公司引進了國際先進的生產設備和管理體系,建立了嚴格的質量控制體系,確保每一件產品都符合高標準、嚴要求。正是憑借著對品質的堅守和追求,品質電子組裝贏得了客戶的廣泛贊譽和信賴,逐漸在行業中樹立了良好的口碑。
我司重點推廣c8051f系列單片機 c8051f330/c8051f120/仿真器部分參考報價 c8051f330 9元/片 c8051f330st 125元/套 原裝EC3 390元/套(配套下載線+光盤+運費) c8051f單片機仿真器 90元/套(配套下載線+光盤+運費) c8051f120 55元/片 c8051f ...… 查看全部問答∨ |
各位老大,最近在vxWorks上作有關C++的東西,發現一個很嚴重的問題。 類的靜態成員變量無法被認識!!! 以下為我的代碼: #include \"stdio.h\" extern void ace_test_ren(void); class Demo { public: void ...… 查看全部問答∨ |
如何實現 系統設計中不同IP CORE 時鐘同步? 在片上系統設計中,調用不同IP CORE ,由于不同IP CORE 對時鐘要求不同,怎樣才能使這些IP CORE 時鐘全同步?… 查看全部問答∨ |
|
緊急求助:搭建bochs虛擬機后,進不了DLX Linux的登錄界面? 總是出現couldn\'t open ROM image file\' c:\\boch-2.0.2/BIOS-bochs-latest\'。 這是怎么回事?… 查看全部問答∨ |
|
經常用eeworld,發現這里網友的熱情都很高,而且管理員都很負責,社區的問題都及時得到了解決。這不是虛晃之言,前幾天管理員還給我打來電話,詢問我在論壇上曾經出現過的一個問題,當時讓我很是驚訝。上過的論壇很多了,但是一個管理員,肯如此平 ...… 查看全部問答∨ |
LED產業自興起以來在節能、高效、長壽命等一系列光環的籠罩下,產業的發展一直被寄予厚望,但中國的LED產業起步較晚,長時間的“零門檻兒”準入原則,使其本身具備“行業亂、產品雜、企業難“等特點,行業整體呈現出“高不成低不就”的狀況。而 ...… 查看全部問答∨ |