事件和中断
事件和中断是两个不同的东西,只是相互之间有联系,我在学习的过程中总是不能很好的理解这两个概念。
关于事件和中断的区别参考下面这三个链接:
《中段与事件的区别》
《概念问题:中断与事件有什么联系与区别?》
《[转]STM32之中断与事件—中断与事件的区别》
简单概括下。
中断:CPU单线程情况下只能处理单一任务,在有零时任务需要处理时,可以暂时放下当前任务,优先处理零时任务,再回过来处理之前的任务。多个中断可以进行嵌套,比如产生了多个零时任务,那么就可以按照优先级处理这多个零时任务,再回过来处理当前任务。
事件:字面意思,就是发生的事情,发生的事件会产生相应的信号给不同的服务,信号给中断服务就产生中断,给DMA就使用DMA通道,就是说事件可以去触发不同的任务。灵活的使用事件可以提高效率。
中断向量控制器NVIC
NVIC全程Nested vectoredinterrupt controller,用于控制中断的优先级。具体如下,
优先级分组是用于分配抢占优先级和子优先级的个数,根据自己的需要选择合适的优先级分组。
中断的优先级规则是:先比抢占优先级,抢占优先级相同再比子优先级,如果抢占优先级和子优先级都相同。抢占优先级顾名思义,可以抢占优先运行,它可以打断低优先级的中断,优先执行自己,所以可以嵌套。而响应优先级不能嵌套,他不能打断已经执行的中断,只能在多个抢占优先级相同情况下,排出顺序,等待当前中断函数运行结束后才能执行。
模板
使用中断的三步骤:
1.配置中断向量(配置中断优先级)
2.配置中断
3.编写中断函数
//建议所有中断的优先级配置只写成一个函数,因为这能更好地理清不同中断之间的优先关系
void NVIC_Config()
{
NC_Init.NVIC_IRQChannel=TIM3_IRQn;
NC_Init.NVIC_IRQChannelCmd=ENABLE;
NC_Init.NVIC_IRQChannelPreemptionPriority=0;//抢占优先级
NC_Init.NVIC_IRQChannelSubPriority=0;//子优先级,即响应优先级
NVIC_Init(&NC_Init);
}
void timer3_init()
{
TIM_TimeBaseInitTypeDef timer3;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
//定时器配置
timer3.TIM_ClockDivision=TIM_CKD_DIV1;//时钟分割
timer3.TIM_CounterMode=TIM_CounterMode_Up;//向上计数模式
timer3.TIM_Period=72*300-1;//预装载值
timer3.TIM_Prescaler=1000-1;//分频
TIM_TimeBaseInit(TIM3,&timer3);
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);
TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
TIM_Cmd(TIM3,ENABLE);
}
void TIM3_IRQHandler(void)
{
if(TIM_GetITStatus(TIM3,TIM_IT_Update)==SET)