日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

STM32CubeMX教程5 TIM 定时器概述及基本定时器

發(fā)布時間:2024/1/5 windows 36 coder
生活随笔 收集整理的這篇文章主要介紹了 STM32CubeMX教程5 TIM 定时器概述及基本定时器 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1、準備材料

開發(fā)板(STM32F407G-DISC1)
ST-LINK/V2驅(qū)動
STM32CubeMX軟件(Version 6.10.0)
keil μVision5 IDE(MDK-Arm)
邏輯分析儀nanoDLA

2、實驗目標

使用STM32CubeMX軟件配置STM32F407開發(fā)板使用基本定時器TIM6實現(xiàn)每500ms控制綠燈狀態(tài)變化一次,基本定時器TIM7實現(xiàn)每1s控制紅燈狀態(tài)變化一次

3、定時器概述

STM32F407擁有2個基礎(chǔ)定時器、10個通用定時器和2個高級定時器,14個定時器全部掛載在APB1和APB2時鐘總線上,APB2時鐘總線時鐘頻率最高可達84MHz,APB1時鐘總線時鐘頻率最高可達42MHz,除TIM2和TIM5為32位外,其余定時器全部為16位,其結(jié)構(gòu)框圖如下圖所示(注釋1)

不同的定時器具有不同的特性,有些定時器的計數(shù)器長度為16位,有些則為32位;有些定時器可以遞增、遞減或遞增/遞減計數(shù),但有些定時器只能遞增計數(shù);有些定時器可以產(chǎn)生DMA請求,有些則不可以;另外定時器捕獲/比較通道數(shù)量也不一樣;具體特性區(qū)別請看下表(注釋2)

4、實驗流程

4.0、前提知識

基本定時器由TIM6和TIM7組成,計數(shù)器為16位,內(nèi)部結(jié)構(gòu)較為簡單,只有定時器的基本功能,可以做定時或驅(qū)動DAC,本實驗暫不討論DAC,只用定時功能,如下圖所示為基本定時器框架(注釋3),基本定時器的時鐘來源為APB1 Timer clocks,當通過控制器啟動基本定時器TIM6/7時,時鐘信號經(jīng)過PSC預分頻器將時鐘分頻,然后以分頻后的時鐘頻率增加計數(shù)器的值,當計數(shù)器達到自動重載寄存器設置的值之后,產(chǎn)生溢出

4.1、CubeMX相關(guān)配置

請先閱讀“STM32CubeMX 工程建立”實驗3.4.1小節(jié)配置RCC和SYS

4.1.1、時鐘樹配置

基本定時器涉及到定時時間的問題,而TIM6/7的時鐘來源自APB1 Timer clocks,因此需要先設置時鐘樹,知道APB1 Timer clocks的頻率,才可以計算基本定時器的溢出時間

如下圖所示,時鐘樹上所有總線頻率均設置為了STM32F4能達到的最高頻率,此時APB1 Timer clocks=84MHz

4.1.2、外設參數(shù)配置

在Pinout & Configuration頁面左側(cè)功能分類欄目中點開Timers欄目,單擊欄目下的TIM6和TIM7

在頁面中間TIM6/7 Mode and Configuration 中勾選Activated激活基本定時器,One Pulse Mode為單次定時模式,勾選該模式則定時器只觸發(fā)一次,默認定時器為連續(xù)觸發(fā),觸發(fā)完一次后自動重載ARR中設置的值重新計數(shù)

在頁面中間Configuration欄中可以設置基本定時器的參數(shù),包括預分頻器系數(shù)、計數(shù)模式、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溢出一次

參數(shù)auto re-load 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頁面左側(cè)功能分類欄目中點開NVIC欄目,然后選擇合適的中斷優(yōu)先級并勾選基本定時器6和7的中斷使能

4.2、生成代碼

請先閱讀“STM32CubeMX 工程建立”實驗3.4.3小節(jié)配置Project Manager

單擊頁面右上角GENERATE CODE生成工程

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溢出則翻轉(zhuǎn)GREEN_LED引腳狀態(tài),當定時器TIM7溢出則翻轉(zhuǎn)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、燒錄驗證

6.1、具體步驟

“激活基本定時器TIM6/7 -> 配置合適參數(shù)實現(xiàn)500ms/1s定時時間 -> 勾選TIM6/7全局中斷 -> 在生成的代碼中重新實現(xiàn)周期回調(diào)函數(shù)HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) -> 在該回調(diào)函數(shù)中判斷定時器溢出來源 -> 根據(jù)來源編程對應響應 -> 在主函數(shù)主循環(huán)前使用HAL_TIM_Base_Start_IT(&htim6/7)以中斷方式啟動定時器”

6.2、實驗現(xiàn)象

燒錄程序,觀察現(xiàn)象為綠燈每隔500ms狀態(tài)改變一次,紅燈每隔1s狀態(tài)改變一次

使用邏輯分析儀監(jiān)測PD12/14引腳狀態(tài),可以看出TIM6每500ms翻轉(zhuǎn)一次PD12引腳狀態(tài),TIM7每1000ms翻轉(zhuǎn)一次PD14引腳狀態(tài)

7、注釋詳解

注釋1:圖片來源STM32F407VGT6 Datasheet DS8626
注釋2:圖片來源STM32 CubeMX 學習:003-定時器(其原表有錯誤)
注釋3:圖片來源STM32F4xx中文參考手冊
注釋4:具體過程請參看 HAL_TIM_IRQHandler(TIM_HandleTypeDef *htim) 函數(shù)詳解

更多內(nèi)容請瀏覽 OSnotes的CSDN博客

總結(jié)

以上是生活随笔為你收集整理的STM32CubeMX教程5 TIM 定时器概述及基本定时器的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。