定時器
定時器的基本概述
STM32的常見的定時器資源: 系統嘀嗒定時器SysTick、看門狗定時器WatchDog、實時時鐘RTC、基本定時器、通用定時器、高級定時器。
系統嘀嗒定時器SysTick :這是一個集成在Cortex M3內核當中的定時器,它並不屬於芯片廠商的外設,也就是說使用ARM內核的不同廠商,都擁有基本結構相同的系統定時器。主要目的是給RTOS提供時鐘節拍做時間基準。
基本定時器:TIM6、TIM7。
通用定時器:TIM2、TIM3、TIM4、TIM5。在基本定時器的基礎上,實現輸出比較、輸入捕獲、PWM生成、單脈衝模式輸出等功能。這類定時器最具***代表性***,使用也***最廣泛***。
高級定時器:TIM1、TIM8。
STM32通用定時器的重要知識點
通用定時器的基本結構組成:
STM32的通用定時器,是一個通過可編程預分頻器(Prescaler)驅動的16位自動重裝主計數器(Counter Period)構成。可以對內部時鐘或觸發源以及外部時鐘或觸發源進行計數。
TIMx主要功能:通用TIMx (TIM2、TIM3、TIM4和TIM5)定時器功能包括:
- 16位向上、向下、向上/向下自動裝載計數器
- 16位可編程(可以實時修改)預分頻器,計數器時鐘頻率的分頻係數爲1~65536之間的意
數值 - 4個獨立通道:
- 輸入捕獲
- 輸出比較
- PWM生成(邊緣或中間對齊模式)
- 單脈衝模式輸出
- 使用外部信號控制定時器和定時器互連的同步電路
- 如下事件發生時產生中斷/DMA:
- 更新:計數器向上溢出/向下溢出,計數器初始化(通過軟件或者內部/外部觸發)
- 觸發事件(計數器啓動、停止、初始化或者由內部/外部觸發計數)─
- 輸入捕獲
- 輸出比較
- 支持針對定位的增量(正交)編碼器和霍爾傳感器電路
- 觸發輸入作爲外部時鐘或者按週期的電流管理
-
- 更新:計數器向上溢出/向下溢出,計數器初始化(通過軟件或者內部/外部觸發)
觸發事件(計數器啓動、停止、初始化或者由內部/外部觸發計數)
輸入捕獲
輸出比較
- 更新:計數器向上溢出/向下溢出,計數器初始化(通過軟件或者內部/外部觸發)
通用定時器的==基本工作原理==:
首先,定時器時鐘信號送入16位***可編程預分配器***(Prescaler),該預分配器係數爲0~65535之間的任意數值。預分配器溢出後,會向16位的主計數器(Counter Period)發出一個脈衝信號。
預分頻器,本質上是一個加法計數器,預分頻係數實際上就是加計數的溢出值。
定時器發生中斷時間的計算方法:
定時時間 = (Prescaler+1 ) X (Counter Period+1) X 1/ 定時器時鐘頻率(信號的週期)
時鐘信號1KHz,Prescaler爲9,Counter Period爲999,定時時間?
例子:時鐘信號32MHz,每隔500ms翻轉一次PB9的輸出電平
【1】設置Clock Source時鐘源
【2】設置Prescaler和Counter Period參數
【3】設置NVIC嵌套向量中斷控制器
注:Prescaler和Counter Period參數的設置不是唯一的,一般設置方法:時鐘信號爲X,則Prescaler爲X-1,需要的時間爲Yms,則Counter Period設置爲Y-1, 上題中,Prescaler和Counter Period參數爲32000和500,32000 * 500/32000 = 0.5s = 500ms
CUBEMX設置
大部分設置和之前寫的一樣,LED腳作GPIO_OUTPUT,配置時鐘源。
- 配置定時器TIM2,Prescaler和Counter Period參數設置
- 使能TIM2
- 配置時鐘數
-
生成工程
MDK設置
-
編寫回調函數
在
stm32l4xx_it.c
中生成的中斷處理函數如下,定時器TIM2所有的中斷都會調用該中斷服務函數TIM2_IRQHandler
:
- 在中斷處理函數中自動生成了HAL_TIM_IRQHandler(&htim2)代碼,該代碼會自動根據中斷事件回調相應的函數,這裏我們需要處理更新中斷的事件,回調函數默認是__weak定義的,所以在tim.c中重新定義該回調函數,並且在該函數中添加功能的時候,因爲該回調函數會被所有的==定時器共用==,所以需要先判斷是哪個定時器在調用:
- 最後在
main
函數中開啓TIM2並使能其中斷(TIM2初始化代碼之後,while之前):
HAL_TIM_Base_Start_IT(&htim2);
最後就可以看見LED以0.5S爲週期閃爍了