1. 程式人生 > 資訊 >7.8 京東 PLUS DAY:全場 20 倍返豆、領券滿 300 減 40 元

7.8 京東 PLUS DAY:全場 20 倍返豆、領券滿 300 減 40 元

在stm32中,定時器相關的庫函式主要集中在韌體庫檔案 stm32f10x_tim.h 和 stm32f10x_tim.c 檔案中,所以在進行定時器方面的處理時,需要載入這兩個檔案進來。在進行定時器操作時,一般按如下步驟來進行:

1、開啟相關外設的時鐘。以定時器TIM3為例,由stm32的時鐘樹可以看到,TIM3時鐘掛接在APB1上面,所以開啟TIM3時鐘時使用:

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE)

如果其中還使用到了其他外設,如GPIO等,再開啟相關的外設時鐘就可以了。

2、清除中斷掛起位。由於各種不可知的因素作用,在程式執行前要操作的定時器的中斷掛起位有可能會被置位,這樣就會導致在程式一開始就會進入定時器中斷的中斷服務程式。為了消除這種影響,我們在程式的一開始就將中斷掛起位清除。在韌體庫中使用:

void TIM_ClearITPendingBit(TIM_TypeDef*TIMx, u16 TIM_IT)

來清除中斷掛起位,該函式的具體使用參考韌體庫手冊。

3、定時器基本配置初始化。在這一步驟中主要確定定時器的預分頻和設定自動重灌載暫存器週期的值,並確定計數模式,這主要使用韌體庫中的 TIM_TimeBaseInit()函式進行操作,該函式的原型為:

void TIM_TimeBaseInit(TIM_TypeDef* TIMx,TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct)

第一個輸入引數沒啥說的,就是使用的哪個定時器,第二個輸入引數是一個結構體,該結構體的定義如下:

typedef struct{

u16 TIM_Period;

u16 TIM_Prescaler;

u8 TIM_ClockDivision;

u16 TIM_CounterMode;

}TIM_TimeBaseInitTypeDef

4、使能定時器TIMx。這個簡單,直接函式TIM_Cmd()函式就可以了,比如使能定時器TIM3外設,則可用TIM_Cmd(TIM3,ENABLE)。

5、使能TIMx中斷。呼叫函式即可。因為我們要使用 TIM3 的更新中斷, 暫存器的相應位便可使能更新中斷。 在庫函式裡面定時器中斷使能是通過 TIM_ITConfig 函式來實現的:

void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState);

第一個引數是選擇定時器號,這個容易理解,取值為 TIM1~TIM17。

第二個引數非常關鍵,是用來指明我們使能的定時器中斷的型別,定時器中斷的型別有很多種,包括更新中斷 TIM_IT_Update,觸發中斷 TIM_IT_Trigger,以及輸入捕獲中斷等等。

第三個引數就很簡單了, 就是失能還是使能。

例如我們要使能 TIM3 的更新中斷,格式為:TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE );

6、配置中斷優先順序,也就是配置巢狀向量終端控制器NVIC。進行本步驟首先需要配置優先順序的分組,可以使用庫函式NVIC_PriorityGroupConfig()進行,分組的編號就是搶佔優先順序的位數,然後再配置NVIC初始化,使用函式NVIC_Init()進行,這個函式的原型為void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct),其中輸入引數的結構體的定義如下:

typedef struct{

u8 NVIC_IRQChannel;

u8 NVIC_IRQChannelPreemptionPriority;

u8 NVIC_IRQChannelSubPriority;

FunctionalState NVIC_IRQChannelCmd;

}NVIC_InitTypeDef

7、編寫中斷服務程式。在這裡,我們首先要清除中斷掛起位,該函式同第2步中,自不必贅述,接著再編寫中斷處理內容即可。

void TIM4_IRQHandler(void)

{
if(TIM_GetITStatus(TIM4,TIM_IT_Update))
{
//
}
TIM_ClearITPendingBit(TIM4,TIM_IT_Update);
}