STM8具有最多32的中斷系統,在中斷的處理上類似於cortexm系列的芯片,首先是每個中斷的向量都是固化在系統內部的,用戶需要向相應的中斷向量flash位置寫入中斷處理函數,其二,每個中斷向量都具有可編程的優先級,共有兩位優先級,兩個BIT的優先級可以催化出4個優先級,具體如下
中斷控制器內部有一些寄存器專門用來存放相應的中斷的中斷優先級,同同時,在系統內部也有一個系統寄存器CC他的第三位和第五位分別表示當前正在處理的中斷的優先級
可以這樣認為,中斷發生的時候,系統寄存器在執行中斷向量跳轉的時候自動載入了相應的中斷優先級到系統寄存器CC中.
中斷的處理遵循先判斷軟件優先級后判斷硬件優先級的模式,當幾個中斷同時發生的時候,系統會根據其固化的硬件優先級進行相應,
另外,STM8支持中斷嵌套,因為軟件優先級就4級,最多也就軟件優先級三層嵌套
對STM8的中斷進行操作其實也簡單
1. 配置系統中斷的打開或關閉
2. 配置想要使用的中斷向量的軟件優先級
3. 打開相應的外設中斷源的中斷,就可以響應了
針對於外部中斷來說,首先,STM8的每一個引腳都能支持外部中斷,但是在中斷向量上,不是每一個引腳都有
獨立的中斷向量,而是每個端口共用一個中斷向量,在端口中斷向量處理函數中檢查到底是哪一個引腳出現了問題,
對於外部中斷的配置,如下
可以定義中斷的觸發模式,電平觸發,下降沿觸發等,這個寄存器存放了A B CD四個向量的中斷模式
該寄存器存放了E向量的中斷
另外,外部中斷中有一個特殊的中斷叫做TLI不可屏蔽中斷,也就是PD7,他不屬於D中斷向量而是擁有自己的TLI中斷向量
使用外部中斷的過程
1. 根據前面的描述配置中斷向量
2. 配置中斷端口的觸發模式
3. 對相應的GPIO口選擇中斷輸入模式
在使用中斷函數的時候需要注意,外部中斷的中斷函數我們並沒有一個寄存器告訴我們哪一個中斷向量的哪一個引腳發生了中斷
需要我們讀取端口的信息,假設是下降沿中斷觸發,那么中斷處理函數在運行的時候,該引腳應該是電平的,檢查哪一個引腳是低電平,我們就可以知道哪一個引腳發生了中斷
從而進行正確的處理
所以最好是一個端口只有一個引腳中斷,這樣易於判斷,省去了一些讀引腳的過程
具體操作請查看一下代碼
#include "exti.h" void ExtiInit(void) { //首先禁用中斷 disableInterrupts(); //配置IO口為輸入中斷模式 //D7初始化 GPIOD->DDR &= ~(1<<7);//設置為輸入 GPIOD->CR1 |= (1<<7); GPIOD->CR2 |= (1<<7);//中斷上拉輸入 //E3初始化 GPIOE->DDR &= ~(1<<3);//設置為輸入 GPIOE->CR1 |= (1<<3); GPIOE->CR2 |= (1<<3);//中斷上拉輸入 //設定中斷優先級,TLI是最高的不可屏蔽中斷優先級,所以不需要設置軟件優先級,只 //需要設置E3也就是端口E的優先級即可,中斷向量號為7 對應寄存器ITC_SPR2 ITC->ISPR2 &= (3<<6);//清楚中斷優先級 ITC->ISPR2 |= (1<<6);//中斷優先級01 //設置中斷觸發模式 EXTI->CR2 &= ~(1<<2);//TLI下降沿觸發 EXTI->CR2 &= ~(3<<0);//清除PORTE EXTI->CR2 |= (2<<0);//Porte僅僅下降沿觸發 enableInterrupts();//打開中斷 } //TLI中斷處理函數 INTERRUPT_HANDLER(TLI_IRQHandler, 0) { keyValue = KEY_VALUE1; } //PORT E中斷處理函數 INTERRUPT_HANDLER(EXTI_PORTE_IRQHandler, 7) { //保險起見,這里進行一次電平 if((GPIOE->IDR&0X08) == 0)//檢測是不是低電平 { keyValue = KEY_VALUE2; } }
#ifndef __EXTI_H_ #define __EXTI_H_ #include "stm8s.h" #include "key.h" //我們是用兩個按鍵作為中斷觸發,其中,D7是TLI中斷,E3是portE中斷 void ExtiInit(void); #endif