中断服务例程(interrupt service routine,ISR)中断一般是由硬件(例如外设、外部引脚)产生,内核中断(systick、异常管理和休眠模式等),其中断优先级由SCB寄存器来管理,IRQ的中断优先级由NVIC来管理。
中断事件会导致中断,但由于各种原因,中断无法立即执行的话,会被挂起,Pendingbit。如果中断被响应,则硬件自动清除Pendingbit。在中断中尽量使用PPP_ClearITPendingBit();非中断使用PPP_ClearFlag().
内核中断不用NVIC_IRQChannel,因为SysTick_IRQn是-1(在stm32f10x.h可查),属于异常中断,外部中断(如定时器中断)属于正常中断
使用systick中断示例
void Systick_Init()
{
SysTick->LOAD = 9000;
NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); //SCB->SHP[11] = ((u8)15<<4);
SysTick->VAL = 0;
SysTick->CTRL &=~ ((u32)0x01<<2); //SysTick_CTRL_CLKSOURCE_Pos
SysTick->CTRL |= ((u32)0x01<<1); //SysTick_CTRL_TICKINT_Pos
SysTick->CTRL |= ((u32)0x01<<0); //SysTick_CTRL_ENABLE_Msk
}
上面的程序对8M晶振来说,可实现1ms中断一次。
在单片机中,delay()
相当于空跑,会停止其他的正在进行的任务。可以使用systick进行中断,在中断里设置变量++,这样可以实现达到一段时间后执行所需要的任务的目的。