今天開始我們要來使用STM32強大的功能之一 TIMER!
STM32F429ZI總共有14個計時器,這14個大致可以分為三種,通用定時器、基本定時器、高級定時器
三種的差異在於通用定時器、高級定時器有些會有其他的功能,但我們現在先不詳細介紹,先了解TIMER最基本的用法即可。由於這三種的本質上都是同樣的東西,因此接下來的操作用哪一個TIMER都沒有關係,只是設定的介面會有些微的不同。
顧名思義就是一個計數的工具,他會從0開始往上數,只要到達設定的上限,他就會歸零,並且重新計數。而不同的TIMER支援的counter有所不同,可以看上面的表格,有些可以設定往上數(count-up),或往下數(count-down)或先往上數再往下數(count-down)稱作中心對齊模式。
每一個timer都需要有一個時鐘來源,我們暫時先記得timer1、8、9、10、11是來自APB1匯流排,其他的都是來自APB2,而這兩個匯流排的頻率在預設的情況下都是16MHz,可以在Clock configuration裡面看到
接下來我們來介紹幾個參數
我們來實際操作看看吧~
首先一樣來設定.ioc檔
/* USER CODE BEGIN 2 */
HAL_TIM_Base_Start(&htim2);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
x = __HAL_TIM_GET_COUNTER(&htim2);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
一樣要記得設全域變數 x 才能使用現場表達式做監測
這裡出現了兩個新的函數我們來介紹一下吧
HAL_TIM_Base_Start(TIM_HandleTypeDef *htim)
之後會大量的看到類似這種的函式HAL_XXX_Start,這種函式功能為讓某種功能啟用,以這裡為例,他就是讓TIMER開始計數。
__HAL_TIM_GET_COUNTER()
這個函式的功能就是可以得到TIMER現在數到哪(也就是Counter的值)。而實際上,他不是普通的函式,他是用C語言#define的方式來定義的。定義如下:
#define __HAL_TIM_GET_COUNTER(__HANDLE__) ((__HANDLE__)->Instance->CNT)
雖然他並不是一般的函式,但我們姑且稱他為函式。這個函式在做的事情非常簡單,我們會傳進去一個__handle__結構的指標變數(htim2),而這個函式就負責找到這個結構變數底下的Instance的CNT變數。
我們可以在現場表達式輸入htim2看一下裡面的結構有哪些變數,
這個程式執行的時候我們就可以看到x不斷的從0加到10000(單位為ms),可以試著拿手機的計時器來檢驗。
我們就繼續用這支程式來了解counter的其他設定
在這裡可以更動計數的模式,用以下的圖可以清楚地了解這三種計數模式的差別,由上到下依序為中心對齊、下數、上數
這三種模式目前對我們來說還沒什麼用處,要等講到PWM輸出的時候才能了解意義,現在我們就知道他數的模式有這三種就好。
選項裡面的center aligned有1、2、3
可以用上面的小程式來看一下x值的變化。
今天簡單的介紹了Timer最基本的使用,明天我們會加入中斷的概念,來簡單實作微秒級的delay(以前介紹的HAL_Delay()精度只能達到毫秒)