//软件中断优先级设置函数
//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< //清除原来的设置
ITC->ISPR1|=priority< //设置优先级
}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< //清除原来的设置
EXTI->CR1|=TRIM< //设置触发方式
}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触发方式
}
}