STM8的中斷優先級
STM8S的中斷由中斷控制器(ITC)控制。STM8所有IO都支持中斷,分為PA~PE 5個組,每組IO對應一個中斷服務函數(也就是每組IO只有一個向量)。
STM8沒有專門的中斷狀態寄存器,所以只能通過剛進入中斷就讀取IDR來判斷,不過在某些情況下,此種方法就不好用了,所以在設計的時候就要考慮清楚,是不是會沖突。最好把有沖突的中斷放到不同的組。STM8的外部中斷采用軟件優先級+硬件優先級的控制方法,來控制優先級分組。軟件優先級優先于硬件優先級。
硬件優先級由向量號確定,向量號越小,優先級越高。STM8軟件優先級設置可以分為4個等級(0~3),實際上可設置的就三個等級:1~3優先級順序:0《1《2《3,3的優先級最高,高優先級的中斷可以打斷低優先級的中斷
多個中斷同時發生:在軟件優先級相同的情況下,由硬件優先級決定誰先響應。但是硬件優先級不可打斷。也就是相同軟件優先級的中斷,硬件優先級低的中斷在執行了。此時來一個硬件優先級高的中斷是不可以打斷低優先級的中斷的。
STM8還有個TLI外部中斷,這個優先級可以打斷軟件優先級為3的中斷,TLI的優先級不可設置。(基本就是最高級別了,除了RESET)
STM8S單片機的中斷優先級設置
STM8S的中斷由中斷控制器(ITC)控制。STM8所有IO都支持中斷,分為PA~PE 5個組,每組IO對應一個中斷服務函數(也就是每組IO只有一個向量)。STM8沒有專門的中斷狀態寄存器,所以只能通過剛進入中斷就讀取IDR來判斷,不過在某些情況下,此種方法就不好用了,所以在設計的時候就要考慮清楚,是不是會沖突。最好把有沖突的中斷放到不同的組。
STM8的外部中斷采用軟件優先級+硬件優先級的控制方法,來控制優先級分組。軟件優先級優先于硬件優先級。硬件優先級由向量號確定,向量號越小,優先級越高如下面圖中斷映射,中斷向量表。
STM8軟件優先級設置可以分為4個等級(0~3),實際上可設置的就三個等級:1~3。優先級順序:0《1《2《3,3的優先級最高,高優先級的中斷可以打斷低優先級的中斷
多個中斷同時發生:在軟件優先級相同的情況下,由硬件優先級決定誰先響應。但是硬件優先級不可打斷。也就是相同軟件優先級的中斷,硬件優先級低的中斷在執行了。。。此時來一個硬件優先級高的中斷是不可以打斷低優先級的中斷的。STM8還有個TLI外部中斷,這個優先級可以打斷軟件優先級為3的中斷,TLI的優先級不可設置。(基本就是最高級別了,除了RESET)。
stm8s中斷優先級程序
//軟件中斷優先級設置函數
//vector:中斷向量號(0~24)
//prio:優先級(1~3),禁止設置為0
//STM8的優先級分為軟件優先級和硬件優先級,軟件優先級優先于硬件優先級。
//硬件優先級由向量號確定,向量號越小,優先級越高。
//軟件優先級可以通過本函數設置。
//STM8軟件優先級設置可以分為4個等級(0~3),實際上可設置的就三個等級:1~3
//優先級順序:0《1《2《3,3的優先級最高,高優先級的中斷可以打斷低優先級的中斷
//多個中斷同時發生:在軟件優先級相同的情況下,由硬件優先級決定誰先響應。
void ITC_Set(u8 vector,u8 priority)
{
if(priority==0)return; //不能設置為優先級0
if(priority==2)priority=0; //優先級2:00B
if(vector《4)
{
ITC-》ISPR1&=~(3《《vector*2); //清除原來的設置
ITC-》ISPR1|=priority《《vector*2; //設置優先級
}else if(vector《8)
{
ITC-》ISPR2&=~(3《《(vector-4)*2); //清除原來的設置
ITC-》ISPR2|=priority《《(vector-4)*2; //設置優先級
}else if(vector《12)
{
ITC-》ISPR3&=~(3《《(vector-8)*2); //清除原來的設置
ITC-》ISPR3|=priority《《(vector-8)*2; //設置優先級
}else if(vector《16)
{
ITC-》ISPR4&=~(3《《(vector-12)*2); //清除原來的設置
ITC-》ISPR4|=priority《《(vector-12)*2;//設置優先級
}else if(vector《20)
{
ITC-》ISPR5&=~(3《《(vector-16)*2); //清除原來的設置
ITC-》ISPR5|=priority《《(vector-16)*2;//設置優先級
}else if(vector《24)
{
ITC-》ISPR6&=~(3《《(vector-20)*2); //清除原來的設置
ITC-》ISPR6|=priority《《(vector-20)*2;//設置優先級
}else if(vector《28)
{
ITC-》ISPR7&=~(3《《(vector-24)*2); //清除原來的設置
ITC-》ISPR7|=priority《《(vector-24)*2;//設置優先級
}else if(vector《32)
{
ITC-》ISPR8&=~(3《《(vector-28)*2); //清除原來的設置
ITC-》ISPR8|=priority《《(vector-28)*2;//設置優先級
}
}
//外部中斷配置函數
//GPIO:0~5(對應GPIO_A~GPIO_E和TLI)
//TRIM:0~3(即00B~11B)
//00,下降沿和低電平觸發
//01,僅上升沿觸發
//10,僅下降沿觸發
//11,上升沿和下降沿觸發
void EXTI_Config(u8 GPIOx,u8 TRIM)
{
TRIM&=0X03; //取低2位有效
if(GPIOx《4) //GPIOA~D
{
EXTI-》CR1&=~(3《《GPIOx*2);
//清除原來的設置
EXTI-》CR1|=TRIM《《GPIOx*2;
//設置觸發方式
}else if(GPIOx==GPIO_E)
//GPIOE
{
EXTI-》CR2&=~(3《《0);
//清除原來的設置
EXTI-》CR2|=TRIM;
//設置觸發方式
}else if(GPIOx==GPIO_TLI)
//TLI觸發方式設置
{
TRIM&=0X01;
//僅最低位有效。
EXTI-》CR2&=~(1《《2);
//清除原來的設置
EXTI-》CR2|=TRIM《《2;
//設置TLI觸發方式
}
}
評論
查看更多