STM32入门 之 中断

首先弄清楚几个问题:

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);
	}
}


猜你喜欢

转载自blog.csdn.net/Bonny722/article/details/79210672