iT邦幫忙

2021 iThome 鐵人賽

DAY 14
1
Arm Platforms

STM32 基礎入門教學系列 第 14

【Day14】:STM32輾壓Arduino的功能—TIM(上)

計時器 TIMER

今天開始我們要來使用STM32強大的功能之一 TIMER!
STM32F429ZI總共有14個計時器,這14個大致可以分為三種,通用定時器、基本定時器、高級定時器
https://ithelp.ithome.com.tw/upload/images/20210907/20141525NnE3UgDzfy.png
三種的差異在於通用定時器、高級定時器有些會有其他的功能,但我們現在先不詳細介紹,先了解TIMER最基本的用法即可。由於這三種的本質上都是同樣的東西,因此接下來的操作用哪一個TIMER都沒有關係,只是設定的介面會有些微的不同。

計數器 counter

顧名思義就是一個計數的工具,他會從0開始往上數,只要到達設定的上限,他就會歸零,並且重新計數。而不同的TIMER支援的counter有所不同,可以看上面的表格,有些可以設定往上數(count-up),或往下數(count-down)或先往上數再往下數(count-down)稱作中心對齊模式。

PSC & ARR讓你的時鐘可快可慢

每一個timer都需要有一個時鐘來源,我們暫時先記得timer1、8、9、10、11是來自APB1匯流排,其他的都是來自APB2,而這兩個匯流排的頻率在預設的情況下都是16MHz,可以在Clock configuration裡面看到
https://ithelp.ithome.com.tw/upload/images/20210907/20141525HyigLCFbQI.jpg
接下來我們來介紹幾個參數

  1. 分頻數(Prescaler)
    而由於STM32的時鐘預設是16MHz速度,太快了,我們難以使用,因此也就有了分頻係數(Prescalar)的產生,分頻就是將原來的頻率降低為原來的1/N,而由上表可知STM所有時鐘的分頻係數皆為1~65536,但這裡要注意,設定時的數值為(0~65535),當設為0時分頻係數為1,頻率不變
  2. 計數週期(counter period)又稱為自動重載暫存器Auto reload register(ARR)
    當這個計數器數到這個數字時會自動歸零,例如當你設為1000時,counter會從0~999,不會有1000

我們來實際操作看看吧~
首先一樣來設定.ioc檔

  1. 在Timers的選單裡面選TIM2,在Clock source裡面選Internal clock
    https://ithelp.ithome.com.tw/upload/images/20210907/20141525ybGs4uDmqw.jpg
  2. 底下參數的配置就調整PSC以及ARR,我們先把PSC設為15999,也就是分頻數為16000讓時鐘的頻率由原本的16MHz變為1kHz,而ARR設為10000,只要數到10000,就會歸零(不會出現1000這個數字)。
  3. 這樣就設定完成了,接下來來寫程式
/* 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看一下裡面的結構有哪些變數,
https://ithelp.ithome.com.tw/upload/images/20210907/20141525D8r8Qdkx0I.jpg

這個程式執行的時候我們就可以看到x不斷的從0加到10000(單位為ms),可以試著拿手機的計時器來檢驗。

上數(count-up)、下數(count-down)、中心對齊(center-aligned)

我們就繼續用這支程式來了解counter的其他設定
https://ithelp.ithome.com.tw/upload/images/20210907/201415258oUCdTNMnr.jpg
在這裡可以更動計數的模式,用以下的圖可以清楚地了解這三種計數模式的差別,由上到下依序為中心對齊、下數、上數
https://ithelp.ithome.com.tw/upload/images/20210907/20141525hblRk6dBLV.png
這三種模式目前對我們來說還沒什麼用處,要等講到PWM輸出的時候才能了解意義,現在我們就知道他數的模式有這三種就好。
選項裡面的center aligned有1、2、3
可以用上面的小程式來看一下x值的變化。

小結

今天簡單的介紹了Timer最基本的使用,明天我們會加入中斷的概念,來簡單實作微秒級的delay(以前介紹的HAL_Delay()精度只能達到毫秒)


上一篇
【Day13】:EXTI外部中斷/事件控制器
下一篇
【Day15】:STM32輾壓Arduino的功能—TIM(下)
系列文
STM32 基礎入門教學30

尚未有邦友留言

立即登入留言