新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > STM8的中斷系統以及外部中斷詳解

        STM8的中斷系統以及外部中斷詳解

        作者: 時間:2016-11-19 來源:網絡 收藏
        STM8具有最多32的中斷系統,在中斷的處理上類似于cortexm系列的芯片,首先是每個中斷的向量都是固化在系統內部的,用戶需要向相應的中斷向量flash位置寫入中斷處理函數,其二,每個中斷向量都具有可編程的優先級,共有兩位優先級,兩個BIT的優先級可以催化出4個優先級,具體如下


        本文引用地址:http://www.104case.com/article/201611/318393.htm

        中斷控制器內部有一些寄存器專門用來存放相應的中斷的中斷優先級,同同時,在系統內部也有一個系統寄存器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


        評論


        技術專區

        關閉
        主站蜘蛛池模板: 哈尔滨市| 嘉兴市| 宣恩县| 祁门县| 土默特左旗| 三门县| 嘉义县| 平度市| 莎车县| 鹤壁市| 龙陵县| 乌兰察布市| 洛扎县| 乌苏市| 延安市| 黎平县| 昌黎县| 绿春县| 重庆市| 大关县| 万载县| 庆安县| 锡林浩特市| 石柱| 隆回县| 庆元县| 汉中市| 秭归县| 平定县| 瓮安县| 广灵县| 安远县| 明星| 岱山县| 雷波县| 三穗县| 江源县| 大洼县| 金门县| 舒城县| 湘潭县|