極簡STM32:基于HAL庫與FreeRTOS的Arm Cortex-M4編程與開發 課件 第4章 中斷與滴答定時器_第1頁
極簡STM32:基于HAL庫與FreeRTOS的Arm Cortex-M4編程與開發 課件 第4章 中斷與滴答定時器_第2頁
極簡STM32:基于HAL庫與FreeRTOS的Arm Cortex-M4編程與開發 課件 第4章 中斷與滴答定時器_第3頁
極簡STM32:基于HAL庫與FreeRTOS的Arm Cortex-M4編程與開發 課件 第4章 中斷與滴答定時器_第4頁
極簡STM32:基于HAL庫與FreeRTOS的Arm Cortex-M4編程與開發 課件 第4章 中斷與滴答定時器_第5頁
已閱讀5頁,還剩43頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第4章

中斷與系統定時器第4章

中斷與系統滴答定時器【實戰案例4-1】外部中斷應用編程

【照貓畫虎4-1】中斷優先級的影響

【實踐案例4-2】SysTick定時器的應用

【照貓畫虎4-2】SysTick定時器的應用

4.1NVIC和EXTI控制器4.1.1基本概念

4.1.2NVIC和EXTI控制器4.1.3中斷優先級管理異常(Exception)和中斷(Interrupt)都是系統中突發事件的處理機制,當發生時將暫停處理器正常的執行流程,進入特定的處理程序。中斷(Interrupt)是由內核外部產生的,一般由硬件引起,比如各種外設引起的外部中斷等。異常(Exception)通常是在內核內部,由內核自身產生的,并且大多是由軟件引起的,比如除法出錯異常、Flash預取值失敗等。4.1NVIC和EXTI控制器4.1.1基本概念

異常號和中斷號4.1NVIC和EXTI控制器

中斷向量和中斷向量表4.1NVIC和EXTI控制器NVIC:NestedVectoredInterruptController,嵌套向量中斷控制器4.1NVIC和EXTI控制器EXTI控制器:外部中斷/事件(ExternalInterrupt)控制器4.1.2NVIC和EXTI控制器4.1NVIC和EXTI控制器NVIC的封裝4.1NVIC和EXTI控制器EXTI控制器實現外部中斷/事件的管理。外部中斷/事件是實現外設與微處理器之間通信的主要方式之一。從外部激勵信號來看,中斷和事件的產生源可以一樣。但是,中斷(Interrupt)需要CPU參與后續的中斷響應,包括上下文切換、執行中斷服務程序、恢復現場并返回等,而事件(Event)只是觸發脈沖發生器產生一個單脈沖輸出,送入其他硬件電路,以實現對該事件的響應,比如DMA操作、AD轉換等。EXTI控制器4.1NVIC和EXTI控制器4.1NVIC和EXTI控制器外部中斷的引入在23根EXTI0~22中,16根來自于GPIO引腳,用于引入外部中斷請求,7根引入RTC鬧鐘、USBOTGFS喚醒、以太網喚醒等事件。每根EXTI線通過多路開關與各GPIO中序號相同的引腳相連,連接的具體引腳通過GPIO端口復用寄存器進行配置和選擇。4.1NVIC和EXTI控制器需要注意的是,在中斷向量表中,由GPIO引腳引入的16個外部中斷EXTI0~EXTI15只占用了7個中斷向量,也就是只能使用7個中斷服務函數。其中EXTI5~9、EXTI10~15分別共用一個中斷處理函數。在NVIC中,用240個8位的中斷優先級IP(InterruptPriority)寄存器實現各中斷優先級的設置,因此最多可以管理240個中斷的優先級。每個中斷的優先級數值可以設置為0~255,分別保存在對應的IP寄存器中。另外,每4個IP寄存器構成一個32位的IPR寄存器,因此共有60個IPR寄存器IPR0~59。4.1NVIC和EXTI控制器4.1.3中斷優先級管理IP寄存器4.1NVIC和EXTI控制器PRI_x:也就是NVIC結構體中的IP[x]WWDG_IRQn=0,PVD_IRQn=1,TAMP_STAMP_IRQn=2,RTC_WKUP_IRQn=3,

FLASH_IRQn=4,RCC_IRQn=5,

EXTI0_IRQn=6,在core_cm4.h文件中,定義了如下函數用于設置中斷的優先級數值__STATIC_INLINEvoid__NVIC_SetPriority(IRQn_TypeIRQn,uint32_tpriority){if((int32_t)(IRQn)>=0){NVIC->IP[((uint32_t)IRQn)]=(uint8_t)((priority<<(8U-__NVIC_PRIO_BITS))&(uint32_t)0xFFUL);}……}4.1NVIC和EXTI控制器例如,利用如下語句 __NVIC_SetPriority(EXTI0_IRQn,2)調用上述函數時,函數中的__NVIC_PRIO_BITS宏的值為4,因此將入口參數2左移8-4=4位得到0x20,再與0xFF相與得到0x20,存入IP[6]寄存器中(其中6為EXTI0的中斷號,即EXTI0_IRQn=6),從而設置EXTI0中斷的優先級數值為2。4.1NVIC和EXTI控制器在NVIC中,原則上每個外部中斷可配置的優先級數值為0~255,數值越小,優先級越高。為了便于管理,在STM32中將中斷優先級進一步分為搶占優先級(PreemptPriority)和子優先級(SubPriority),其中子優先級又稱為響應優先級。每個中斷源都同時具有上述兩種優先級。搶占優先級的級別高于響應優先級,并且數值越小所代表的優先級就越高。在進行優先級設置時,STM32F407只用了82個IP寄存器IP0~81,并且每個IP寄存器只用了高4位。高4位又進一步分為兩部分,分別表示搶占優先級和子優先級。因此每個中斷的搶占優先級和子優先級最多用4位二進制表示,意味著最多有16級搶占優先級和16級子優先級。4.1NVIC和EXTI控制器STM32的中斷優先級管理為了便于管理,將中斷優先級進一步分為搶占優先級(PreemptPriority)和子優先級(SubPriority)或響應優先級。STM32F407只用了82個IP寄存器IP0~81,并且每個IP寄存器中只用高4位表示搶占優先級和子優先級。通過設置不同的優先級分組可以指定高4位中用多少位分別表示搶占優先級和響應優先級。4.1NVIC和EXTI控制器例如:假設設置優先級分組為3,則在所有82個中斷對應的每個IP寄存器中,用高4位中的最高3位指定該中斷的搶占優先級,用高4位中的最低位1指定該中斷的響應優先級。因此,每個中斷的搶占優先級可以設置為0~7,響應優先級設置為1或0。4.1NVIC和EXTI控制器D7D4D3D00111未

用假設設置IP6=0111XXXX,則表示EXTI0的搶占優先級為3,子優先級為1。再如,假設中斷優先級分組設為2,并設置3號中斷(RTC_WKUP中斷)的搶占優先級和響應優先級分別為2和1;6號中斷(外部中斷0)的搶占優先級和響應優先級分別為3和0;7號中斷(外部中斷1)的搶占優先級和響應優先級分別為2和0,則3個中斷的優先級順序為:中斷7>中斷3>中斷64.1NVIC和EXTI控制器優先級管理規則4.1NVIC和EXTI控制器搶占優先級高的中斷可以打斷正在執行的搶占優先級低的中斷。搶占優先級相同,響應優先級高的中斷不能打斷響應優先級低的中斷。當兩個或者多個中斷的搶占式優先級和響應優先級都相同時,那么就遵循自然優先級,在中斷向量表中,數值越小的優先級越高。4.2外部中斷應用編程4.2.1外部中斷的CubeMX配置4.2.2外部中斷的初始化

4.2.3外部中斷的處理4.2外部中斷應用編程與外部中斷相關的配置和應用程序包括如下內容:設置中斷觸發條件設置中斷優先級使能外設中斷判斷中斷源:進入中斷服務程序后,根據中斷標志判斷當前發出中斷請求的中斷源。清除中斷標志:發出中斷請求后,相應的中斷標志位將被置位,以便MCU接收到中斷請求。這些中斷請求需要及時清除,避免重復進入中斷。編寫中斷服務程序:根據需要實現的具體功能編寫接收到中斷請求后應該執行的具體操作和實現的功能。4.2外部中斷應用編程4.2.1外部中斷的CubeMX配置在CubeMX中,配置GPIO引腳引入外部中斷的基本步驟如下。1)配置GPIO引腳模式為復用的GPIO_EXTIx

2)在GPIO模式面板配置觸發方式,具體可以分別配置為如下3種:ExternalInterruptwithRisingedgetriggerdetection:上邊沿觸發ExternalInterruptwithFallingedgetriggerdetection:下邊沿觸發ExternalInterruptwithRising/Fallingedgetriggerdetection:上下雙邊沿觸發4.2外部中斷應用編程3)在外設列表中單擊SystemCore/NVIC,在NVIC配置面板中啟用指定的中斷

4)在NVIC配置面板上部的PriorityGroup(中斷優先級分組)下拉列表中可以配置優先級分組,再在下面的列表中設置中斷的搶占優先級和響應優先級。5)單擊配置面板上方的Codegeneration(代碼生成)標簽,確認并勾選所啟用外部中斷的相關屬性選項GenerateEnableinInit、GenerateIRQhandler、CallHALhandler,從而將在生成的工程代碼中自動創建中斷處理相關函數。4.2外部中斷應用編程圖4-4

NVIC配置對話框4.2外部中斷應用編程4.2.2外部中斷的初始化與外部中斷相關的HAL庫定義都放在stm32f4xx_hal_gpio.c/.h文件中。在GPIO初始化結構體GPIO_InitTypeDef定義中,成員Mode與外部中斷有關,其取值可以是以下宏定義:#defineGPIO_MODE_IT_RISING (MODE_INPUT|EXTI_IT|TRIGGER_RISING) /*上升沿觸發的外部中斷模式*/#defineGPIO_MODE_IT_FALLING (MODE_INPUT|EXTI_IT|TRIGGER_FALLING) /*下降沿觸發的外部中斷模式*/#defineGPIO_MODE_IT_RISING_FALLING(MODE_INPUT|EXTI_IT|TRIGGER_RISING|TRIGGER_FALLING) /*上下邊沿觸發的外部中斷模式*/4.2外部中斷應用編程在gpio.c文件中的MX_GPIO_Init()函數中,將根據CubeMX中的配置對初始化結構體中的成員Mode進行賦值,從而配置指定的GPIO引腳為復用模式,并配置中斷的觸發方式,相關代碼如下(以EXTI0中斷為例):voidMX_GPIO_Init(void){ ……GPIO_InitStruct.Mode=GPIO_MODE_IT_RISING;……HAL_NVIC_SetPriority(EXTI0_IRQn,0,0); //設置EXTI0優先級HAL_NVIC_EnableIRQ(EXTI0_IRQn); //使能EXTI0中斷}上述代碼同時調用了兩個HAL庫函數設置外部中斷的優先級,并開啟中斷。4.2外部中斷應用編程4.2.3外部中斷的處理在基于HAL庫的程序開發中,所有中斷處理函數都定義在文件stm32fxxxit.c中。在使用CubeMX軟件進行初始化配置時,如果使能了某一個外設的中斷功能,那么在生成代碼時,相應的中斷處理函數就會自動添加到該文件中,用戶只需要在該函數中添加相應的中斷處理代碼即可。例如,假設配置了PA0引腳引入外部中斷,則在stm32fxxxit.c中,將自動生成相應的中斷服務程序如下:4.2外部中斷應用編程4.2外部中斷應用編程檢測中斷源清除中斷請求調用中斷回調函數4.2外部中斷應用編程中斷回調函數是一個弱函數,意思是在該函數中并未實現具體功能,僅僅是為了避免編譯通過而設置的函數。函數實現的具體功能代碼需要在用戶程序文件中重寫,將該函數覆蓋掉。中斷回調函數4.2外部中斷應用編程【實踐案例4-1】外部中斷應用編程本案例要求利用按鍵控制LED的閃爍。開發板中兩個按鍵K1和K2的電路連接如圖4-6所示,其中K1和K2分別連接到GPIO的PA0和PC13引腳。當按鍵按下時,相應的GPIO引腳輸出高電平;按鍵釋放時,輸出低電平。4.2外部中斷應用編程CubeMX中的配置和初始化配置PF6引腳為GPIO_Output模式,配置PA0和PC13引腳,用戶標簽為LED_R。配置PA0和PC13為GPIO_EXTI0和GPIO_EXTI13模式,GPIO_Mode屬性分別配置為上升沿觸發和下降沿觸發,User_Label分別配置為BTN_K1和BTN_K2。在NVIC配置對話框中勾選EXTIline0interrupt和EXTIline[15:10]interrupt,并確認上述兩個外部中斷的相關屬性選項GenerateEnableinInit、GenerateIRQhandle、CallHALhandle都被勾選。4.2外部中斷應用編程中斷回調函數的編寫4.2外部中斷應用編程【照貓畫虎4-1】中斷優先級的影響要求在CubeMX中配置兩個按鍵的不同優先級,并將中斷回調函數按照如下修改。如果在延時等待期間,按動K2以產生一個低優先級的K2中斷請求,觀察紅色LED能否像案例4-1一樣閃爍(參謀工程文件夾2.KEY_INT)。注意延遲時間要足夠大,以便觀察。4.3系統滴答定時器4.3.1SysTick的封裝4.3.2SysTick的初始化

4.3.3

系統節拍與HAL時基4.3.4HAL_Delay()函數

系統滴答定時器SysTick(SystemTimer)是屬于CM4內核中的一個外設,內嵌在NVIC中,所有基于CM4內核的單片機都具有這個系統定時器,使得軟件在CM4單片機中可以很容易的移植。系統定時器一般用于產生時基信號,作為操作系統所有操作的節拍和時間刻度。與普通的定時/計數器類似,系統定時器在計數脈沖的作用下進行遞減計數。當從設定的計數初值計數到零時,將產生一次中斷,即可實現每隔指定的時間實現期望的操作。4.3系統滴答定時器4.3.1SysTick的封裝控制和狀態寄存器重載寄存器當前計數值寄存器校準寄存器4.3系統滴答定時器位段名稱描

述16COUNTFLAG定時器計數到0時該位置12CLKSOURCE時鐘源選擇位,0=HCLK/8,1=處理器時鐘HCLK1TICKINT0:計數到0時不發中斷請求,通過讀取COUNTFLAG標志位可確定計數器是否遞減到0;1:計數到0時產生SysTick異常請求

0ENABLE定時器的使能位(啟動定時)CTRL:控制和狀態寄存器4.3系統滴答定時器LOAD:重裝計數初值寄存器。低24位保存計數初值,計數初值范圍為0x00000001-0x00FFFFFF。假設需要定時N個時鐘周期,則計數初值設為N-1。當CTRL中的ENABLE位置1時,計數器從LOAD寄存器重新裝入RELOAD值,并開始減計數。計數到零時,COUNTFLAG位被置1。如果TICKINT位為1,則可以觸發SysTick異常。之后,又自動裝入RELOAD值,開始計數。VAL:當前計數值寄存器。低24位保存計數器的當前計數值,可供程序讀取。4.3系統滴答定時器4.3系統滴答定時器4.3.2SysTick的初始化在core_cm4.h頭文件中,定義了如下函數:uint32_tSysTick_Config(uint32_tticks)用于實現SysTick定時器的配置,其中包括設置LOAD寄存器的值等于ticks-1、設置SysTick異常的優先級,設置VAL寄存器的初始值為0,并配置SysTick的計數時鐘脈沖為系統時鐘脈沖HCLK,開啟SysTick異常請求并啟動定時。4.3系統滴答定時器在HAL_Init()->HAL_InitTick()->HAL_SYSTICK_Config()函數中,調用上述SYSTICK_Config()函數時的入口參數為

SystemCoreClock/(1000U/uwTickFreq)其中變量uwTickFreq的值為1;變量SystemCoreClock的值將通過main.c文件中的SystemClock_Config()函數自動配置為系統時鐘頻率(也就是H

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論