中斷系統(tǒng)
1 數(shù)據(jù)傳輸方式
- 無條件傳輸 :處理器不必了解外部設(shè)備狀態(tài),直接進(jìn)行數(shù)據(jù)傳輸,用于指示燈和按鍵等簡單設(shè)備.。
- 查詢方式 :傳輸前,一方先查詢另一方的狀態(tài),若已經(jīng)準(zhǔn)備好就傳輸,否則就繼續(xù)查詢。
- 中斷方式 :一方通過申請(qǐng)中斷的方式與另一方進(jìn)行數(shù)據(jù)傳輸,收發(fā)雙方可以并行工作。
- 直接存儲(chǔ)器訪問 :處理器內(nèi)部建立片內(nèi)外設(shè)和內(nèi)存之間的數(shù)據(jù)傳輸通道,傳輸過程不需要處理器參與。
2 中斷系統(tǒng)的基本概念
2.1 中斷全過程
- 中斷發(fā)生: 當(dāng)CPU在處理某一事件A時(shí),發(fā)生了另一事件B,請(qǐng)求CPU迅速去處理。
- 中斷處理: CPU暫停當(dāng)前的工作,轉(zhuǎn)去處理事件B。
- 中斷返回: 當(dāng)CPU將事件B處理完畢后,再回到事件A中被暫停的地方繼續(xù)處理事件A。
2.2 中斷的作用
- 速度匹配: 可以解決快速的CPU與慢速的外部設(shè)備之間傳送數(shù)據(jù)的矛盾。
- 分時(shí)操作: CPU可以分時(shí)為多個(gè)外部設(shè)備服務(wù),提高計(jì)算機(jī)的利用率。
- 實(shí)時(shí)響應(yīng): CPU能夠及時(shí)處理應(yīng)用系統(tǒng)的隨機(jī)事件,增強(qiáng)系統(tǒng)的實(shí)時(shí)性。
- 可靠性高: CPU可以處理設(shè)備故障及掉電等突發(fā)事件,提高系統(tǒng)可靠性。
2.3 中斷優(yōu)先級(jí)
處理器根據(jù)不同中斷的重要程序設(shè)置不同的優(yōu)先等級(jí)。
不同優(yōu)先級(jí)中斷的處理原則是: 高級(jí)中斷可以打斷低級(jí)中斷;低級(jí)中斷不能打斷高級(jí)中斷 。
2.4 中斷向量
- 中斷服務(wù)程序: 在響應(yīng)一個(gè)特定中斷的時(shí)候,處理器會(huì)執(zhí)行一個(gè)函數(shù),該函數(shù)一般稱為中斷處理程序或者中斷服務(wù)程序。
- 中斷向量: 中斷服務(wù)程序在內(nèi)存中的入口地址稱為中斷向量。
- 中斷向量表: 把系統(tǒng)中所有的中斷向量集中起來放到存儲(chǔ)器的某一區(qū)。
- 查找中斷向量:
- 編號(hào):計(jì)算機(jī)系統(tǒng)對(duì)每一個(gè)中斷源進(jìn)行編號(hào),這個(gè)號(hào)碼稱為中斷類型號(hào)。
- 查表:根據(jù)中斷類型號(hào),到中斷向量表中找到對(duì)應(yīng)的表項(xiàng)。
- 執(zhí)行:取出表項(xiàng)內(nèi)容,即該中斷源對(duì)應(yīng)的中斷服務(wù)程序地址,進(jìn)入該程序執(zhí)行相應(yīng)操作。
2.5 中斷響應(yīng)過程
- 中斷源發(fā)出中斷請(qǐng)求。
- 判斷處理器是否允許中斷,以及該中斷源是否被屏蔽。
- 中斷優(yōu)先級(jí)排隊(duì)。
- 處理器暫停當(dāng)前程序,保護(hù)斷點(diǎn)地址和處理器的當(dāng)前狀態(tài),根據(jù)中斷類型號(hào),查找中斷向量表,轉(zhuǎn)到對(duì)應(yīng)的中斷服務(wù)程序。
- 執(zhí)行中斷服務(wù)程序。
- 恢復(fù)被保護(hù)的狀態(tài),執(zhí)行中斷返回指令,回到被中斷的程序。
3 STM32微控制器中斷系統(tǒng)
3.1 基本概念
- 中斷: 中斷是由內(nèi)核外部產(chǎn)生的,一般由硬件引起,比如外設(shè)中斷和外部中斷等。
- 異常: 異常通常是內(nèi)核自身產(chǎn)生的,大多是軟件引起的,比如除法出錯(cuò)異常、預(yù)取值失敗等。
3.2 NVIC嵌套向量中斷控制器
NVIC屬于Cortex-M內(nèi)核的組件,管理所有的中斷和異常,為中斷源分配中斷通道
中斷向量表
__Vectors DCD __initial_sp ; Top of Stack
DCD Reset_Handler ; Reset Handler
DCD NMI_Handler ; NMI Handler
DCD HardFault_Handler ; Hard Fault Handler
DCD MemManage_Handler ; MPU Fault Handler
DCD BusFault_Handler ; Bus Fault Handler
DCD UsageFault_Handler ; Usage Fault Handler
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD SVC_Handler ; SVCall Handler
DCD DebugMon_Handler ; Debug Monitor Handler
DCD 0 ; Reserved
DCD PendSV_Handler ; PendSV Handler
DCD SysTick_Handler ; SysTick Handler
; External Interrupts
DCD WWDG_IRQHandler ; Window Watchdog
DCD PVD_IRQHandler ; PVD through EXTI Line detect
DCD TAMPER_IRQHandler ; Tamper
DCD RTC_IRQHandler ; RTC
DCD FLASH_IRQHandler ; Flash
DCD RCC_IRQHandler ; RCC
DCD EXTI0_IRQHandler ; EXTI Line 0
DCD EXTI1_IRQHandler ; EXTI Line 1
DCD EXTI2_IRQHandler ; EXTI Line 2
DCD EXTI3_IRQHandler ; EXTI Line 3
DCD EXTI4_IRQHandler ; EXTI Line 4
DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1
DCD DMA1_Channel2_IRQHandler ; DMA1 Channel 2
DCD DMA1_Channel3_IRQHandler ; DMA1 Channel 3
DCD DMA1_Channel4_IRQHandler ; DMA1 Channel 4
DCD DMA1_Channel5_IRQHandler ; DMA1 Channel 5
DCD DMA1_Channel6_IRQHandler ; DMA1 Channel 6
DCD DMA1_Channel7_IRQHandler ; DMA1 Channel 7
DCD ADC1_2_IRQHandler ; ADC1_2
DCD USB_HP_CAN1_TX_IRQHandler ; USB High Priority or CAN1 TX
DCD USB_LP_CAN1_RX0_IRQHandler ; USB Low Priority or CAN1 RX0
DCD CAN1_RX1_IRQHandler ; CAN1 RX1
DCD CAN1_SCE_IRQHandler ; CAN1 SCE
DCD EXTI9_5_IRQHandler ; EXTI Line 9..5
DCD TIM1_BRK_IRQHandler ; TIM1 Break
DCD TIM1_UP_IRQHandler ; TIM1 Update
DCD TIM1_TRG_COM_IRQHandler ; TIM1 Trigger and Commutation
DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare
DCD TIM2_IRQHandler ; TIM2
DCD TIM3_IRQHandler ; TIM3
DCD TIM4_IRQHandler ; TIM4
DCD I2C1_EV_IRQHandler ; I2C1 Event
DCD I2C1_ER_IRQHandler ; I2C1 Error
DCD I2C2_EV_IRQHandler ; I2C2 Event
DCD I2C2_ER_IRQHandler ; I2C2 Error
DCD SPI1_IRQHandler ; SPI1
DCD SPI2_IRQHandler ; SPI2
DCD USART1_IRQHandler ; USART1
DCD USART2_IRQHandler ; USART2
DCD USART3_IRQHandler ; USART3
DCD EXTI15_10_IRQHandler ; EXTI Line 15..10
DCD RTC_Alarm_IRQHandler ; RTC Alarm through EXTI Line
DCD USBWakeUp_IRQHandler ; USB Wakeup from suspend
__Vectors_End
3.3 中斷通道
微控制器片內(nèi)集成了很多外設(shè),對(duì)于單個(gè)外設(shè)而言,它通常具備若干個(gè)可以引起中斷的中斷源,而該外設(shè)的所有中斷源只能通過指定的中斷通道向內(nèi)核申請(qǐng)中斷。
以STM32F103芯片為例,它支持43個(gè)可屏蔽中斷通道(不包括16個(gè)Cortex-M3的中斷線),已經(jīng)固定分配給相應(yīng)的片內(nèi)外設(shè)。由于中斷源數(shù)量較多,而中斷通道有限,會(huì)出現(xiàn)多個(gè)中斷源共享同一個(gè)中斷通道的情況。
3.4 中斷優(yōu)先級(jí)
- NVIC中有一個(gè)8位中斷優(yōu)先級(jí)寄存器NVIC_IPR,理論上可以配置0~255共256級(jí)中斷。
- STM32只使用了其中的高4位,并分成搶占優(yōu)先級(jí)和子優(yōu)先級(jí)兩組。
中斷嵌套:
多個(gè)中斷同時(shí)提出中斷申請(qǐng)時(shí)
- 先比較搶占優(yōu)先級(jí),搶占優(yōu)先級(jí)高的中斷先執(zhí)行。
- 如果搶占優(yōu)先級(jí)相同,則比較子優(yōu)先級(jí)。
- 二者都相同時(shí),比較中斷編號(hào)。編號(hào)越小,優(yōu)先級(jí)越高。中斷編號(hào)位于芯片頭文件中。
STM32中斷優(yōu)先級(jí)分組
HAL庫初始化函數(shù)HAL_Init將優(yōu)先級(jí)分組設(shè)置為第4組,即有0~15,共16級(jí)搶占優(yōu)先級(jí),沒有子優(yōu)先級(jí)。編號(hào)越小的優(yōu)先級(jí)越高:0號(hào)為最高,15號(hào)為最低。
3.5 EXIT外部中斷控制器
GPIO引腳的外部中斷
觸發(fā)方式:
- 上升沿觸發(fā)
- 下降沿觸發(fā)
- 雙邊沿觸發(fā)
引腳分組:
- 尾號(hào)相同的引腳一組,接入1個(gè)外部中斷線。
- 同組引腳只能有一個(gè)設(shè)置為外部中斷功能。
中斷通道:
- EXTI0~EXIT4分別具有獨(dú)立的中斷通道
- EXTI5~EXIT9共享同一個(gè)中斷通道
- EXTI5~EXIT9共享同一個(gè)中斷通道
4 HAL庫中斷處理流程
4.1 編程步驟
在STM32CubeMX中完成
- 設(shè)置中斷觸發(fā)條件
- 設(shè)置中斷優(yōu)先等級(jí)
- 設(shè)能外設(shè)中斷
HAL庫的接口函數(shù)完成
- 清除中斷標(biāo)志
- 編寫中斷服務(wù)程序
4.2 HAL庫對(duì)中斷的封裝處理
- 統(tǒng)一規(guī)定處理各個(gè)外設(shè)的中斷服務(wù)程序
HAL_PPP_IRQHandler
。 - 在中斷服務(wù)程序
HAL_PPP_IRQHandler
完成了中斷標(biāo)志的判斷和清除。 - 將中斷中需要執(zhí)行的操作以回調(diào)函數(shù)的形式提供給用戶。
啟動(dòng)文件startup_stm32fxxx.s
- 該文件存放在MDK-ARM組中。在該文件中,預(yù)先為每個(gè)中斷編寫了一個(gè)中斷服務(wù)程序,只是這些中斷服務(wù)程序都是死循環(huán),目的只是 初始化中斷向量表 ;
- 中斷服務(wù)程序的屬性定義為“
weak
”。weak
屬性的函數(shù)表示:如果該函數(shù)沒有在其他文件中定義,則使用該函數(shù);如果用戶在其他地方定義了該函數(shù),則使用用戶定義的函數(shù)。
中斷服務(wù)程序文件:stm32fxxx_it.c
該文件存放在User組中,用于 存放各個(gè)中斷的中斷服務(wù)程序 ;
在使用CubeMX軟件進(jìn)行初始化配置時(shí),如果使能了某一個(gè)外設(shè)的中斷功能,那么在生成代碼時(shí),相對(duì)應(yīng)的外設(shè)中斷服務(wù)程序
HAL_PPP_IRQHandler
就會(huì)自動(dòng)添加到該文件中,用戶只需要在該函數(shù)中添加相應(yīng)的中斷處理代碼即可。
外部中斷所對(duì)應(yīng)的中斷服務(wù)程序外部中斷線 中斷服務(wù)程序的函數(shù)名稱 外部中斷線0(EXTI Line 0) EXTI0_IRQHandler 外部中斷線1(EXTI Line 1) EXTI1_IRQHandler 外部中斷線2(EXTI Line 2) EXTI2_IRQHandler 外部中斷線3(EXTI Line 3) EXTI3_IRQHandler 外部中斷線4(EXTI Line 4) EXTI4_IRQHandler 外部中斷線5~9(EXTI Line[9:5]) EXTI9_5_IRQHandler 外部中斷線10~15(EXTI Line[15:10]) EXTI15_10_IRQHandler 例如
/** * @brief This function handles EXTI line0 interrupt. */ void EXTI0_IRQHandler(void) { /* USER CODE BEGIN EXTI0_IRQn 0 */ /* USER CODE END EXTI0_IRQn 0 */ HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0); /* USER CODE BEGIN EXTI0_IRQn 1 */ /* USER CODE END EXTI0_IRQn 1 */ }
4.3 外部中斷處理流程
假設(shè)微控制器芯片為STM32F103,設(shè)置引腳PA0為外部中斷功能。當(dāng)引腳PA0出現(xiàn)脈沖邊沿時(shí),將觸發(fā)外部中斷。
由于外部中斷主要是利用GPIO引腳實(shí)現(xiàn),因此外部中斷數(shù)據(jù)類型的定義放在stm32f1xx_hal_gpio.h
文件中,外部中斷接口函數(shù)的實(shí)現(xiàn)放在stm32f1xx_hal_gpio.c
文件中。
引腳初始化
成員變量Mode的取值范圍GPIO_MODE_IT_RISING
上升沿觸發(fā)GPIO_MODE_IT_FALLING
下降沿觸發(fā)GPIO_MODE_IT_RISING_FALLING
雙邊沿觸發(fā)
外部中斷通用處理函數(shù)
HAL_GPIO_EXTI_IRQHandler
/** * @brief This function handles EXTI interrupt request. * @param GPIO_Pin: Specifies the pins connected EXTI line * @retval None */ void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin) { /* EXTI line interrupt detected */ if (__HAL_GPIO_EXTI_GET_IT(GPIO_Pin) != 0x00u) { __HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin); HAL_GPIO_EXTI_Callback(GPIO_Pin); } }
函數(shù)原型 void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin) 功能描述 作為所有外部中斷發(fā)生后的通用處理函數(shù) 入口參數(shù) GPIO_Pin:連接到對(duì)應(yīng)外部中斷線的引腳,范圍是 GPIO_PIN_0~GPIO_PIN_15 返回值 無 注意事項(xiàng) 1. 所有外部中斷服務(wù)程序均調(diào)用該函數(shù)完成中斷處理2. 函數(shù)內(nèi)部根據(jù)GPIO_Pin的取值判斷中斷源,并清除對(duì)應(yīng)外部中斷線的中斷標(biāo)志3. 函數(shù)內(nèi)部調(diào)用外部中斷回調(diào)函數(shù)HAL_GPIO_EXTI_Callback完成實(shí)際的處理任務(wù)4. 該函數(shù)由CubeMX自動(dòng)生成 外部中斷回調(diào)函數(shù)
HAL_GPIO_EXTI_Callback
/** * @brief EXTI line detection callbacks. * @param GPIO_Pin: Specifies the pins connected EXTI line * @retval None */ __weak void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { /* Prevent unused argument(s) compilation warning */ UNUSED(GPIO_Pin); /* NOTE: This function Should not be modified, when the callback is needed, the HAL_GPIO_EXTI_Callback could be implemented in the user file */ }
函數(shù)原型 void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) 功能描述 外部中斷回調(diào)函數(shù),用于處理具體的中斷任務(wù) 入口參數(shù) GPIO_Pin:連接到對(duì)應(yīng)外部中斷線的引腳,范圍是 GPIO_PIN_0~GPIO_PIN_15 返回值 無 注意事項(xiàng) 1. 該函數(shù)由外部中斷通用處理函數(shù)HAL_GPIO_EXTI_IRQHandler調(diào)用,完成所有外部中斷的任務(wù)處理2. 函數(shù)內(nèi)部先根據(jù)GPIO_Pin的取值來判斷中斷源,然后執(zhí)行對(duì)應(yīng)的中斷任務(wù)3. 該函數(shù)由用戶根據(jù)實(shí)際需求編寫
任務(wù)實(shí)踐
基于STM32F103C8T6,開發(fā)板原理圖
利用按鍵KEY1改變指示燈LED1的閃爍頻率,閃爍頻率設(shè)置為3檔:
- 初始狀態(tài)時(shí),LED1按照1Hz的頻率閃爍;
- 第一次按鍵后,LED1按照5Hz的頻率閃爍;
- 第二次按鍵后,LED1按照20Hz的頻率閃爍,并重復(fù)上述過程。
注:本任務(wù)例程使用的開發(fā)板,LED1與STM32的PA1相連接,KEY1與PA0相連接。KEY1原理圖如下:
使用按鍵時(shí),需要設(shè)置PA0為輸入上拉模式,這樣在KEY1沒有按下時(shí),PA0可以讀取到高電平,KEY1按下時(shí)PA0可以讀取到低電平。
- 配置PA0為GPIO_EXIT0,PA1為GPIO_Output
- PA1保持默認(rèn)GPIO輸出模式即可
- PA0配置為下降沿觸發(fā),上拉模式
- 使能外部中斷線
- 配置中斷優(yōu)先級(jí)分組為第四組16級(jí)搶占優(yōu)先級(jí),沒有子優(yōu)先級(jí)
以上步驟生成如下代碼:
stm32f1xx_hal_gpio.c
中生成GPIO引腳配置代碼,并在main.c中調(diào)用void MX_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; /* GPIO Ports Clock Enable */ __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_GPIOB_CLK_ENABLE(); /*Configure GPIO pin Output Level */ HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET); /*Configure GPIO pin : PA0 */ GPIO_InitStruct.Pin = GPIO_PIN_0; GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); /*Configure GPIO pin : PA1 */ GPIO_InitStruct.Pin = GPIO_PIN_1; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); /* EXTI interrupt init*/ HAL_NVIC_SetPriority(EXTI0_IRQn, 0, 0); HAL_NVIC_EnableIRQ(EXTI0_IRQn); }
- 開啟外設(shè)時(shí)鐘RCC
- 配置PA0,PA1兩個(gè)引腳結(jié)構(gòu)體
- 設(shè)置EXTI0中斷優(yōu)先級(jí)為0,并使能這個(gè)中斷
stm32fxxx_it.c
中生成外設(shè)中斷服務(wù)程序/** * @brief This function handles EXTI line0 interrupt. */ void EXTI0_IRQHandler(void) { /* USER CODE BEGIN EXTI0_IRQn 0 */ /* USER CODE END EXTI0_IRQn 0 */ HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0); /* USER CODE BEGIN EXTI0_IRQn 1 */ /* USER CODE END EXTI0_IRQn 1 */ }
編寫程序
在main.c
中定義指示燈閃爍頻率,0代表1Hz,1代表5Hz,2代表20Hz/* Private variables ---------------------------------------------------------*/ /* USER CODE BEGIN PV */ volatile uint8_t Speed = 0; /* USER CODE END PV */
在
main.c
中編寫應(yīng)用代碼/* USER CODE BEGIN 3 */ if (Speed == 0) { HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_1); HAL_Delay(1000); } else if (Speed == 1) { HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_1); HAL_Delay(200); } else { HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_1); HAL_Delay(50); } } /* USER CODE END 3 */
在
main.c
中外部中斷回調(diào)函數(shù)HAL_GPIO_EXTI_Callback
/* USER CODE BEGIN 4 */ void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { if(GPIO_Pin == GPIO_PIN_0) { Speed++; if (Speed == 3) { Speed = 0; } } } /* USER CODE END 4 */
-
微控制器
+關(guān)注
關(guān)注
48文章
7840瀏覽量
153300 -
處理器
+關(guān)注
關(guān)注
68文章
19714瀏覽量
232730 -
STM32
+關(guān)注
關(guān)注
2282文章
10986瀏覽量
361111 -
中斷系統(tǒng)
+關(guān)注
關(guān)注
1文章
96瀏覽量
61247
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
【北京迅為】iTOP-RK3568OpenHarmony系統(tǒng)南向驅(qū)動(dòng)開發(fā)GPIO基礎(chǔ)知識(shí)

功率器件熱設(shè)計(jì)基礎(chǔ)知識(shí)
PCB繪制基礎(chǔ)知識(shí)

華為-射頻基礎(chǔ)知識(shí)培訓(xùn)
stm32 GPIO中斷配置教程
Verilog HDL的基礎(chǔ)知識(shí)

負(fù)載開關(guān)基礎(chǔ)知識(shí)

全新的半導(dǎo)體基礎(chǔ)知識(shí)

超聲波傳感基礎(chǔ)知識(shí)

評(píng)論