Tim定時器初始化的方法

Abraverman發表於2024-07-02
#include "stm32f10x.h"                  // Device header


void TimerInit(void)
{
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
	
	TIM_InternalClockConfig(TIM2);
	
	/**********
	初始化配置時基單元
	TIM_Period        TIM_Prescaler     描述
	10000 - 1           7200 - 1;		這樣就變成了1S執行一次
	1000 - 1           7200 - 1;		這樣就變成了100ms執行一次
	10000 - 1           720 - 1;		這樣就變成了100ms執行一次
	********/
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitTypeStructrue;
	TIM_TimeBaseInitTypeStructrue.TIM_ClockDivision = TIM_CKD_DIV1; // 是否分頻
	TIM_TimeBaseInitTypeStructrue.TIM_CounterMode = TIM_CounterMode_Up; // 中心對齊模式1
	TIM_TimeBaseInitTypeStructrue.TIM_Period = 10000 - 1;  // 更新週期值
	TIM_TimeBaseInitTypeStructrue.TIM_Prescaler = 7200 - 1; // 預分頻器值
	TIM_TimeBaseInitTypeStructrue.TIM_RepetitionCounter = 0;
	
	TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitTypeStructrue);
	
	// 使能中斷  更新中斷到NVIC的路
	TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
	
	
	// NVIC優先順序分組
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
	
	// 初始化NVIC
	NVIC_InitTypeDef NVIC_InitStructrue;
	NVIC_InitStructrue.NVIC_IRQChannel=TIM2_IRQn;
	NVIC_InitStructrue.NVIC_IRQChannelCmd=ENABLE;
	NVIC_InitStructrue.NVIC_IRQChannelPreemptionPriority=2;  // 配置搶斷優先順序
	NVIC_InitStructrue.NVIC_IRQChannelSubPriority=1; // 配置響應優先順序
	NVIC_Init(&NVIC_InitStructrue);
	
	// 啟動定時器
	TIM_Cmd(TIM2, ENABLE);
	
}


// 定時器2的中斷函式
void TIM2_IRQHandler(void)
{
	// 檢查一下中斷是否真的觸發了
	// 如果中斷2的更新中斷變成set了,就可以執行中斷函式了
	if(TIM_GetITStatus(TIM2, TIM_IT_Update) == SET)
	{
		// 可以在這裡執行中斷事件
		
		
		// 清除中斷標誌位
		TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
	}
}

這樣之後就可以再任何地方使用中斷函式 “TIM2_IRQHandler”了。

有個小問題是,裝置一上電就會執行一次中斷,並沒有滿足條件,為了防止這件事出現可以用下面的程式碼來解決這個問題

// TIM初始化完成之後
TIM_ClearFlag(TIM2, TIM_IT_Update); // 加上這句話是可以防止一上電就執行了一次中斷

相關文章