外部中斷的使用_第1頁
外部中斷的使用_第2頁
外部中斷的使用_第3頁
外部中斷的使用_第4頁
外部中斷的使用_第5頁
已閱讀5頁,還剩5頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、STM32學(xué)習(xí)筆記(2 :外部中斷的使用2013年 7月 14日中斷對(duì)于開發(fā)嵌入式系統(tǒng)來講的地位絕對(duì)是毋庸置疑的,在 C51單片機(jī)時(shí)代,一共只有 5個(gè)中 斷,其中 2個(gè)外部中斷, 2個(gè)定時(shí) /計(jì)數(shù)器中斷和一個(gè)串口中斷,但是在 STM32中,中斷數(shù)量大大增 加,而且中斷的設(shè)置也更加復(fù)雜。今天就將來探討一下關(guān)于 STM32中的中斷系統(tǒng)。1 基本概念A(yù)RM Coetex-M3內(nèi)核共支持 256個(gè)中斷,其中 16個(gè)內(nèi)部中斷, 240個(gè)外部中斷和可編程的 256級(jí)中斷優(yōu)先級(jí)的設(shè)置。 STM32目前支持的中斷共 84個(gè)(16個(gè)內(nèi)部 +68個(gè)外部 ,還有 16級(jí)可編程的 中斷優(yōu)先級(jí)的設(shè)置,僅使用中斷優(yōu)先級(jí)設(shè)

2、置 8bit 中的高 4位。STM32可支持 68個(gè)中斷通道,已經(jīng)固定分配給相應(yīng)的外部設(shè)備,每個(gè)中斷通道都具備自己的中 斷優(yōu)先級(jí)控制字節(jié) PRI_n(8位,但是 STM32中只使用 4位,高 4位有效 ,每 4個(gè)通道的 8位中斷優(yōu) 先級(jí)控制字構(gòu)成一個(gè) 32位的優(yōu)先級(jí)寄存器。 68個(gè)通道的優(yōu)先級(jí)控制字至少構(gòu)成 17個(gè) 32位的優(yōu)先級(jí) 寄存器。4bit 的中斷優(yōu)先級(jí)可以分成 2組,從高位看,前面定義的是搶占式優(yōu)先級(jí),后面是響應(yīng)優(yōu)先級(jí)。 按照這種分組, 4bit 一共可以分成 5組第 0組:所有 4bit 用于指定響應(yīng)優(yōu)先級(jí);第 1組:最高 1位用于指定搶占式優(yōu)先級(jí),后面 3位用于指定響應(yīng)優(yōu)先級(jí);第

3、 2組:最高 2位用于指定搶占式優(yōu)先級(jí),后面 2位用于指定響應(yīng)優(yōu)先級(jí);第 3組:最高 3位用于指定搶占式優(yōu)先級(jí),后面 1位用于指定響應(yīng)優(yōu)先級(jí);第 4組:所有 4位用于指定搶占式優(yōu)先級(jí)。所謂搶占式優(yōu)先級(jí)和響應(yīng)優(yōu)先級(jí), 他們之間的關(guān)系是:具有高搶占式優(yōu)先級(jí)的中斷可以在具有低 搶占式優(yōu)先級(jí)的中斷處理過程中被響應(yīng),即中斷嵌套。當(dāng)兩個(gè)中斷源的搶占式優(yōu)先級(jí)相同時(shí),這兩個(gè)中斷將沒有嵌套關(guān)系,當(dāng)一個(gè)中斷到來后,如果正 在處理另一個(gè)中斷, 這個(gè)后到來的中斷就要等到前一個(gè)中斷處理完之后才能被處理。 如果這兩個(gè)中斷 同時(shí)到達(dá), 則中斷控制器根據(jù)他們的響應(yīng)優(yōu)先級(jí)高低來決定先處理哪一個(gè); 如果他們的搶占式優(yōu)先級(jí) 和響應(yīng)

4、優(yōu)先級(jí)都相等, 則根據(jù)他們?cè)谥袛啾碇械呐盼豁樞驔Q定先處理哪一個(gè)。 每一個(gè)中斷源都必須定 義 2個(gè)優(yōu)先級(jí)。有幾點(diǎn)需要注意的是:1如果指定的搶占式優(yōu)先級(jí)別或響應(yīng)優(yōu)先級(jí)別超出了選定的優(yōu)先級(jí)分組所限定的范圍,將可能 得到意想不到的結(jié)果;2搶占式優(yōu)先級(jí)別相同的中斷源之間沒有嵌套關(guān)系;3如果某個(gè)中斷源被指定為某個(gè)搶占式優(yōu)先級(jí)別,又沒有其它中斷源處于同一個(gè)搶占式優(yōu)先級(jí)別,則可以為這個(gè)中斷源指定任意有效的響應(yīng)優(yōu)先級(jí)別。2 GPIO外部中斷STM32中,每一個(gè) GPIO 都可以觸發(fā)一個(gè)外部中斷,但是, GPIO 的中斷是以組為一個(gè)單位的,同 組間的外部中斷同一時(shí)間只能使用一個(gè)。 比如說, PA0, PB0, P

5、C0, PD0, PE0, PF0, PG0這些為 1組, 如果我們使用 PA0作為外部中斷源, 那么別的就不能夠再使用了, 在此情況下, 我們只能使用類似于 PB1, PC2這種末端序號(hào)不同的外部中斷源。每一組使用一個(gè)中斷標(biāo)志 EXTIx 。EXTI0 EXTI4這 5個(gè)外部中斷有著自己的單獨(dú)的中斷響應(yīng)函數(shù),EXTI5-9共用一個(gè)中斷響應(yīng)函數(shù),EXTI10-15共用一個(gè)中斷響應(yīng)函數(shù)。對(duì)于中斷的控制, STM32有一個(gè)專用的管理機(jī)構(gòu):NVIC 。對(duì)于 NVIC 的詳細(xì)解釋,可以參考 ARM Cortex-M3權(quán)威指南 , Joseph Yiu 著,宋巖譯,北京航空航天大學(xué)出版社出版,第 8章

6、NVIC 與中斷 控制。中斷的使能,掛起,優(yōu)先級(jí),活動(dòng)等等部都是 NVIC 在管理的。因?yàn)槲覍W(xué)習(xí) STM32重點(diǎn)在于如 何開發(fā)程序, 所以內(nèi)部的一些東西, 在此我就不詳細(xì)說明了, 有感興趣的可以參看上面提到的那本數(shù)。3 程序開發(fā)其實(shí)上面那些基本概念和知識(shí)只是對(duì) STM32的中斷系統(tǒng)有一個(gè)大概的認(rèn)識(shí), 用程序說話將會(huì)更能 夠加深如何使用中斷。 使用外部中斷的基本步驟如下:1. 設(shè)置好相應(yīng)的時(shí)鐘;2. 設(shè)置相應(yīng)的中斷;3. IO口初始化;4. 把相應(yīng)的 IO 口設(shè)置為中斷線路(要在設(shè)置外部中斷之前并初始化;5. 在選擇的中斷通道的響應(yīng)函數(shù)中中斷函數(shù)。由于我用的奮斗開發(fā)板沒有引出相應(yīng)的芯片引腳, 所

7、以只能用按鍵來觸發(fā)相應(yīng)的中斷。 根據(jù)原理 圖, K1/K2/K3連接的是 PC5/PC2/PC3,因此我將用 EXTI5/EXTI2/EXTI3三個(gè)外部中斷。 PB5/PD6/PD3分別連接了三個(gè) LED 燈。中斷的效果是按下按鍵,相應(yīng)的 LED 燈將會(huì)被點(diǎn)亮。1. 設(shè)置相應(yīng)的時(shí)鐘首先需要打開 GPIOB 、 GPIOC 和 GPIOE (因?yàn)榘存I另外一端連接的是 PE 口 。 然后由于是要用于觸 發(fā)中斷, 所以還需要打開 GPIO 復(fù)用的時(shí)鐘。 相應(yīng)的函數(shù)在 GPIO 的學(xué)習(xí)筆記中有了詳細(xì)了解釋。 詳細(xì) 代碼如下:void RCC_cfg(/打開 PE PD PC PB端口時(shí)鐘,并且打開復(fù)用

8、時(shí)鐘RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE|RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO, ENABLE;設(shè)置相應(yīng)的時(shí)鐘所需要的 RCC 函數(shù)在 stm32f10x_rcc.c中,所以要在工程中添加此文件。2. 設(shè)置好相應(yīng)的中斷設(shè)置相應(yīng)的中斷實(shí)際上就是設(shè)置 NVIC ,在 STM32的固件庫(kù)中有一個(gè)結(jié)構(gòu)體 NVIC_InitTypeDef,里面有相應(yīng)的標(biāo)志位設(shè)置,然后再用 NVIC_Init(函數(shù)進(jìn)行初始化。詳細(xì)代碼如下:voi

9、d NVIC_cfg(NVIC_InitTypeDef NVIC_InitStructure;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2; /選擇中斷分組 2NVIC_InitStructure.NVIC_IRQChannel=EXTI2_IRQChannel;/中斷通道 2NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;/搶占式中斷優(yōu)先級(jí)設(shè)置為 0NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; /響應(yīng)式中斷優(yōu)先級(jí)設(shè)置為 0NV

10、IC_InitStructure.NVIC_IRQChannelCmd=ENABLE; /使能中斷NVIC_Init(&NVIC_InitStructure;NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQChannel;/選擇中斷通道 3NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;/搶占式中斷優(yōu)先級(jí)設(shè)置為 1NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;/響應(yīng)式中斷優(yōu)先級(jí)設(shè)置為 1NVIC_InitStructure.

11、NVIC_IRQChannelCmd=ENABLE; /使能中斷NVIC_Init(&NVIC_InitStructure;NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQChannel; /選擇中斷通道 5NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority= 2;/搶占式中斷優(yōu)先級(jí)設(shè)置為 2NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; /響應(yīng)式中斷優(yōu)先級(jí)設(shè)置為 2NVIC_InitStructure.NVIC_IRQChanne

12、lCmd=ENABLE; /使能中斷NVIC_Init(&NVIC_InitStructure;由于有 3個(gè)中斷, 因此根據(jù)前文所述, 需要有 3個(gè) bit 來指定搶占優(yōu)先級(jí), 所以選擇第 2組。 又由于 EXT 5-9共用一個(gè)中斷響應(yīng)函數(shù),所以 EXTI5選擇的中斷通道是 EXTI9_5_IRQChannel,詳細(xì)信息可以在頭文件中 查詢得到。用到的 NVIC 相關(guān)的庫(kù)函數(shù)在 stm32f10x_nivc.c中,需要將此文件復(fù)制并添加到工程中。具體位置可以查看關(guān)于 GPIO 的筆記。這段代碼編譯起來沒有任何問題,但是在鏈接的時(shí)候就會(huì)報(bào)錯(cuò),需要把 STM32F10xR.LIB 加入工程

13、中,具體位置在 KeilARMRV31LIBSTSTM32F10xR.LIB。3. IO口初始化void IO_cfg(GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2; /選擇引腳 2GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;/輸出頻率最大 50MHzGPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; /帶上拉電阻輸出GPIO_Init(GPIOE,&GPIO_InitStructur

14、e;GPIO_ResetBits(GPIOE,GPIO_Pin_2; /將 PE.2引腳設(shè)置為低電平輸出GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_5; /選擇引腳 2 3 5 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; /選擇輸入模式為浮空輸入GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; /輸出頻率最大 50MHzGPIO_Init(GPIOC,&GPIO_InitStructure

15、; /設(shè)置 PC.2/PC.3/PC.5GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_6; /選擇引腳 3 6GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; /輸出頻率最大 50MHzGPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; /帶上拉電阻輸出GPIO_Init(GPIOD,&GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5; /選擇引腳 5GPIO_Init

16、Structure.GPIO_Speed = GPIO_Speed_50MHz; /輸出頻率最大 50MHzGPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; /帶上拉電阻輸出GPIO_Init(GPIOB,&GPIO_InitStructure;其中連接外部中斷的引腳需要設(shè)置為輸入狀態(tài), 而連接 LED 的引腳需要設(shè)置為輸出狀態(tài), 初始化 PE.2是為了使得按鍵的另外一端輸出低電平。 GPIO 中的函數(shù)在 stm32f10x_gpio.c中。4. 把相應(yīng)的 IO 口設(shè)置為中斷線路由于 GPIO 并不是專用的中斷引腳,因此在用 GPIO 來

17、觸發(fā)外部中斷的時(shí)候需要設(shè)置將 GPIO 相應(yīng) 的引腳和中斷線連接起來,具體代碼如下:void EXTI_cfg(EXTI_InitTypeDef EXTI_InitStructure;EXTI_ClearITPendingBit(EXTI_Line2; /清空中斷標(biāo)志EXTI_ClearITPendingBit(EXTI_Line3;EXTI_ClearITPendingBit(EXTI_Line5;/選擇中斷管腳 PC.2 PC.3 PC.5GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource2;GPIO_EXTILineConfi

18、g(GPIO_PortSourceGPIOC, GPIO_PinSource3;GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource5;EXTI_InitStructure.EXTI_Line = EXTI_Line2 | EXTI_Line3 | EXTI_Line5;/選擇中斷線路 2 3 5EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; /設(shè)置為中斷請(qǐng)求,非事件請(qǐng)求 EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_

19、Falling;/設(shè)置中斷觸發(fā)方式為上下降沿觸發(fā)EXTI_InitStructure.EXTI_LineCmd=ENABLE; /外部中斷使能EXTI_Init(&EXTI_InitStructure;EXTI_cfg中需要調(diào)用到的函數(shù)都在 stm32f10x_exti.c。5. 寫中斷響應(yīng)函數(shù)STM32不像 C51單片機(jī)那樣,可以用過 interrupt 關(guān)鍵字來定義中斷響應(yīng)函數(shù), STM32的中斷響 應(yīng)函數(shù)接口存在中斷向量表中,是由啟動(dòng)代碼給出的。默認(rèn)的中斷響應(yīng)函數(shù)在 stm32f10x_it.c中。 因此我們需要把這個(gè)文件加入到工程中來。在這個(gè)文件中,我們發(fā)現(xiàn),很多函數(shù)都是只有一個(gè)函數(shù)名,并沒有函數(shù)體。我們找到EXTI2_IRQHandler(這個(gè)函數(shù), 這就是 EXTI2中斷響應(yīng)的函數(shù)。 我的目標(biāo)是將 LED 燈點(diǎn)亮, 所以函數(shù) 體其實(shí)很簡(jiǎn)單:void

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論