STM32 學(xué)習(xí)筆記之中斷應(yīng)用概覽--以f103為例

  異常類型

  F103 在內(nèi)核水平上搭載了一個異常響應(yīng)系統(tǒng), 支持為數(shù)眾多的系統(tǒng)異常和外部中斷。其中系統(tǒng)異常有8 個(如果把Reset 和HardFault

也算上的話就是10

個),外部中斷有60個。除了個別異常的優(yōu)先級被定死外,其它異常的優(yōu)先級都是可編程的。有關(guān)具體的系統(tǒng)異常和外部中斷可在標(biāo)準(zhǔn)庫文件stm32f10x.h

這個頭文件查詢到,在IRQn_Type 這個結(jié)構(gòu)體里面包含了F103 系列全部的異常聲明。

  NVIC 簡介

  在講如何配置中斷優(yōu)先級之前,我們需要先了解下NVIC。NVIC

是嵌套向量中斷控制器,控制著整個芯片中斷相關(guān)的功能,它跟內(nèi)核緊密耦合,是內(nèi)核里面的一個外設(shè)。但是各個芯片廠商在設(shè)計芯片的時候會對Cortex-M3

內(nèi)核里面的NVIC 進行裁剪,把不需要的部分去掉,所以說STM32 的NVIC 是Cortex-M3 的NVIC 的一個子集。

  NVIC 寄存器簡介

  在固件庫中,NVIC 的結(jié)構(gòu)體定義可謂是頗有遠慮,給每個寄存器都預(yù)留了很多位,恐怕為的是日后擴展功能。不過STM32F103

可用不了這么多,只是用了部分而已,具體使用了多少可參考《 Cortex-M3 內(nèi)核編程手冊》-4.3.11:NVIC 寄存器映射。

  在配置中斷的時候我們一般只用ISER、ICER 和IP 這三個寄存器,ISER 用來使能中斷,ICER 用來失能中斷,IP

用來設(shè)置中斷優(yōu)先級。

  NVIC 中斷配置固件庫

  固件庫文件core_cm3.h 的最后,還提供了NVIC 的一些函數(shù),這些函數(shù)遵循CMSIS 規(guī)則,只要是Cortex-M3

的處理器都可以使用,具體如下:

  這些庫函數(shù)我們在編程的時候用的都比較少,甚至基本都不用。在配置中斷的時候我們還有更簡潔的方法,請看中斷編程小節(jié)。

  優(yōu)先級定義

  在NVIC 有一個專門的寄存器:中斷優(yōu)先級寄存器NVIC_IPRx,用來配置外部中斷的優(yōu)先級,IPR

寬度為8bit,原則上每個外部中斷可配置的優(yōu)先級為0~255,數(shù)值越小,優(yōu)先級越高。但是絕大多數(shù)CM3

芯片都會精簡設(shè)計,以致實際上支持的優(yōu)先級數(shù)減少,在F103 中,只使用了高4bit,如下所示:

  用于表達優(yōu)先級的這4bit,又被分組成搶占優(yōu)先級和子優(yōu)先級。如果有多個中斷同時響應(yīng),搶占優(yōu)先級高的就會 搶占

搶占優(yōu)先級低的優(yōu)先得到執(zhí)行,如果搶占優(yōu)先級相同,就比較子優(yōu)先級。如果搶占優(yōu)先級和子優(yōu)先級都相同的話,就比較他們的硬件中斷編號,編號越小,優(yōu)先級越高。

  優(yōu)先級分組

  優(yōu)先級的分組由內(nèi)核外設(shè)SCB 的應(yīng)用程序中斷及復(fù)位控制寄存器AIRCR 的PRIGROUP[10:8]位決定,F(xiàn)103 分為了5

組,具體如下:主優(yōu)先級=搶占優(yōu)先級

  設(shè)置優(yōu)先級分組可調(diào)用庫函數(shù)NVIC_PriorityGroupConfig()實現(xiàn),有關(guān)NVIC 中斷相關(guān)的庫函數(shù)都在庫文件misc.c

和misc.h 中。

  中斷編程

  在配置每個中斷的時候一般有3 個編程要點:

  1、使能外設(shè)某個中斷,這個具體由每個外設(shè)的相關(guān)中斷使能位控制。比如串口有發(fā)送完成中斷,接收完成中斷,這兩個中斷都由串口控制寄存器的相關(guān)中斷使能位控制。

  2、初始化NVIC_InitTypeDef 結(jié)構(gòu)體,配置中斷優(yōu)先級分組,設(shè)置搶占優(yōu)先級和子優(yōu)先級,使能中斷請求。NVIC_InitTypeDef

結(jié)構(gòu)體在固件庫頭文件misc.h 中定義。

  有關(guān)NVIC 初始化結(jié)構(gòu)體的成員我們一一解釋下:

  1)NVIC_IROChannel:用來設(shè)置中斷源,不同的中斷中斷源不一樣,且不可寫錯,即使寫錯了程序也不會報錯,只會導(dǎo)致不響應(yīng)中斷。具體的成員配置可參考stm32f10x.h

頭文件里面的IRQn_Type 結(jié)構(gòu)體定義,這個結(jié)構(gòu)體包含了所有的中斷源。

  2)NVIC_IRQChannelPreemptionPriority:搶占優(yōu)先級,具體的值要根據(jù)優(yōu)先級分組來確定,具體參考表格 17-5

優(yōu)先級分組真值表 。

  3)NVIC_IRQChannelSubPriority:子優(yōu)先級,具體的值要根據(jù)優(yōu)先級分組來確定,具體參考表格 17-5 優(yōu)先級分組真值表

。

  4)NVIC_IRQChannelCmd:中斷使能(ENABLE)或者失能(DISABLE)。操作的是NVIC_ISER 和NVIC_ICER

這兩個寄存器。

  3、編寫中斷服務(wù)函數(shù)

  在啟動文件startup_stm32f10x_hd.s

中我們預(yù)先為每個中斷都寫了一個中斷服務(wù)函數(shù),只是這些中斷函數(shù)都是為空,為的只是初始化中斷向量表。實際的中斷服務(wù)函數(shù)都需要我們重新編寫,為了方便管理我們把中斷服務(wù)函數(shù)統(tǒng)一寫在stm32f10x_it.c

這個庫文件中。

  關(guān)于中斷服務(wù)函數(shù)的函數(shù)名必須跟啟動文件里面預(yù)先設(shè)置的一樣,如果寫錯,系統(tǒng)就在中斷向量表中找不到中斷服務(wù)函數(shù)的入口,直接跳轉(zhuǎn)到啟動文件里面預(yù)先寫好的空函數(shù),并且在里面無限循環(huán),實現(xiàn)不了中斷。

  stm32相關(guān)視頻資料

  stm32 如何用DMA搬運數(shù)據(jù)

  http://www.makeru.com.cn/live/detail/1484.html?s=45051

  (STM32中斷系統(tǒng))

  http://www.makeru.com.cn/live/1392_1124.html?s=45051

  (時鐘系統(tǒng))

  http://www.makeru.com.cn/live/1392_1082.html?s=45051

  分析STM32的的開發(fā)方式

  http://www.makeru.com.cn/live/3523_1673.html?s=45051

  PWM脈寬調(diào)制技術(shù)

  http://www.makeru.com.cn/live/4034_2146.html?s=45051

  基于STM32講解串口操作

  http://www.makeru.com.cn/live/1758_490.html?s=45051

  (stm32直流電機驅(qū)動)

  http://www.makeru.com.cn/live/1392_1218.html?s=45051

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容