1. 程式人生 > >STM32入門 之 中斷

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