STM8的中斷系統(tǒng)以及外部中斷詳解
中斷控制器內(nèi)部有一些寄存器專(zhuān)門(mén)用來(lái)存放相應(yīng)的中斷的中斷優(yōu)先級(jí),同同時(shí),在系統(tǒng)內(nèi)部也有一個(gè)系統(tǒng)寄存器CC他的第三位和第五位分別表示當(dāng)前正在處理的中斷的優(yōu)先級(jí)
可以這樣認(rèn)為,中斷發(fā)生的時(shí)候,系統(tǒng)寄存器在執(zhí)行中斷向量跳轉(zhuǎn)的時(shí)候自動(dòng)載入了相應(yīng)的中斷優(yōu)先級(jí)到系統(tǒng)寄存器CC中.
中斷的處理遵循先判斷軟件優(yōu)先級(jí)后判斷硬件優(yōu)先級(jí)的模式,當(dāng)幾個(gè)中斷同時(shí)發(fā)生的時(shí)候,系統(tǒng)會(huì)根據(jù)其固化的硬件優(yōu)先級(jí)進(jìn)行相應(yīng),
另外,STM8支持中斷嵌套,因?yàn)檐浖?yōu)先級(jí)就4級(jí),最多也就軟件優(yōu)先級(jí)三層嵌套
對(duì)STM8的中斷進(jìn)行操作其實(shí)也簡(jiǎn)單
1.配置系統(tǒng)中斷的打開(kāi)或關(guān)閉
2.配置想要使用的中斷向量的軟件優(yōu)先級(jí)
3.打開(kāi)相應(yīng)的外設(shè)中斷源的中斷,就可以響應(yīng)了
針對(duì)于外部中斷來(lái)說(shuō),首先,STM8的每一個(gè)引腳都能支持外部中斷,但是在中斷向量上,不是每一個(gè)引腳都有
獨(dú)立的中斷向量,而是每個(gè)端口共用一個(gè)中斷向量,在端口中斷向量處理函數(shù)中檢查到底是哪一個(gè)引腳出現(xiàn)了問(wèn)題,
對(duì)于外部中斷的配置,如下
可以定義中斷的觸發(fā)模式,電平觸發(fā),下降沿觸發(fā)等,這個(gè)寄存器存放了A B CD四個(gè)向量的中斷模式
該寄存器存放了E向量的中斷
另外,外部中斷中有一個(gè)特殊的中斷叫做TLI不可屏蔽中斷,也就是PD7,他不屬于D中斷向量而是擁有自己的TLI中斷向量
使用外部中斷的過(guò)程
1.根據(jù)前面的描述配置中斷向量
2.配置中斷端口的觸發(fā)模式
3.對(duì)相應(yīng)的GPIO口選擇中斷輸入模式
在使用中斷函數(shù)的時(shí)候需要注意,外部中斷的中斷函數(shù)我們并沒(méi)有一個(gè)寄存器告訴我們哪一個(gè)中斷向量的哪一個(gè)引腳發(fā)生了中斷
需要我們讀取端口的信息,假設(shè)是下降沿中斷觸發(fā),那么中斷處理函數(shù)在運(yùn)行的時(shí)候,該引腳應(yīng)該是電平的,檢查哪一個(gè)引腳是低電平,我們就可以知道哪一個(gè)引腳發(fā)生了中斷
從而進(jìn)行正確的處理
所以最好是一個(gè)端口只有一個(gè)引腳中斷,這樣易于判斷,省去了一些讀引腳的過(guò)程
具體操作請(qǐng)查看一下代碼
#include "exti.h"void ExtiInit(void){//首先禁用中斷disableInterrupts();//配置IO口為輸入中斷模式//D7初始化GPIOD->DDR &= ~(1<<7);//設(shè)置為輸入GPIOD->CR1 = (1<<7);GPIOD->CR2 = (1<<7);//中斷上拉輸入//E3初始化GPIOE->DDR &= ~(1<<3);//設(shè)置為輸入GPIOE->CR1 = (1<<3);GPIOE->CR2 = (1<<3);//中斷上拉輸入//設(shè)定中斷優(yōu)先級(jí),TLI是最高的不可屏蔽中斷優(yōu)先級(jí),所以不需要設(shè)置軟件優(yōu)先級(jí),只//需要設(shè)置E3也就是端口E的優(yōu)先級(jí)即可,中斷向量號(hào)為7 對(duì)應(yīng)寄存器ITC_SPR2ITC->ISPR2 &= (3<<6);//清楚中斷優(yōu)先級(jí)ITC->ISPR2 = (1<<6);//中斷優(yōu)先級(jí)01//設(shè)置中斷觸發(fā)模式EXTI->CR2 &= ~(1<<2);//TLI下降沿觸發(fā)EXTI->CR2 &= ~(3<<0);//清除PORTEEXTI->CR2 = (2<<0);//Porte僅僅下降沿觸發(fā)enableInterrupts();//打開(kāi)中斷}//TLI中斷處理函數(shù)INTERRUPT_HANDLER(TLI_IRQHandler, 0){keyValue = KEY_VALUE1;}//PORT E中斷處理函數(shù)INTERRUPT_HANDLER(EXTI_PORTE_IRQHandler, 7){//保險(xiǎn)起見(jiàn),這里進(jìn)行一次電平if((GPIOE->IDR&0X08) == 0)//檢測(cè)是不是低電平{keyValue = KEY_VALUE2;}}
#ifndef __EXTI_H_#define __EXTI_H_#include "stm8s.h"#include "key.h"http://我們是用兩個(gè)按鍵作為中斷觸發(fā),其中,D7是TLI中斷,E3是portE中斷void ExtiInit(void);#endif
評(píng)論