【STM32F4】利用定時器實現最基本的定時功能(HAL)
定時器簡介
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
-
開啟stm32Cubemx,建立新工程,晶片型號選擇STM32F429IG
-
配置RCC為外部高速時鐘(HSE)。
-
配置定時器TIM2,選擇時鐘源為內部時鐘,配置計數方式,arr和psc以及是否重灌載,並使能中斷。
Clock Source:選擇時鐘源(Internal Source)
Prescaler:PSC定時器分頻係數 (17999 )
Counter Mode:計數模式( UP:遞增計數)
Counter Period:自動重灌載值(4999)
auto-reload preload:是否開啟重灌載(Enable)
只需設定上述四個選項即可,其餘設定和本程式無關,保持預設即可。
- 設定時鐘樹
選擇外部時鐘HSE 8MHz
PLL鎖相環倍頻180倍
系統時鐘來源選擇為PLL
設定APB1分頻器為 /2
這時候定時器的時脈頻率為90Mhz
- 配置GPIO口
我的板子LED連線的埠是PF6,找到PF6,並設定output模式
配置GPIO口的相關引數
設定輸出電平,參照自己板子的電路圖,我的是低電平點亮
設定輸出模式
設定上/下拉
設定輸出速度
設定使用者標籤
- 生成程式
設定工程名稱
設定路徑
選擇編譯器
設定庫函式版本
其餘設定保持預設
點選GENERATE CODE生成程式碼
- 開啟TIM2中斷
HAL_TIM_Base_Start函式在stm32f4xx_hal_tim.h檔案中
- 在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 */
大功告成
相關文章
- 利用定時器實現51微控制器返回上電執行時間功能定時器
- STM32 HAL 定時器代替HAL_Delay延時函式定時器函式
- ScheduledThreadPoolExecutor實現定時器和延時載入功能thread定時器
- 直播app原始碼,定時開關,實現計時器功能APP原始碼
- 【STM32+HAL庫】使用通用定時器生成的PWM實現呼吸燈效果定時器
- 【JavaScript定時器小案例】常見的幾種定時器實現的案例JavaScript定時器
- Go定時器的三種實現方式Go定時器
- 定時器以及定時器的幾個案例定時器
- STM32 定時器詳細篇(基於HAL庫)定時器
- 定時任務的實現
- C++定時器CTimer的實現C++定時器
- Spring定時器的兩種實現方式Spring定時器
- 現實生活:定時器&孔子的一生定時器
- 定時器定時器
- 如何實現定時推送?
- 前端css實現最基本的時間軸前端CSS
- Golang 定時器底層實現深度剖析Golang定時器
- Laravel 結合 Redis 實現 PHP 定時器LaravelRedisPHP定時器
- .NET中如何實現高精度定時器定時器
- c++控制檯程式實現定時器C++定時器
- js實現0ms延時定時器的幾種方式JS定時器
- Qt中利用定時器QTimer實時顯示當前日期和時間QT定時器
- UniRx精講(一):UniRx簡介&定時功能實現
- Go 的定時器Go定時器
- Java可自定義中斷定時器的實現Java定時器
- 使用監聽器實現JavaWeb的定時執行JavaWeb
- linux下多定時器的實現(經典)Linux定時器
- HAL庫與Cubemx系列|Systick-系統滴答定時器詳解定時器
- [iOS]各種定時器–最全的定時器使用iOS定時器
- javaweb使用監聽器實現定時週期性執行任務的功能JavaWeb
- Qt中利用定時器QTimer準實時顯示當前日期和時間QT定時器
- VUE簡單的定時器實時重新整理Vue定時器
- Laravel + Workerman 實現多程式定時器任務Laravel定時器
- java springboot 實現定時器任務JavaSpring Boot定時器
- hal 編碼器做使用者輸入時捕獲初值的設定
- iOS定時器iOS定時器
- JavaScript定時器JavaScript定時器
- js定時器JS定時器