STM32裸機(jī)開發(fā)—外部中斷
這一步需要設(shè)置你要作為外部中斷輸入的IO口的狀態(tài),可以設(shè)置為上拉/下拉輸入,也可以設(shè)置為浮空輸入,但浮空的時(shí)候外部硬件一定要上拉或下拉。否則可能導(dǎo)致中斷不停地被觸發(fā)。在干擾較大的地方,就算使用了上拉/下拉,也建議在外部硬件上設(shè)置上拉/下拉,這樣可以在一定程度上防止外部干擾帶來的影響。
*PORTA_CRL=0x44444844;//設(shè)置PA2口為上拉/下拉輸入模式
由于還需要驅(qū)動(dòng)液晶屏所以同時(shí)打開了PORTB和PORTC的時(shí)鐘。
b. 開啟IO口復(fù)用時(shí)鐘,設(shè)置IO口與中斷線的映射關(guān)系
STM32的IO口與中斷線的對應(yīng)關(guān)系需要配置外部中斷配置寄存器EXTICR,這樣我們要先開啟復(fù)用時(shí)鐘,然后配置IO口與中斷線的對應(yīng)關(guān)系。才能把外部中斷與中斷線連接起來。從圖中看到一共有19條中斷線(EXTIx),幾號端口就是幾號中斷線。這里PA2顯然就是EXTI2線。
*AFIO_EXTICR1=0x00000000;//打開PA2口的復(fù)用設(shè)置
c. 開啟與該IO口相對的線上中斷事件,設(shè)置觸發(fā)條件
這一步,我們要配置中斷產(chǎn)生的條件,STM32可以配置成上升沿觸發(fā),下降沿觸發(fā),或者任意電平變化觸發(fā),但是不能配置成高電平和低電平觸發(fā)。這里要根據(jù)自己的實(shí)際情況來配置。同時(shí)要開啟中斷線上的中斷,這里需要注意的是,如果使用外部中斷,并設(shè)置該中斷的EMR位的話,會(huì)引起軟件仿真上不能轉(zhuǎn)到中斷,而硬件上是可以的。而不設(shè)置EMR,軟件仿真就可以進(jìn)入中斷服務(wù)函數(shù),并且硬件上也是可以的。建議不要配置EMR位。從圖中可以看到,要進(jìn)入NVIC interrupt controller必須要設(shè)置中斷屏蔽寄存器。掛起請求寄存器從目前的理解來看應(yīng)該是在硬件中斷的時(shí)候接到中斷事件就自動(dòng)置1,中斷被處理了就置0,可以通過寫該寄存器來實(shí)現(xiàn)軟中斷,故在這里沒有進(jìn)行設(shè)置。
*EXTI_FTSR=0x00000004;//設(shè)置為下降沿觸發(fā)
d. 配置中斷分組(NVIC),并使能中斷
這一步,我們就是配置中斷的分組,以及使能,對于STM32來說,只有配置了NVIC的設(shè)置,并開啟才能被執(zhí)行,否則是不會(huì)執(zhí)行到中斷服務(wù)函數(shù)里面去的。對于裸機(jī)開發(fā)來說,ST半導(dǎo)體的STM32參考手冊中沒有標(biāo)明NVIC寄存器的地址,如下圖,直接標(biāo)成了reserved。事實(shí)上NVIC寄存器已經(jīng)是CM3的私房外設(shè)了。通過看論壇上的討論知道了在ARM發(fā)布的Cortex-M3 Technical Reference Manual (r2p0)中能找到。NVIC寄存器組主要有Interrupt Set-Enable Registers, Interrupt Clear-Enable Registers, Interrupt Set-Pending Register, Interrupt Clear-Pending Register, Active Bit Register, Interrupt Priority Registers。這里重點(diǎn)要關(guān)心的是Interrupt Set-Enable Registers,因?yàn)樗怯脕碓O(shè)置中斷通道使能的,不設(shè)置的話中斷服務(wù)函數(shù)不會(huì)響應(yīng)。它的地址是0xE000E100。EXTI2的中斷向量號為8(查詢中斷向量表),所以代碼如下:
*NVIC_ISER=0x00000100;//打開EXTI線2中斷
e. 寫中斷服務(wù)函數(shù)
舉個(gè)例子:
void EXTI2_IRQHandler(void)
{
}
中斷服務(wù)函數(shù)的格式大概就是 void XXXX(中斷名稱)_IRQHandler()。中斷名稱直接查手冊上的中斷向量表。
評論