中斷的定義
為什么要有中斷?
問題:閃爍燈 執行 同時 按鍵控制蜂鳴器?

問題: 按鍵的檢測頻率: 500ms
采樣的速度太慢,導致按鍵的實時性很低。
如果有一個事務,CPU不知道它什么時候會觸發;但是一旦觸發,需要立即執行,對於這種事務,我們可以做成中斷。
中斷的概念
Cortex-M3響應中斷的形式:

- 中斷的作用:實時性
- 中斷源:能夠產生中斷請求的。(固定的)
- 中斷優先級:中斷同時到來,誰先執行。--數字越小,優先級越高。
(1). 內核的NVIC--嵌套向量中斷控制器
NVIC 分了兩個部分
搶占(占先):高優先級 可打斷低優先級
次級:同時到來先執行誰
中斷優先級的分組:
優先級分組 分的是搶占 次級 在 優先級寄存器內所占的位數
(2). STM32F10x的 NVIC使用
16個可編程的優先級分組(使用了4位中斷優先級)
![]()
xxxx 搶占:0-15
xxx.y 搶占:0-7 次級0-1
xx.yy 搶占:0-3 次級0-3
x.yyy 搶占:0-1 次級0-7
yyyy 次級0-15對於只使用了4位優先級寄存器的芯片, 分組時PRIGROUP[2:0]寄存器值0-3 的分組 只有搶占優先級。
一個芯片在寫程序時 優先級分組 分幾次???
只分一次,在程序的最開始分組,接下來所配置的中斷優先級都按照上面的分組情況來分
例如 : 分組 5 搶占2 次級2
某中斷: 01 01
01 01 5 就是這個中斷的優先級 兩個搶占 兩個次級
取值范圍: 0-3 0-3
取值:0 – 15( 4位優先級管理 )
0 0000 00 00
1 0001 00 01
2 0010 00 10
-
中斷響應:中斷事件發生,Cortex-M3內核准備執行該事件 -- 響應。
-
中斷嵌套:內核
可嵌套的內核: 中斷可以被其他中斷打斷。
不可嵌套的內核: 不可以打斷。 -
中斷掛起:中斷事件發生了,但是Cortex-M3內核還沒准備去執行。
-
中斷服務函數:中斷發生后,要執行的程序。(固定格式或則別人要求)
中斷服務函數,需要有一個入口地址,而對於STM32來說,中斷服務函數的入口地址(中斷向量表),在
startup_stm32f10x_md.s
中。![]()
中斷服務函數:執行的特點:
只進行一些 標志位的設置,一般是不允許有延時操作,中斷服務函數可以稱之為 “執行的速度很快”。
中斷服務函數的書寫方法:
stm32f10x_it.c
中是官方推薦我們將“中斷服務函數”寫在這一個文件夾中。函數的書寫方法:
void xxx_Handler(void)
,當發生中斷時,由於有中斷服務函數向量表,所以CPU 會自動找到這個函數,並且執行這個函數中的操作。
STM32的 EXTI配置
寄存器配置
EXTI的寄存器

硬件中斷選擇
通過下面的過程來配置20個線路做為中斷源:
● 配置20個中斷線的屏蔽位(EXTI_IMR)
● 配置所選中斷線的觸發選擇位(EXTI_RTSR和EXTI_FTSR);
● 配置對應到外部中斷控制器(EXTI)的NVIC中斷通道的使能和屏蔽位,使得20個中斷線中的請求可以被正確地響應。
硬件事件選擇
通過下面的過程,可以配置20個線路為事件源
● 配置20個事件線的屏蔽位(EXTI_EMR)
● 配置事件線的觸發選擇位(EXTI_RTSR和EXTI_FTSR)
軟件中斷/事件的選擇
20個線路可以被配置成軟件中斷/事件線。下面是產生軟件中斷的過程:
● 配置20個中斷/事件線屏蔽位(EXTI_IMR, EXTI_EMR)
● 設置軟件中斷寄存器的請求位(EXTI_SWIER)
外部中斷/事件線路映像
外部中斷通用I/O映像

通過AFIO_EXTICRx配置GPIO線上的外部中斷/事件,必須先使能AFIO時鍾。
外部中斷(EXTI)的中斷源

EXTI 寄存器描述
中斷屏蔽寄存器(EXTI_IMR)
中斷使能

事件屏蔽寄存器(EXTI_EMR)
當你配置為事件模式

上升沿觸發選擇寄存器(EXTI_RTSR)

下降沿觸發選擇寄存器(EXTI_FTSR)

軟件中斷事件寄存器(EXTI_SWIER)
軟件觸發中斷,用軟件的方式將對應位置1,可以觸發中斷的產生,進而轉入中斷服務函數,執行對應的服務函數。

掛起寄存器(EXTI_PR)
中斷標志位

程序代碼
void EXTI0_Config(void)
{
//配置AFIO時要打開時鍾
RCC->APB2ENR |= (0x1<<0);
//EXTI0的中斷源選擇:默認是PA0
AFIO->EXTICR[0] |= (0x00<<0);
//EXTI的中斷配置
EXTI->IMR |= (0x1<<0);
EXTI->FTSR |= (0x1<<0);
// EXTI->RTSR |= (0x1<<0);
EXTI->PR |= (0x1<<0);
//NVIC的配置
NVIC_SetPriority(EXTI0_IRQn, 0x00);
NVIC_EnableIRQ(EXTI0_IRQn);
}
//中斷服務函數
void EXTI0_IRQHandler(void)
{
EXTI->PR |= (0x1<<0); //清除中斷標志
Beep_Toggle(BEEP_PORT, BEEP_PIN);
}
內核的NVIC中斷管理的函數
1、 4個常用的NVIC的配置函數(內核提供的配置函數);
2、這四個函數是使用 寄存器 來配置的函數,與 庫函數 的四個NVIC函數不同。
3、寄存器配置是用的NVIC功能函數 在 core_cm3.h

EXTI的庫函數配置
1、中斷源的選擇
包含文件:
![]()
![]()
開時鍾,選擇EXTI 中斷的 中斷源
![]()
中斷源的選擇函數:
GPIO_EXTILineConfig
/** * @brief Selects the GPIO pin used as EXTI Line. * @param GPIO_PortSource: selects the GPIO port to be used as source for EXTI lines. * This parameter can be GPIO_PortSourceGPIOx where x can be (A..G). * @param GPIO_PinSource: specifies the EXTI line to be configured. * This parameter can be GPIO_PinSourcex where x can be (0..15). * @retval None */ void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource) { uint32_t tmp = 0x00; /* Check the parameters */ assert_param(IS_GPIO_EXTI_PORT_SOURCE(GPIO_PortSource)); assert_param(IS_GPIO_PIN_SOURCE(GPIO_PinSource)); tmp = ((uint32_t)0x0F) << (0x04 * (GPIO_PinSource & (uint8_t)0x03)); AFIO->EXTICR[GPIO_PinSource >> 0x02] &= ~tmp; AFIO->EXTICR[GPIO_PinSource >> 0x02] |= (((uint32_t)GPIO_PortSource) << (0x04 * (GPIO_PinSource & (uint8_t)0x03))); }
EXTI的配置
EXTI中斷的配置函數:
EXTI_Init
![]()
外部中斷觸發方式
1、上升沿
2、下降沿
3、上升沿和下降沿
NVIC的配置
NVIC中斷的分組:在程序的最開始就給NVIC(嵌套向量中斷控制器)分好組
![]()
配置對應中斷的NVIC的優先級和使能。
![]()
中斷服務函數
中斷向量:
XXX_Handler
![]()
中斷服務函數的書寫:
void EXTI0_IRQHandler(void)
![]()