定時中斷基本結構

Name_Y發表於2024-10-19

image

開啟時鐘-->配置 時鐘源-->配置 時基單元-->配置 中斷輸出-->配置 NVIC-->啟動 定時器

程式

void Timer_Init(void)
{
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
	
	/*配置時鐘*/
	TIM_InternalClockConfig(TIM2);
	
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
	TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;
	TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1;
	
	//CK_CNT_OV=CK_PSC/(PSC+1)/(ARR+1)
	TIM_TimeBaseInitStruct.TIM_Period=7200*5-1;//2000 Hz
	TIM_TimeBaseInitStruct.TIM_Prescaler=2000*3-1;
	TIM_TimeBaseInitStruct.TIM_RepetitionCounter=0;
	
	TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStruct);
	//為更新預分頻器和重複計數器的值,該函式會直接進入一次中斷
	TIM_ClearFlag(TIM2,TIM_FLAG_Update);//清除標誌位
	
	TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
	//使能中斷,當計數達到設定值時,觸發中斷處理程式。
	
	/*配置中斷*/
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	NVIC_InitTypeDef NVIC_InitStructure;
	NVIC_InitStructure.NVIC_IRQChannel=TIM2_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority=2;
	NVIC_Init(&NVIC_InitStructure);
	
	TIM_Cmd(TIM2,ENABLE);//啟動定時器,定時器開始計數。
}

void TIM2_IRQHandler(void)
{
	if(TIM_GetITStatus(TIM2,TIM_IT_Update)==SET)
	{
		/*中斷程式碼*/
		TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
	}
}

要點/問題


定時頻率的設定

TIM_TimeBaseInitStruct.TIM_Prescaler//預分頻值PSC
TIM_TimeBaseInitStruct.TIM_Period//重灌載值ARR

公式:CK_CNT_OV=CK_PSC/(PSC+1)/(ARR+1)

  • CK_CNT_OV:定時器的溢位頻率或計數週期的頻率,單位為 Hz。
  • CK_PSC:輸入時脈頻率(例如,72 MHz(72 000 000 Hz))。
  • PSC:預分頻器的值,分頻係數為 PSC + 1
  • ARR:自動重灌載值,定時器計數到 ARR + 1 次時觸發溢位或更新事件。

解釋 TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE)

  1. 作用
  • 當定時器 TIM2 發生更新事件(例如計數器從 ARR 計數回到 0,即溢位)時,觸發中斷。
  • 使用 ENABLE 引數,啟用這個更新中斷,使定時器溢位時產生中斷請求。
  • 在定時器中斷服務函式(TIM2_IRQHandler)中可以處理這個中斷。
  1. TIM_IT_Update:表示選擇的中斷型別是更新中斷(也就是定時器溢位時的中斷)。

定時器在初始化時會直接執行中斷函式

  • 原因
    TIM_TimeBaseInit 定義中的一條
    /* Generate an update event to reload the Prescaler and the Repetition counter values immediately */
    // 生成更新事件 以立即重新載入 預分頻器和重複計數器 的值
    TIMx->EGR = TIM_PSCReloadMode_Immediate;  
    
    及 為更新預分頻器和重複計數器的值,該函式會直接進入一次中斷
  • 解決
    TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStruct);
    TIM_ClearFlag(TIM2,TIM_FLAG_Update);//清除標誌位
    

TIM_ClearFlag 和 TIM_ClearITPendingBit 的區別

  • TIM_ClearFlag(TIM2, TIM_FLAG_Update):用於清除定時器的更新事件標誌位,更新事件可能是由定時器溢位、更新觸發等原因引起的。這個標誌位可以用於查詢更新事件的發生,而不依賴中斷。
  • TIM_ClearITPendingBit(TIM2, TIM_IT_Update):用於清除定時器的中斷掛起標誌位。當中斷使能時,更新事件發生後定時器會觸發中斷,並且中斷掛起標誌位會被置位。呼叫該函式可以清除該中斷掛起標誌位。

相關文章