首先弄清楚几个问题:
1、什么是中断?
CPU在执行一个程序时,对系统发生的某个事件(程序自身或外界的原因)作出的一种反应:CPU暂停正在执行的程序,保留现场后自动转去处理相应的事件,处理完该事件后,到适当的时候返回断点,继续完成被打断的事情。
举个例子:当你在上班,然后你的老板来了(中断),叫你去处理某些事情(中断函数),你只好放下手中的事情去处理老板给的事情,处理完以后你继续回来工作(返回断点)。
2、中断系统有什么功能?
1、实现中断与返回
提醒进行中断,和返回之前做的事情。(提醒老板来找你处理事务,处理完事务 之后返回继续手中的工作)
2、实现优先级排队
进行优先级的配置,优先级高的优先执行。(如果你的老板和同事同时找你想让你处理事务,因为老板优先级更高,优先处理老板的事情后再去处理同事的事情)
3、高级中断源能中断低级的中断处理
高级的中断事件可以中断低级的中断事件(当你正在解决同事的事情的时候, 你的老板找你有事,所以先解决老板的事再回来解决同事的事)
3、杂项
1、优先级需要进行配置。 2、中断可以由内部给出,也可以外界提供。 3、中断有软件识别(主动询问老板或者同事是否需要中断)和向量中断(老板或者同事来了再询问是否需要中断)识别。
eg:以时钟的中断为例
上代码:
void Tim_Init(void)
{
TIM_TimeBaseInitTypeDef TIM;//定义时钟结构体用于初始化
NVIC_InitTypeDef NVIC_InitStructure;//定义用于初始化中断优先级
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置分组为2
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5,ENABLE);//打开时钟
TIM.TIM_Prescaler = 7199;//预分频
TIM.TIM_CounterMode = TIM_CounterMode_Up ;//计数器(装载值)模式,向上计数
TIM.TIM_Period = 9999;//定义时钟的装载值
TIM.TIM_ClockDivision = TIM_CKD_DIV1;//分频因子
TIM.TIM_RepetitionCounter = 0;//重复计数的值
TIM_TimeBaseInit(TIM5,&TIM);//调用库函数,初始化
NVIC_InitStructure.NVIC_IRQChannel = TIM5_IRQn;//选定配置TIM5的中断优先级
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//抢占优先级为0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;//响应优先级位0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//开启使能
NVIC_Init(&NVIC_InitStructure);
//清除标志
TIM_ClearFlag(TIM5, TIM_FLAG_Update);
// 开启计数器中断
TIM_ITConfig(TIM5,TIM_IT_Update,ENABLE);
// 使能计数器
TIM_Cmd(TIM5, ENABLE);
}
/*定时公式:
T= (TIM_Period+1)*(TIM_Prescaler+1)/TIMxCLK
其中TIMxCLK为脉冲频率,一般为72M*/
//基本定时器少TIM.TIM_CounterMode TIM.TIM_ClockDivision TIM.TIM_RepetitionCounter
void TIM5_IRQHandler(void)//中断函数
{
if(TIM_GetITStatus(TIM5,TIM_IT_Update) != RESET)
{
s++;
TIM_ClearITPendingBit(TIM5,TIM_FLAG_Update);
}
}