软件中断作用
可以把比较重要或者紧急的代码放在软件中断服务函数里面,不需要等待外部硬件是否出现异常事件,直接通过软件产生中断。保护比较重要的代码不被打断
软件中断不需要打开时钟的原因是不需要I/O口对应的配置中断线
代码流程:
- 打开中断屏蔽器
- 配置优先级
- 中断服务函数
- 软件中断寄存器触发软件中断
//中断屏蔽器
EXTI->IMR|=(1<<1);
打开中断屏蔽器
//无沿检测器
EXTI->FTSR&=~(1<<1);//无下降沿
EXTI->RTSR&=~(1<<1);//无上升沿
NVIC_SetPriority(EXTI1_IRQn,9);//优先级 占先=2 次级=1
NVIC_EnableIRQ(EXTI1_IRQn);//使能
配置优先级
//中断服务函数(不用声明)
void EXTI1_IRQHandler (void)
{
if(EXTI->PR&(1<<1))//判断是否触发中断请求(标志位)
{
EXTI->PR|=(1<<1);//清除标志位
Liu_Led();
}
}
中断服务函数
EXTI->SWIER|=(1<<1);软件中断事件寄存器 (触发条件)
软件中断寄存器触发软件中断
写在哪个位置就从哪里触发软件中断
完整代码
/*
Function name:Soft_Exti_Config
Description:软件中断初始化
param:None
retval:None
Remarks:
PE1
*/
void Soft_Exti_Config(void)
{
//中断屏蔽器
EXTI->IMR|=(1<<1);
//无沿检测器
EXTI->FTSR&=~(1<<1);//无下降沿
EXTI->RTSR&=~(1<<1);//无上升沿
//配置优先级
NVIC_SetPriority(EXTI1_IRQn,9);//优先级 占先=2 次级=1
NVIC_EnableIRQ(EXTI1_IRQn);//使能
}
//中断服务函数(不用声明)
void EXTI1_IRQHandler (void)
{
if(EXTI->PR&(1<<1))//判断是否触发中断请求(标志位)
{
EXTI->PR|=(1<<1);//清除标志位
Liu_Led();
}
}