【STM32+cubemx】0007 HAL库开发:外部中断,优先级和中断向量表
這一節我們以外部中斷為例子,講講中斷的優先級和中斷向量表的知識。
1)cubemx生成代碼
首先還是在cubemx中生成代碼,選擇器件、設置SYS(調試接口)、設置RCC(外部晶振時鐘源)。
然后設置GPIO引腳,選擇PC13作為輸出(用于LED指示),如下圖選擇PA0設置為外部中斷輸入引腳:
然后設置中斷使能和優先級,如下圖:
這里的幾處選項解釋一下:
最上面的Priority group是選擇優先級分組,STM32(更確切地說是contex-M3內核的單片機)使用4個bit位來分組,這里可以設置用幾個bit來區分搶占優先級和響應優先級;
比如圖中選擇的是3bit用來區分搶占優先級、1bit用來區分響應優先級,則搶占優先級可以選擇為0~7(圖中選的是6),響應優先級可以選擇為0~1(圖中選的是1);數值越小則優先級越高;
搶占優先級高的可以中斷低優先級的中斷,中斷嵌套的形式實現;
搶占優先級相同時,有多個中斷同時發生,則先運行響應優先級高的中斷。
由于咱們這個例子只有一個中斷,選哪個都不影響,但是要勾上使能。
到GPIO頁面下,將PA0的狀態改為上拉、中斷下降沿觸發:
之后,在時鐘選項卡設置主時鐘為72M;在project Manager選項卡設置工程名和路徑,生成工程代碼。
2)HAL庫函數的使用
生成的工程中,已經有比較完善的初始化代碼。我們直接看中斷服務程序,在stm32f1xx_it.c中:
其中的HAL_GPIO_EXTI_IRQHandler函數實現如下:
我們重寫它的回調函數,實現翻轉一次PC13(LED翻轉):
編譯下載到板子上后,將PA0引腳接觸一下GND,可以看到LED有翻轉。
由于這里沒有去抖,將PA0接觸GND時可能會產生多次中斷,有可能LED的狀態來回變化多次,可以在調試模式下,在中斷中設置斷點來觀察,是否每次接觸都會進入中斷。
3)中斷向量表的概念
在中斷發生時,為什么會跳到如下這個函數來執行呢?
首先,我們在初始化時,開啟了外部中斷0(這是配置完cubemx自動生成的):
在MCU中,每個中斷源會對應一個地址,當某個中斷產生時,程序就會保存現場,自動跳轉到這個地址去執行,執行完后再恢復現場,回到原來的程序執行。這些中斷源對應的地址就是中斷向量表。
如下圖,stm32的工程代碼中,啟動文件中設置的中斷向量表,都是跳轉到某個函數執行:
這個啟動文件里的中斷向量表是從程序存儲的地址起始開始往下排列的,每行占用4個字節(32bit),也就是說,EXTI0_IRQHandler在第23行,對應地址22*4=0x00000058;我們查看stm32f103的數據手冊,發現這個地址就是外部中斷0的中斷向量地址:
所以,產生外部中斷0時,會自動跳到其對應的中斷向量表0x00000058處去執行,也就是調用EXTI0_IRQHandler函數。
4)中斷向量表的重映射
在某些應用中,需要將中斷向量表移到別處。比如說含有IAP功能的程序,一般bootlooder程序是從MCU默認啟動的位置(地址0)執行,其中斷向量表也在從0起始的位置;而app程序一般存儲在bootlooder之后的一段地址中,這樣app程序中定義的中斷向量表就會偏離0地址。
為了正確訪問中斷向量表的地址,需要在app程序的起始,進行中斷向量表的映射,可以用以下函數實現:
void NVIC_SetVectorTable(uint32_t NVIC_VectTab, uint32_t Offset) { /* Check the parameters */assert_param(IS_NVIC_VECTTAB(NVIC_VectTab));assert_param(IS_NVIC_OFFSET(Offset)); SCB->VTOR = NVIC_VectTab | (Offset & (uint32_t)0x1FFFFF80); }如下使用,可以將中斷向量表起始地址設置為0x08003000:
NVIC_SetVectorTable(0x08000000, 0x3000);這里說明一下, stm32芯片的rom地址是從0x08000000開始的,如keil中的默認設置:
stm32芯片在內部自動進行了映射,把0x08000000和地址0進行了映射,所以app程序燒寫到0x08000000地址,不用進行其他設置,也是可以訪問到中斷向量表的。
但是,如果app程序被燒寫到了別的地址,如0x08003000,則需要程序中重新映射一下,使用這個函數:NVIC_SetVectorTable(0x08000000, 0x3000),這個用法以后講到IAP的時候會用到。
好了,這一節的內容基本講完了。
歡迎關注我的公眾號,可留言“資料”獲取相關程序和軟件:
總結
以上是生活随笔為你收集整理的【STM32+cubemx】0007 HAL库开发:外部中断,优先级和中断向量表的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Word文档隐藏文字设置
- 下一篇: 2016计算机国二试题,全国计算机等级考