前言:
今天我們來學習定時器,32的定時器有着非常豐富的功能, 輸入捕獲/輸出比較,PWM,中斷等等。是我們學習STM32最頻繁使用到的外設之一,所以一定要掌握好,這節我們講解定時器中斷,本系列教程將HAL庫與STM32CubeMX結合在一起講解,使您可以更快速的學會各個模塊的使用
所用工具:
1、芯片: STM32F407ZET6/STM32F103ZET6
2、STM32CubeMx軟件
3、IDE: MDK-Keil軟件
4、STM32F1xx/STM32F4xxHAL庫
5
知識概括:
通過本篇博客您將學到:
SMT32定時器原理
STM32CubeMX創建定時器例程
HAL庫TIM定時器函數庫
定時器中斷的創建與使用
定時器簡介:
SMT32F1系列共有8個定時器:
高級定時器(TIM1、TIM8);通用定時器(TIM2、TIM3、TIM4、TIM5);基本定時器(TIM6、TIM7)。
SMT32F4系列共有15個定時器:
高級定時器(TIM1、TIM8);通用定時器(TIM2、TIM3、TIM4、TIM5、TIM9~TIM14);基本定時器(TIM6、TIM7)。
基本定時器功能(TIM6、TIM7):
- 16位向上、向下、向上/下自動裝載計數器
- 16位可編程(可以實時修改)預分頻器,計數器時鐘頻率的分頻係數爲1~65535之間的任意數值
- 觸發DAC的同步電路 注:此項是TIM6/7獨有功能.
- 位於APB1總線上
通用定時器(TIM2~TIM5)的主要功能:
- 16位向上、向下、向上/下自動裝載計數器
- 16位可編程(可以實時修改)預分頻器,計數器時鐘頻率的分頻係數爲1~65535之間的任意數值
- 4 個獨立通道(TIMx_CH1~4)可以用作:
- 測量輸入信號的脈衝長度( 輸入捕獲)
- 輸出比較
- 單脈衝模式輸出
- PWM輸出(邊緣或中間對齊模式)
- 支持針對定位的增量(正交)編碼器和霍爾傳感器電路
- 如下事件發生時產生中斷/DMA:
- 更新:計數器向上溢出/向下溢出,計數器初始化(通過軟件或者內部/外部觸發)
- 觸發事件(計數器啓動、停止、初始化或者由內部/外部觸發計數)
- 輸入捕獲
- 輸出比較
- 位於APB1總線上
高級定時器(TIM1,TIM8)的主要功能:
- 高級定時器具有基本,通用定時器的所有的功能,
- 還具有控制交直流電動機所有的功能,
- 輸出6路互補帶死區的信號,剎車功能等等
- 位於APB2總線上
總括:基本定時器就是單純的定時計數器,通用定時器多了四個通道,相對應的增加了功能,高級定時器具有基本,通用定時器的所有的功能,並且添加了其他功能
定時器計數模式
通用定時器可以向上計數、向下計數、向上向下雙向計數模式。
- 向上計數模式:計數器從0計數到自動加載值(TIMx_ARR),然後重新從0開始計數並且產生一個計數器溢出事件。
- 向下計數模式:計數器從自動裝入的值(TIMx_ARR)開始向下計數到0,然後從自動裝入的值重新開始,併產生一個計數器向下溢出事件。
- 中央對齊模式(向上/向下計數):計數器從0開始計數到自動裝入的值-1,產生一個計數器溢出事件,然後向下計數到1並且產生一個計數器溢出事件;然後再從0開始重新計數。
簡單地理解三種計數模式,可以通過下面的圖形:
計數時鐘的選擇
計數器時鐘可由下列時鐘源提供:
- 內部時鐘(TIMx_CLK)
- 外部時鐘模式1:外部捕捉比較引腳(TIx)
- 外部時鐘模式2:外部引腳輸入(TIMx_ETR) 僅適用TIM2,3,4
- 內部觸發輸入(ITRx):使用一個定時器作爲另一個定時器的預分頻器,如可以配置一個定時器Timer1而作爲另一個定時器Timer2的預分頻器。
定時器的主從模式: (選看)
定時器一般是通過軟件設置而啓動,STM32的每個定時器也可以通過外部信號觸發而啓動,還可以通過另外一個定時器的某一個條件被觸發而啓動。這裏所謂某一個條件可以是定時到時間、定時器超時、比較成功等許多條件。
這種通過一個定時器觸發另一個定時器的工作方式稱爲定時器的同步,發出觸發信號的定時器工作於主模式,接受觸發信號而啓動的定時器工作於從模式
觸發條件:
定時器的四種主從機模式:
- 外部觸發模式1
- IRC重置模式
- 門控模式
- 觸發模式
這個我們用的很少,介紹下主要是爲了下面的講解 如果需要全面瞭解,請參考 《STM32中文參考手冊》 275頁 定時器主從模式
工程創建
1設置RCC
設置高速外部時鐘HSE 選擇外部時鐘源
2設置時鐘
我的是 外部晶振爲8MHz
- 1選擇外部時鐘HSE 8MHz
- 2PLL鎖相環倍頻72倍
- 3系統時鐘來源選擇爲PLL
- 4設置APB1分頻器爲 /2
- 5 這時候定時器的時鐘頻率爲72Mhz
32的時鐘樹框圖 如果不懂的話請看《【STM32】系統時鐘RCC詳解(超詳細,超全面)》
3定時器設置
1選擇TIM2
2定時器時鐘選擇內部時鐘
Clock Source(時鐘來源)
- 選項1 :Internal Clock 內部時鐘
- 選項2 : ETR2 外部觸發輸入(ETR)(僅適用TIM2,3,4)
Prtscaler (自動重裝載值) : 7199
Counter Mode(計數模式) Up(向上計數模式)
Counter Period(定時器分頻) : 4999
CKD(時鐘分頻因子) : No Division 不分頻
選項: 可以選擇二分頻和四分頻
auto-reload-preload(自動重裝載) : Enable 使能
TRGO Parameters 觸發輸出 (TRGO) 不使能 與本節無關,之後做詳細介紹
TRGO: 定時器的觸發信號輸出 在定時器的定時時間到達的時候輸出一個信號(如:定時器更新產生TRGO信號來觸發ADC的同步轉換,)
這兩個爲定時器主從模式配置,很少用到,我們用不到,所以全部關閉
使能定時器中斷:
定時器溢出時間:
這裏我們 arr=4999 psc=7199 Tclk=72Mhz Tout = (5000*7200)/72 us = 500ms
4項目文件設置
- 1 設置項目名稱
- 2 設置存儲路徑
- 3 選擇所用IDE
5創建工程文件
然後點擊GENERATE CODE 創建工程
配置下載工具
新建的工程所有配置都是默認的 我們需要自行選擇下載模式,勾選上下載後復位運行
函數講解:
HAL_TIM_IRQHandler(&htim2);
定時器中斷處理函數 在stm32f4xx_it.c的 TIM2_IRQHandler()定時器中斷服務函數中
這個函數的具體作用是判斷中斷是否正常,然後判斷產生的是哪一類定時器中斷(溢出中斷/PWM中斷.....),然後進入相應的中斷回調函數
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
在HAL庫中,每進行完一箇中斷,並不會立刻退出,而是會進入到中斷回調函數中,
這裏我們是使用定時器溢出中斷回調函數
例程:
定時器溢出時間爲500ms,LED點亮延時500ms閃爍
在main.c主函數下方添加中斷回調函數
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
static unsigned char ledState = 0;
if (htim == (&htim2))
{
if (ledState == 0)
HAL_GPIO_WritePin(GPIOE,GPIO_PIN_15,GPIO_PIN_RESET);
else
HAL_GPIO_WritePin(GPIOE,GPIO_PIN_15,GPIO_PIN_SET);
ledState = !ledState;
}
}