單片機學習
目錄
文章目錄
前言
一、中斷系統
1.1 什么是中斷
1.2 中斷優先級
1.3 中斷嵌套
1.4 C語言中的中斷程序
二、STM32的中斷通道和中斷向量
2.1 中斷通道
2.2 嵌套向量中斷控制器NVIC
2.2.1 什么是NVIC
2.2.2 NVIC基本結構
2.2.3搶占優先級和響應優先級
2.2.4 NVIC的優先級分組
三、STM32 外部中斷EXTI
3.1EXIT簡介
3.2EXIT基本結構
3.3AFIO復用IO口
3.4EXIT框圖
總結
前言
????????本文主要講述STM32的中斷系統和外部中斷,中斷系統是管理和執行中斷的邏輯結構;外部中斷是眾多能產生中斷的外設之一。
一、中斷系統
- 中斷:在主程序運行過程中,出現了特定的中斷觸發條件(中斷源),使得CPU暫停當前正在運行的程序,轉而去處理中斷程序,處理完成后又返回原來被暫停的位置繼續運行。
- 中斷優先級:當有多個中斷源同時申請中斷時,CPU會根據中斷源的輕重緩急進行裁決,優先響應更加緊急的中斷源。
- 中斷嵌套:當一個中斷程序正在運行時,又有新的更高優先級的中斷源申請中斷,CPU再次暫停當前中斷程序,轉而去處理新的中斷程序,處理完成后依次進行返回。
1.1 什么是中斷
? ? ? ? 當CPU正在執行某個程序時,由計算機內部或外部原因引起的緊急事件向CPU發出請求處理的信號,CPU在允許的情況下響應請求信號,暫時停止正在執行的程序,保護好斷點處的現場,轉向執行一個用于處理該緊急事件的程序,處理完成后又返回被終止的程序斷點處,繼續執行原程序,這一過程就是上圖中中斷響應和處理的過程。
1.2 中斷優先級
? ? ? ? 1.中斷優先級就是中斷的緊急程度。
? ? ? ? 2.中斷優先級是我們根據程序設計的需求,自己設置的。
? ? ? ? 3.中斷優先級是為了在多個中斷同時申請時,判斷一下,應該先處理哪個。如果事件非常緊急,就把優先級設置高一些;如果事件不緊急,就把優先級設置低一些。這樣可以更好的安排這些中斷事件,防止緊急的事件被別的中斷耽誤。
1.3 中斷嵌套
? ? ? ? 中斷嵌套就是把中斷程序再次中斷的現象,中斷嵌套也是為了處理非常緊急的中斷。
? ? ? ? 如果在CPU已經在執行某個中斷程序時,又發生了一個非常緊急的中斷,那這個非常緊急的中斷就可以把當前的中斷程序進行二次中斷。這樣新的緊急中斷就可以立即被執行了。等緊急的中斷結束,再繼續執行原來的中斷。原來的中斷結束再繼續主程序
? ? ? ? 能否進行中斷嵌套,是由中斷優先級來決定的。
1.4 C語言中的中斷程序
? ? ? ? 帶有中斷程序的代碼示例:
int main(void)//主函數
{while(1){//主程序//……//主程序}
}void EXTI0_IRQHandler(void)
{//中斷程序//……//中斷程序
}
? ? ? ? 在主函數中,while(1) 死循環里就是主程序。正常情況下,程序就是在主程序里不斷循環執行。當中斷條件滿足時,主程序就會暫停,自動跳轉到中斷程序里運行。中斷程序執行完之后,再返回主程序繼續執行。
? ? ? ? 一般中斷程序都是在一個子函數里的,這個子函數不需要我們調用。當中斷來臨時,由硬件自動調用這個函數。
二、STM32的中斷通道和中斷向量
2.1 中斷通道
? ? ? ? 中斷通道就是中斷源的意思。
????????可屏蔽中斷通道包含EXTI外部中斷、TIM定時器、ADC模數轉換器、USART串口、SPI通信、I2C通信、RTC實時時鐘等多個外設。
2.2 嵌套向量中斷控制器NVIC
2.2.1 什么是NVIC
? ? ? ? NVIC就是STM32中用來管理中斷、分配優先級的。
????????使用NVIC統一管理中斷,每個中斷通道都擁有16個可編程的優先等級,可對優先級進行分組,進一步設置搶占優先級和響應優先級。
STM32F10xxx產品(小容量、中容量和大容量)的向量表
STM32內核中斷:
STM32外設中斷:
? ? ? ? 表中EXTI0、EXTI1、EXTI2、EXTI3、EXTI4、EXTI9_5、EXTI15_10是外部中斷對應的中斷資源。
? ? ? ? 表的最右邊一列是中斷對應的地址,這是因為程序中斷函數的地址是由編譯器來分配的,是不固定的。但是我們的中斷跳轉,由于硬件的限制,只能跳轉到固定的地址執行程序。所以為了能讓硬件跳轉到一個不固定的中斷函數里,這里就需要在內存中定義一個地址的列表。列表地址是固定的,中斷發生后,就跳到這個固定的位置。然后在這個固定位置,由編譯器再加上一條跳轉到中斷函數的代碼,這樣中斷跳轉就可以跳轉到任意位置了。這個中斷地址的列表就叫中斷向量表,相當于中斷跳轉的一個跳板。
2.2.2 NVIC基本結構
????????NVIC的名字叫做嵌套中斷向量控制器。在STM32中,它是用來統一分配中斷優先級和管理中斷的。NVIC是一個內核外設,是CPU的小助手,NVIC有很多輸入口,有多少中斷線路都可以接過來,比如圖中可以接到EXTI、TIM、ADC、USART等。
????????圖中線上畫了個斜杠,上面寫了n,意思是一個外設可能會同時占用多個中斷通道,所以這里有n條線。NVIC只有一個輸出口,NVIC根據每個中斷的優先級分配中斷的先后順序,之后通過右邊這一個輸出口告訴CPU,該處理哪個中斷。對于中斷先后分配的任務,CPU不需要知道。
2.2.3搶占優先級和響應優先級
1.搶占優先級:pre-emption priority (先占優先級)
? ? ? ? 搶占是指打斷其他中斷的屬性,即低搶占優先級的中斷A可以被高搶占優先級的中斷B打斷,執行完中斷服務函數B后,再返回繼續執行中斷服務函數A,由此會出現中斷嵌套。
2.響應優先級:subpriority(從占優先級)
? ? ? ? 響應屬性應用在搶占屬性相同的情況下,也就是當兩個中斷源的搶占優先級相同時,分以下幾種情況處理:
- 如果兩個中斷同時到達,則中斷控制器會優先處理響應優先級高的中斷。
- 當一個中斷到來后,如果正在處理另一個中斷,則這個后到的中斷就要等到前一個中斷處理完之后才能被處理(高優先級的中斷不可以打斷低響應優先級的中斷)。
- 如果他們的搶占優先級和響應優先級都相等,則根據它們在中斷表中的排位順序決定先處理哪一個。
2.2.4 NVIC的優先級分組
? ? ? ? 為了處理不同形式的優先級,STM32的NVIC可以對優先級進行分組,分為搶占優先級和響應優先級。
????????NVIC的中斷優先級由優先級寄存器的4位(0~15)決定,這4位可以進行切分,分為高n位的搶占優先級和低4-n位的響應優先級
????????搶占優先級高的可以中斷嵌套,響應優先級高的可以優先排隊,搶占優先級和響應優先級均相同的按中斷號排隊,中斷號就是上文向量表中優先級那一列。數值小的優先響應。
? ? ? ? STM32的中斷不存在先來后到的排隊方式,在任何時候,都是優先級高的先響應。
? ? ? ? 這個分組方式可選擇,通過調用STM32固件庫的函數NVIC_PriorityGroupConfig(); 來選擇優先分組方式。選好分組方式之后,在配置優先級的時候要注意搶占優先級和響應優先級的取值范圍。不要超出表里規定的取值范圍。
三、STM32 外部中斷EXTI
3.1EXIT簡介
- EXTI(Extern Interrupt)外部中斷
- EXTI可以監測指定GPIO口的電平信號,當其指定的GPIO口產生電平變化時,EXTI將立即向NVIC發出中斷申請,經過NVIC裁決后即可中斷CPU主程序,使CPU執行EXTI對應的中斷程序
- 支持的觸發方式:上升沿/下降沿/雙邊沿/軟件觸發
- 支持的GPIO口:所有GPIO口,但相同的Pin不能同時觸發中斷(如PA0、PB0、PC0這樣的端口GPIO_Pin一樣的不能同時用,只能選1個作為中斷引腳。若有多個中斷引腳,要選擇不同Pin的引腳,如PA6、PA7、PB9、PC0這樣的。)
- 通道數:16個GPIO_Pin(對應GPIO_Pin_0到GPIO_Pin_15),外加PVD輸出、RTC鬧鐘、USB喚醒、以太網喚醒
- 觸發響應方式:中斷響應/事件響應
- 中斷響應就是申請中斷,讓CPU執行中斷函數。
- 事件響應是STM32對外部中斷增加的一種額外的功能,當外部中斷檢測到引腳電平變化時,正常的流程時選擇觸發中斷,但在STM32中也可以選擇觸發一個事件。如果選擇觸發事件,那外部中斷的信號就不會通向CPU了,而是通向其他外設,用來觸發其他外設的操作,如觸發ADC轉換、觸發DMA等。
- 觸發響應方式總結:中斷響應是正常流程,引腳電平變化觸發中斷。事件響應不會觸發中斷,而是觸發別的外設操作,屬于外設之間的聯合工作。
3.2EXIT基本結構
? ? ? ? 上圖為外部中斷的整體結構圖。最左邊是GPIO口的外設,比如GPIOA、GPIOB、GPIOC等等。每個GPIO外設有16個引腳,所以每個GPIO外設都進來16根線。
????????上文說到EXTI模塊只有16個GPIO的通道,但每個GPIO外設都有16個引腳,如果每個引腳占用一個通道,那EXIT的16個通道顯然就不夠用了。所以在GPIO外設和EXIT中間會有一個AFIO中斷引腳選擇的電路模塊。
? ? ? ? AFIO就是一個數據選擇器,它根據GPIO外設端口的引腳序號不同,把不同GPIO端口的同一個序號的引腳組成一組(如PA0、PB0、PC0、PD0、PE0、PF0、PG0為一組),每組對應一個通道連接到EXIT。所以上文說,相同的Pin不能同時觸發中斷,因為對于PA0、PB0、PC0這些相同的Pin,通過AFIO選擇后,只有其中一個能接到EXIT的通道EXIT0上。這也就是所有的GPIO口都能觸發中斷,但相同的Pin不能同時觸發中斷的原因。
? ? ? ? 通過AFIO選擇之后的16個通道,就接到了EXIT邊沿檢測及控制電路上。同時下方的PVD輸出、RTC鬧鐘、USB喚醒、ETH以太網喚醒的外設也是并列接進來的。這些加起來就組成了EXIT的20個輸入信號。
? ? ? ? 經過EXIT電路之后,分為了兩種輸出,其中上方的EXTI0、EXTI1、EXTI2、EXTI3、EXTI4、EXTI9_5、EXTI15_10、PVD、RTC、USB、ETH這些接到了NVIC,是用來觸發中斷的。下方有20條輸出線路連接到了其他外設,用來觸發其他外設操作的,就是事件響應。
????????這里注意,本來20路輸入,應該有20路中斷輸出,但是為了節約NVIC的通道資源,把其中外部中斷的9~5分配到一個通道EXTI9_5,中斷的15~10也分配到一個通道EXTI15_10。也就是外部中斷的9~5會觸發同一個中斷函數,外部中斷的15~10也會觸發同一個中斷函數。在編程的時候,對這兩個中斷函數需要再根據標志位來區分是哪個中斷進來的。
3.3AFIO復用IO口
- AFIO主要用于引腳復用功能的選擇和重定義,也就是數據選擇器的作用。
- 在STM32中,AFIO主要完成兩個任務:復用功能引腳重映射、中斷引腳選擇
? ? ? ? 上圖為AFIO選擇中斷引腳的結構圖。
3.4EXIT框圖
總結
????????以上就是今天要講的內容,本文僅僅簡單介紹了STM32的中斷基礎知識。