1、準備材料
開發(fā)板(STM32F407G-DISC1)
STM32CubeMX軟件(Version 6.10.0)
keil μVision5 IDE(MDK-Arm)
ST-LINK/V2驅動
邏輯分析儀nanoDLA
2、實驗目標
使用STM32CubeMX軟件配置STM32F407開發(fā)板使用基本定時器TIM6實現(xiàn)每500ms控制綠燈狀態(tài)變化一次,基本定時器TIM7實現(xiàn)每1s控制紅燈狀態(tài)變化一次
3、定時器概述
STM32F407擁有2個基礎定時器、10個通用定時器和2個高級定時器,14個定時器全部掛載在APB1和APB2時鐘總線上,APB2時鐘總線時鐘頻率最高可達84MHz,APB1時鐘總線時鐘頻率最高可達42MHz,除TIM2和TIM5為32位外,其余定時器全部為16位,其結構框圖如下圖所示 (注釋1)
?不同的定時器具有不同的特性,有些定時器的計數(shù)器長度為16位,有些則為32位;有些定時器可以遞增、遞減或遞增/遞減計數(shù),但有些定時器只能遞增計數(shù);有些定時器可以產(chǎn)生DMA請求,有些則不可以;另外定時器捕獲/比較通道數(shù)量也不一樣;具體特性區(qū)別請看下表 (注釋2)
?4、實驗流程
4.0、前提知識
基本定時器由TIM6和TIM7組成,計數(shù)器為16位,內(nèi)部結構較為簡單,只有定時器的基本功能,可以做定時或驅動DAC,本實驗暫不討論DAC,只用定時功能,如下圖所示為基本定時器框架 (注釋3)
?基本定時器的時鐘來源為APB1 Timer clocks,當通過控制器啟動基本定時器TIM6/7時,時鐘信號經(jīng)過PSC預分頻器將時鐘分頻,然后以分頻后的時鐘頻率增加計數(shù)器的值,當計數(shù)器達到自動重載寄存器設置的值之后,產(chǎn)生溢出
4.1、CubeMX相關配置
4.1.0、工程基本配置
打開STM32CubeMX軟件,單擊ACCESS TO MCU SELECTOR選擇開發(fā)板MCU(選擇你使用開發(fā)板的主控MCU型號),選中MCU型號后單擊頁面右上角Start Project開始工程,具體如下圖所示
?開始工程之后在配置主頁面System Core/RCC中配置HSE/LSE晶振,在System Core/SYS中配置Debug模式,具體如下圖所示
?詳細工程建立內(nèi)容讀者可以閱讀“STM32CubeMX教程1 工程建立”
4.1.1、時鐘樹配置
基本定時器涉及到定時時間的問題,而TIM6/7的時鐘來源自APB1 Timer clocks,因此需要先知道APB1 Timer clocks的頻率,才可以計算基本定時器的溢出時間
如下圖所示,時鐘樹上所有總線頻率均設置為了STM32F4能達到的最高頻率,此時APB1 Timer clocks=84MHz
4.1.2、外設參數(shù)配置
在Pinout & Configuration頁面左側功能分類欄目中點開Timers欄目,單擊欄目下的TIM6和TIM7
在頁面中間TIM6/7 Mode and Configuration 中勾選Activated激活基本定時器,One Pulse Mode為單次定時模式,勾選該模式則定時器只觸發(fā)一次,默認定時器為連續(xù)觸發(fā),觸發(fā)完一次后自動重載ARR中設置的值重新計數(shù)
在頁面中間Configuration欄中可設置基本定時器參數(shù),包括 Prescaler (預分頻系數(shù))、 Counter Mode (計數(shù)模式)和 Counter Period (ARR寄存器的值)通過這些參數(shù)的設置可以決定基本定時器的溢出時間
APB1 Timer clocks=84MHz,PSC=8399,ARR=4999,此時可計算溢出時間為(PSC+1)(ARR+1)/APB1 Timer clocks=0.5秒=500毫秒,則每500ms定時器產(chǎn)生一次溢出,ARR設置為9999則定時器1s溢出一次
auto-reload preload :可以選擇使能或不使能,如果不使能該參數(shù),則在使用__HAL_TIM_SET_AUTORELOAD()函數(shù)動態(tài)修改基本定時器ARR參數(shù)值時,修改的值會立馬生效;而如果使能該參數(shù),則修改的值會在當前計數(shù)溢出之后下次得到修改
Trigger Output (TRGO) Parameters :一般是用來設置用作其他外設的觸發(fā)源的,比如將Trigger Event Selection選擇為Update Event,然后在其他外設比如ADC中配置外部觸發(fā)源時選擇該定時器的觸發(fā)事件(如果可以的話),這樣在定時器產(chǎn)生Update Event時就可以啟動外設,實現(xiàn)用定時器來控制外設啟動的功能
上述配置如下圖所示
4.1.3、外設中斷配置
基本定時器的觸發(fā)有三種模式 ① 輪詢方式、② 中斷方式和③ DMA方式,這里只介紹前兩種方式
① 對于輪詢方式,當前設置已經(jīng)足夠,只需要在生成的程序中使用HAL_TIM_Base_Start(&htim6)啟動基本定時器,然后不斷輪詢計數(shù)值或UEV事件標志來判斷是否發(fā)生了計數(shù)溢出
② 中斷方式是基本定時器最常用的方式,在Pinout & Configuration頁面左側功能分類欄目中點開NVIC欄目,然后選擇合適的中斷優(yōu)先級并勾選基本定時器6和7的中斷使能
4.2、生成代碼
4.2.0、配置Project Manager頁面
單擊進入Project Manager頁面,在左邊Project分欄中修改工程名稱、工程目錄和工具鏈,然后在Code Generator中勾選“Gnerate peripheral initialization as a pair of 'c/h' files per peripheral”,最后單擊頁面右上角GENERATE CODE生成工程,具體如下圖所示
詳細Project Manager配置內(nèi)容讀者可以閱讀“STM32CubeMX教程1 工程建立”實驗3.4.3小節(jié)
4.2.1、外設初始化調(diào)用流程
在工程代碼主函數(shù)main()中調(diào)用MX_TIM6_Init()函數(shù)對基本定時器TIM6參數(shù)進行了配置
在該MX_TIM6_Init()函數(shù)中調(diào)用了HAL_TIM_Base_Init()對定時器進行了初始化
然后在HAL_TIM_Base_Init()函數(shù)中調(diào)用了HAL_TIM_Base_MspInit()函數(shù)對TIM6時鐘和中斷設置/使能
TIM7初始化流程類似,具體定時器TIM6初始化流程如下圖所示
4.2.2、外設中斷調(diào)用流程
激活了基本定時器并啟動TIM6/7全局中斷之后,會在stm32f4xx_it.c中新增TIM6/7的中斷服務函數(shù)TIM6_DAC_IRQHandler()和TIM7_IRQHandler()
該函數(shù)均調(diào)用HAL庫的定時器中斷統(tǒng)一處理函數(shù)HAL_TIM_IRQHandler(),該函數(shù)通過一系列的判斷最終得出基本定時器目的為周期回調(diào) (注釋4),因此最終調(diào)用周期回調(diào)函數(shù)HAL_TIM_PeriodElapsedCallback(),該函數(shù)為虛函數(shù)
TIM7中斷調(diào)用流程類似,具體定時器TIM6中斷調(diào)用流程如下圖所示
4.2.3、添加其他必要代碼
重新在tim.c中實現(xiàn)周期回調(diào)函數(shù)HAL_TIM_PeriodElapsedCallback(),當定時器TIM6溢出則翻轉GREEN_LED引腳狀態(tài),當定時器TIM7溢出則翻轉RED_LED引腳狀態(tài),具體代碼如下圖所示
?源代碼如下
/*基本定時器周期回調(diào)函數(shù)*/
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim == &htim6)
{
HAL_GPIO_TogglePin(GREEN_LED_GPIO_Port, GREEN_LED_Pin) ;
}
if(htim == &htim7)
{
HAL_GPIO_TogglePin(RED_LED_GPIO_Port, RED_LED_Pin) ;
}
}
在主函數(shù)中以中斷方式啟動基本定時器TIM6/7,具體代碼如下圖所示
5、常用函數(shù)
/*以輪詢工作方式啟動定時器*/
HAL_StatusTypeDef HAL_TIM_Base_Start(TIM_HandleTypeDef *htim)
/*停止輪詢工作方式的定時器*/
HAL_StatusTypeDef HAL_TIM_Base_Stop(TIM_HandleTypeDef *htim)
/*以中斷工作方式啟動定時器*/
HAL_StatusTypeDef HAL_TIM_Base_Start_IT(TIM_HandleTypeDef *htim)
/*停止中斷工作方式的定時器*/
HAL_StatusTypeDef HAL_TIM_Base_Stop_IT(TIM_HandleTypeDef *htim)
/*定時器周期回調(diào)子函數(shù)*/
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
6、燒錄驗證
燒錄程序,開發(fā)板上電后觀察現(xiàn)象為綠燈每隔500ms狀態(tài)改變一次,紅燈每隔1s狀態(tài)改變一次
使用邏輯分析儀監(jiān)測PD12/14引腳狀態(tài),可以看出TIM6每500ms翻轉一次PD12引腳狀態(tài),TIM7每1000ms翻轉一次PD14引腳狀態(tài)
7、注釋詳解
注釋1:圖片來源STM32F407VGT6 Datasheet DS8626
注釋2:圖片來源 STM32 CubeMX 學習:003-定時器(其原表有錯誤)
注釋3:圖片來源STM32F4xx中文參考手冊文章來源:http://www.zghlxwxcb.cn/news/detail-776469.html
注釋4:具體過程請參看 HAL_TIM_IRQHandler(TIM_HandleTypeDef *htim) 函數(shù)詳解文章來源地址http://www.zghlxwxcb.cn/news/detail-776469.html
到了這里,關于STM32CubeMX教程5 TIM 定時器概述及基本定時器的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!