異常類型
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ū)動)