STM8的中斷系統以及外部中斷詳解
中斷控制器內部有一些寄存器專門用來存放相應的中斷的中斷優先級,同同時,在系統內部也有一個系統寄存器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_SPR2ITC->ISPR2 &= (3<<6);//清楚中斷優先級ITC->ISPR2 = (1<<6);//中斷優先級01//設置中斷觸發模式EXTI->CR2 &= ~(1<<2);//TLI下降沿觸發EXTI->CR2 &= ~(3<<0);//清除PORTEEXTI->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"http://我們是用兩個按鍵作為中斷觸發,其中,D7是TLI中斷,E3是portE中斷void ExtiInit(void);#endif
評論