中斷系統(tǒng)
1 數(shù)據(jù)傳輸方式
- 無條件傳輸 :處理器不必了解外部設(shè)備狀態(tài),直接進行數(shù)據(jù)傳輸,用于指示燈和按鍵等簡單設(shè)備.。
- 查詢方式 :傳輸前,一方先查詢另一方的狀態(tài),若已經(jīng)準備好就傳輸,否則就繼續(xù)查詢。
- 中斷方式 :一方通過申請中斷的方式與另一方進行數(shù)據(jù)傳輸,收發(fā)雙方可以并行工作。
- 直接存儲器訪問 :處理器內(nèi)部建立片內(nèi)外設(shè)和內(nèi)存之間的數(shù)據(jù)傳輸通道,傳輸過程不需要處理器參與。
2 中斷系統(tǒng)的基本概念
2.1 中斷全過程
- 中斷發(fā)生: 當CPU在處理某一事件A時,發(fā)生了另一事件B,請求CPU迅速去處理。
- 中斷處理: CPU暫停當前的工作,轉(zhuǎn)去處理事件B。
- 中斷返回: 當CPU將事件B處理完畢后,再回到事件A中被暫停的地方繼續(xù)處理事件A。
2.2 中斷的作用
- 速度匹配: 可以解決快速的CPU與慢速的外部設(shè)備之間傳送數(shù)據(jù)的矛盾。
- 分時操作: CPU可以分時為多個外部設(shè)備服務(wù),提高計算機的利用率。
- 實時響應(yīng): CPU能夠及時處理應(yīng)用系統(tǒng)的隨機事件,增強系統(tǒng)的實時性。
- 可靠性高: CPU可以處理設(shè)備故障及掉電等突發(fā)事件,提高系統(tǒng)可靠性。
2.3 中斷優(yōu)先級
處理器根據(jù)不同中斷的重要程序設(shè)置不同的優(yōu)先等級。
不同優(yōu)先級中斷的處理原則是: 高級中斷可以打斷低級中斷;低級中斷不能打斷高級中斷 。
2.4 中斷向量
- 中斷服務(wù)程序: 在響應(yīng)一個特定中斷的時候,處理器會執(zhí)行一個函數(shù),該函數(shù)一般稱為中斷處理程序或者中斷服務(wù)程序。
- 中斷向量: 中斷服務(wù)程序在內(nèi)存中的入口地址稱為中斷向量。
- 中斷向量表: 把系統(tǒng)中所有的中斷向量集中起來放到存儲器的某一區(qū)。
- 查找中斷向量:
- 編號:計算機系統(tǒng)對每一個中斷源進行編號,這個號碼稱為中斷類型號。
- 查表:根據(jù)中斷類型號,到中斷向量表中找到對應(yīng)的表項。
- 執(zhí)行:取出表項內(nèi)容,即該中斷源對應(yīng)的中斷服務(wù)程序地址,進入該程序執(zhí)行相應(yīng)操作。
2.5 中斷響應(yīng)過程
- 中斷源發(fā)出中斷請求。
- 判斷處理器是否允許中斷,以及該中斷源是否被屏蔽。
- 中斷優(yōu)先級排隊。
- 處理器暫停當前程序,保護斷點地址和處理器的當前狀態(tài),根據(jù)中斷類型號,查找中斷向量表,轉(zhuǎn)到對應(yīng)的中斷服務(wù)程序。
- 執(zhí)行中斷服務(wù)程序。
- 恢復(fù)被保護的狀態(tài),執(zhí)行中斷返回指令,回到被中斷的程序。
3 STM32微控制器中斷系統(tǒng)
3.1 基本概念
- 中斷: 中斷是由內(nèi)核外部產(chǎn)生的,一般由硬件引起,比如外設(shè)中斷和外部中斷等。
- 異常: 異常通常是內(nèi)核自身產(chǎn)生的,大多是軟件引起的,比如除法出錯異常、預(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è),對于單個外設(shè)而言,它通常具備若干個可以引起中斷的中斷源,而該外設(shè)的所有中斷源只能通過指定的中斷通道向內(nèi)核申請中斷。
以STM32F103芯片為例,它支持43個可屏蔽中斷通道(不包括16個Cortex-M3的中斷線),已經(jīng)固定分配給相應(yīng)的片內(nèi)外設(shè)。由于中斷源數(shù)量較多,而中斷通道有限,會出現(xiàn)多個中斷源共享同一個中斷通道的情況。
3.4 中斷優(yōu)先級
- NVIC中有一個8位中斷優(yōu)先級寄存器NVIC_IPR,理論上可以配置0~255共256級中斷。
- STM32只使用了其中的高4位,并分成搶占優(yōu)先級和子優(yōu)先級兩組。
中斷嵌套:
多個中斷同時提出中斷申請時
- 先比較搶占優(yōu)先級,搶占優(yōu)先級高的中斷先執(zhí)行。
- 如果搶占優(yōu)先級相同,則比較子優(yōu)先級。
- 二者都相同時,比較中斷編號。編號越小,優(yōu)先級越高。中斷編號位于芯片頭文件中。
STM32中斷優(yōu)先級分組
HAL庫初始化函數(shù)HAL_Init將優(yōu)先級分組設(shè)置為第4組,即有0~15,共16級搶占優(yōu)先級,沒有子優(yōu)先級。編號越小的優(yōu)先級越高:0號為最高,15號為最低。
3.5 EXIT外部中斷控制器
GPIO引腳的外部中斷
觸發(fā)方式:
- 上升沿觸發(fā)
- 下降沿觸發(fā)
- 雙邊沿觸發(fā)
引腳分組:
- 尾號相同的引腳一組,接入1個外部中斷線。
- 同組引腳只能有一個設(shè)置為外部中斷功能。
中斷通道:
- EXTI0~EXIT4分別具有獨立的中斷通道
- EXTI5~EXIT9共享同一個中斷通道
- EXTI5~EXIT9共享同一個中斷通道
4 HAL庫中斷處理流程
4.1 編程步驟
在STM32CubeMX中完成
- 設(shè)置中斷觸發(fā)條件
- 設(shè)置中斷優(yōu)先等級
- 設(shè)能外設(shè)中斷
HAL庫的接口函數(shù)完成
- 清除中斷標志
- 編寫中斷服務(wù)程序
4.2 HAL庫對中斷的封裝處理
- 統(tǒng)一規(guī)定處理各個外設(shè)的中斷服務(wù)程序
HAL_PPP_IRQHandler
。 - 在中斷服務(wù)程序
HAL_PPP_IRQHandler
完成了中斷標志的判斷和清除。 - 將中斷中需要執(zhí)行的操作以回調(diào)函數(shù)的形式提供給用戶。
啟動文件startup_stm32fxxx.s
- 該文件存放在MDK-ARM組中。在該文件中,預(yù)先為每個中斷編寫了一個中斷服務(wù)程序,只是這些中斷服務(wù)程序都是死循環(huán),目的只是 初始化中斷向量表 ;
- 中斷服務(wù)程序的屬性定義為“
weak
”。weak
屬性的函數(shù)表示:如果該函數(shù)沒有在其他文件中定義,則使用該函數(shù);如果用戶在其他地方定義了該函數(shù),則使用用戶定義的函數(shù)。
中斷服務(wù)程序文件:stm32fxxx_it.c
該文件存放在User組中,用于 存放各個中斷的中斷服務(wù)程序 ;
在使用CubeMX軟件進行初始化配置時,如果使能了某一個外設(shè)的中斷功能,那么在生成代碼時,相對應(yīng)的外設(shè)中斷服務(wù)程序
HAL_PPP_IRQHandler
就會自動添加到該文件中,用戶只需要在該函數(shù)中添加相應(yīng)的中斷處理代碼即可。
外部中斷所對應(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為外部中斷功能。當引腳PA0出現(xiàn)脈沖邊沿時,將觸發(fā)外部中斷。
由于外部中斷主要是利用GPIO引腳實現(xiàn),因此外部中斷數(shù)據(jù)類型的定義放在stm32f1xx_hal_gpio.h
文件中,外部中斷接口函數(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:連接到對應(yīng)外部中斷線的引腳,范圍是 GPIO_PIN_0~GPIO_PIN_15 返回值 無 注意事項 1. 所有外部中斷服務(wù)程序均調(diào)用該函數(shù)完成中斷處理2. 函數(shù)內(nèi)部根據(jù)GPIO_Pin的取值判斷中斷源,并清除對應(yīng)外部中斷線的中斷標志3. 函數(shù)內(nèi)部調(diào)用外部中斷回調(diào)函數(shù)HAL_GPIO_EXTI_Callback完成實際的處理任務(wù)4. 該函數(shù)由CubeMX自動生成 外部中斷回調(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:連接到對應(yīng)外部中斷線的引腳,范圍是 GPIO_PIN_0~GPIO_PIN_15 返回值 無 注意事項 1. 該函數(shù)由外部中斷通用處理函數(shù)HAL_GPIO_EXTI_IRQHandler調(diào)用,完成所有外部中斷的任務(wù)處理2. 函數(shù)內(nèi)部先根據(jù)GPIO_Pin的取值來判斷中斷源,然后執(zhí)行對應(yīng)的中斷任務(wù)3. 該函數(shù)由用戶根據(jù)實際需求編寫
任務(wù)實踐
基于STM32F103C8T6,開發(fā)板原理圖
利用按鍵KEY1改變指示燈LED1的閃爍頻率,閃爍頻率設(shè)置為3檔:
- 初始狀態(tài)時,LED1按照1Hz的頻率閃爍;
- 第一次按鍵后,LED1按照5Hz的頻率閃爍;
- 第二次按鍵后,LED1按照20Hz的頻率閃爍,并重復(fù)上述過程。
注:本任務(wù)例程使用的開發(fā)板,LED1與STM32的PA1相連接,KEY1與PA0相連接。KEY1原理圖如下:
使用按鍵時,需要設(shè)置PA0為輸入上拉模式,這樣在KEY1沒有按下時,PA0可以讀取到高電平,KEY1按下時PA0可以讀取到低電平。
- 配置PA0為GPIO_EXIT0,PA1為GPIO_Output
- PA1保持默認GPIO輸出模式即可
- PA0配置為下降沿觸發(fā),上拉模式
- 使能外部中斷線
- 配置中斷優(yōu)先級分組為第四組16級搶占優(yōu)先級,沒有子優(yōu)先級
以上步驟生成如下代碼:
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è)時鐘RCC
- 配置PA0,PA1兩個引腳結(jié)構(gòu)體
- 設(shè)置EXTI0中斷優(yōu)先級為0,并使能這個中斷
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文章
7552瀏覽量
151423 -
處理器
+關(guān)注
關(guān)注
68文章
19286瀏覽量
229841 -
STM32
+關(guān)注
關(guān)注
2270文章
10900瀏覽量
356005 -
中斷系統(tǒng)
+關(guān)注
關(guān)注
1文章
96瀏覽量
61021
發(fā)布評論請先 登錄
相關(guān)推薦
評論