該文章是學(xué)習(xí)了STM32后所寫(xiě),是對(duì)STM32的小小的理解。在文中若有錯(cuò)誤指出請(qǐng)指正,不勝感激。
STM32有最多68個(gè)可屏蔽的中斷通道,有16個(gè)可編程的優(yōu)先級(jí)。對(duì)于STM32F103ZE芯片,其內(nèi)部包含了19個(gè)邊沿檢測(cè)器用來(lái)產(chǎn)生中斷或者事件請(qǐng)求。對(duì)于外部中斷只用了16個(gè)外部觸發(fā)輸入線。每一個(gè)外部輸入線都能夠被獨(dú)立的屏蔽,pendingregister的寄存器能夠保存輸入線的狀態(tài),這個(gè)寄存器不能通過(guò)硬件自動(dòng)清零,必須使用軟件來(lái)清零;
外部中斷的內(nèi)部連接圖如下:
觸發(fā)信號(hào)通過(guò)輸入線進(jìn)入檢測(cè)器,檢測(cè)器的功能是可以設(shè)置的,就是通過(guò)上邊兩個(gè)邊沿檢測(cè)器即上升沿出發(fā)選擇寄存器和下降沿出發(fā)選擇寄存器。從圖中就可以看出外部中斷/事件觸發(fā)方式有三種即上升沿觸發(fā)、下降沿觸發(fā)、上升沿和下降沿觸發(fā)。在上升沿觸發(fā)選擇寄存器和下降沿觸發(fā)選擇寄存器中只有低20位有效,每一位各對(duì)應(yīng)一個(gè)輸入線。
在內(nèi)部原理圖當(dāng)中我們看到有一個(gè)兩輸入或門(mén)電路,輸入信號(hào)可以來(lái)自邊沿檢測(cè)器輸出,也可以來(lái)自軟件中斷/事件寄存器。所以對(duì)于STM32要產(chǎn)生中斷或者是事件有可能來(lái)自軟件中斷/事件觸發(fā)寄存器或者外部輸入信號(hào)線。通過(guò)改變軟件中斷/事件觸發(fā)寄存器的值也是可以向內(nèi)核請(qǐng)求中斷或者事件,但是使用向軟件中斷/事件觸發(fā)寄存器寫(xiě)1產(chǎn)生中斷的前提是Pengingrequest寄存器中的相應(yīng)的位必須是0(向Pengingrequest寄存器寫(xiě)1來(lái)清零相應(yīng)的位)。
在Plusegenerator的右面也有一個(gè)與門(mén)電路,與門(mén)電路的輸出是用來(lái)產(chǎn)生事件的。通過(guò)內(nèi)部圖可以看出若用產(chǎn)生事件必須使與門(mén)的兩個(gè)輸入線為真,即事件屏蔽寄存器的相應(yīng)位使能和用軟件或者是硬件請(qǐng)求。所以呀,中斷或者事件的產(chǎn)生與否與會(huì)相互的影響,對(duì)于同一個(gè)輸入通道可以設(shè)置為同時(shí)產(chǎn)生中斷或者事件。對(duì)于控制中斷或者事件是否使能的寄存器分別是中斷屏蔽寄存器和事件屏蔽寄存器。
設(shè)置了上面的寄存器對(duì)于產(chǎn)生中斷還是不夠的,你還需要開(kāi)啟引腳第二功能時(shí)鐘,對(duì)于AFIO時(shí)鐘如何開(kāi)啟請(qǐng)參考STM32手冊(cè)RCC部分。設(shè)置需要產(chǎn)生中斷的引腳為輸入模式(可以為上拉輸入,下拉輸入,懸浮輸入等?。?。每一個(gè)中斷輸入線可以對(duì)應(yīng)幾個(gè)引腳,例如PA0、PB0......PG0都能夠產(chǎn)生外部中0,但是每次只能由一個(gè)來(lái)產(chǎn)生中斷,那么要讓哪一個(gè)引腳連接到中斷輸入線上則通過(guò)外部中斷配置寄存器了。外部配置寄存器有4個(gè),每個(gè)寄存器對(duì)應(yīng)可以配置4個(gè)輸入線通道,正好16個(gè)。AFIO_EXTICR1的寄存器位圖如下:
每一個(gè)通道對(duì)應(yīng)4位,可以對(duì)應(yīng)于GPIO的端口。
在程序中使用中斷,不免會(huì)有中斷優(yōu)先級(jí),STM32將中斷優(yōu)先級(jí)分為兩組,即搶占優(yōu)先級(jí)和響應(yīng)優(yōu)先級(jí)。具體的如何分參考有關(guān)手冊(cè),
外不中斷的編寫(xiě)步驟:
l確定搶占優(yōu)先級(jí)和響應(yīng)優(yōu)先級(jí)如何分組,對(duì)于整個(gè)芯片的只能使用其中的一組
l設(shè)置引腳為輸入模式,最好為懸浮輸入模式。
l將某一個(gè)端口映射到觸發(fā)輸入線
l設(shè)置該外部中斷通道的觸發(fā)模式
l使能中斷,設(shè)置改中斷的優(yōu)先級(jí)
l打開(kāi)引腳第二功能時(shí)鐘
備注:對(duì)于相應(yīng)的端口時(shí)鐘不需要打開(kāi)