【STM32F4】利用定時器實現最基本的定時功能(HAL)

五好市民金閃閃發表於2020-11-22

定時器簡介

STM32F429微控制器有許多定時器Timer,主要分成三類,基本定時器;通用定時器和高階定時器。三種型別的定時器功能由少變多,高階定時器包含了低階定時器的功能。

  • 基本定時器:TIM6、TIM7
  • 通用定時器:TIM2、TIM3、TIM4、TIM5、TIM9~TIM14
  • 高階定時器:TIM1,TIM8
    在這裡插入圖片描述

注:圖中的介面介面時鐘就是匯流排時鐘。

定時器最基本的功能就是定時,三種型別的定時器都包含定時功能,今天只講述如何利用HAL庫方法實現利用定時功能點亮LED燈。

定時功能主要有三種方式:

  • 遞增計數:計數器從0計數到自動載入值(TIMx_ARR),然後重新從0開始計數並且產生一個計數器溢位事件
  • 遞減計數:計數器從自動裝入的值(TIMx_ARR)開始向下計數到0,然後從自動裝入的值重新開始,併產生一個計數器向下溢位事件。
  • 遞增/減計數:計數器從0開始計數到自動裝入的值-1,產生一個計數器溢位事件,然後向下計數到1並且產生一個計數器溢位事件;然後再從0開始重新計數。

此處引用Z小旋的圖片:

在這裡插入圖片描述

定時時間計算公式為:

在這裡插入圖片描述

arr為計數值,psc為定時器分頻係數,Tclk一般設定為最大工作頻率,其中psc和arr可以自己設定,tclk為定時器時鐘,也就是第一個圖的最後一列。

舉個例子:

以stm32f429為例,假如想利用TIM2定時500ms,TIM2位於APB2匯流排上,其定時器時鐘為90Mhz,為了方便計算,psc一般設定為Tclk*100-1,也就是8999,這樣arr的設定值為定時時間*10-1,也就是499,單位為ms。

假如使用103微控制器,定時100ms,那麼arr=999(1000-1),psc=7199(7200-1),tclk=72M。注意單位Tout為ms,tclk為Mhz

利用定時器點亮LED

  1. 開啟stm32Cubemx,建立新工程,晶片型號選擇STM32F429IG

  2. 配置RCC為外部高速時鐘(HSE)。
    在這裡插入圖片描述

  3. 配置定時器TIM2,選擇時鐘源為內部時鐘,配置計數方式,arr和psc以及是否重灌載,並使能中斷。

在這裡插入圖片描述

在這裡插入圖片描述

Clock Source:選擇時鐘源(Internal Source)

Prescaler:PSC定時器分頻係數 (17999 )

Counter Mode:計數模式( UP:遞增計數)

Counter Period:自動重灌載值(4999)

auto-reload preload:是否開啟重灌載(Enable)

只需設定上述四個選項即可,其餘設定和本程式無關,保持預設即可。

  1. 設定時鐘樹
    在這裡插入圖片描述

選擇外部時鐘HSE 8MHz
PLL鎖相環倍頻180倍
系統時鐘來源選擇為PLL
設定APB1分頻器為 /2
這時候定時器的時脈頻率為90Mhz

  1. 配置GPIO口
    我的板子LED連線的埠是PF6,找到PF6,並設定output模式
    在這裡插入圖片描述
    配置GPIO口的相關引數
    在這裡插入圖片描述

設定輸出電平,參照自己板子的電路圖,我的是低電平點亮
設定輸出模式
設定上/下拉
設定輸出速度
設定使用者標籤

  1. 生成程式
    在這裡插入圖片描述
    設定工程名稱
    設定路徑
    選擇編譯器
    設定庫函式版本

在這裡插入圖片描述

其餘設定保持預設
點選GENERATE CODE生成程式碼

  1. 開啟TIM2中斷

在這裡插入圖片描述
HAL_TIM_Base_Start函式在stm32f4xx_hal_tim.h檔案中

  1. 在TIM.c中新增中斷回撥函式
 /* Includes ------------------------------------------------------------------*/
#include "tim.h"

/* USER CODE BEGIN 0 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
	if (htim == (&htim2))
	HAL_GPIO_TogglePin(GPIOF, GPIO_PIN_6);
}

/* USER CODE END 0 */

大功告成

相關文章