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

歡迎訪問 生活随笔!

生活随笔

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

windows

STM32CubeMX教程7 TIM 通用定时器 - 输入捕获

發布時間:2024/1/8 windows 40 coder
生活随笔 收集整理的這篇文章主要介紹了 STM32CubeMX教程7 TIM 通用定时器 - 输入捕获 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1、準備材料

開發板(STM32F407G-DISC1)
ST-LINK/V2驅動
STM32CubeMX軟件(Version 6.10.0)
keil μVision5 IDE(MDK-Arm)
XCOM V2.6串口助手
杜邦線一根

2、實驗目標

使用STM32CubeMX軟件配置STM32F407通用定時器TIM9為輸入捕獲模式,捕獲由上一實驗輸出的可變占空比的PWM波型周期和占空比

3、實驗流程

3.0、前提知識

該實驗需要串口輸出PWM波形的周期和占空比信息,因此需要你知道如何簡單使用串口,所以如果不知道如何使用請閱讀本系列教程“STM32CubeMX教程9 USART/UART 異步通信”實驗

輸入捕捉的功能是記錄下要捕捉的邊沿出現的時刻,如果你僅僅捕捉下降沿,那么兩次捕捉的差表示輸入信號的周期,即兩次下降沿之間的時間。如果要測量低電平的寬度,你應該在捕捉到下降沿的中斷處理中把捕捉邊沿改變為上升沿,然后把兩次捕捉的數值相減就得到了需要測量的低電平寬度(注釋1)

輸入捕獲有①Input Capture direct mode和②Input Capture indirect mode兩種模式可選,但是在沒有通道 選擇 直接模式輸入捕獲時,非直接模式的輸入捕獲是不可選擇的,這個也很好理解,直接模式輸入捕獲會將捕獲通道設置到某一個具體的引腳上,而非直接模式的輸入捕獲不會將捕獲通道設置到某一個具體的引腳上,而是使用和直接模式輸入捕獲同一引腳作為捕獲輸入

所有擁有2/4個捕獲/比較通道的通用定時器以Channel1/2、Channel3/4為兩組,每一組的兩個通道可以設置為①全部使用直接輸入捕獲模式、②一個通道直接輸入捕獲另一個通道非直接輸入捕獲 兩種模式,而剩下的只有1個捕獲/比較通道的通用定時器只能使用直接輸入捕獲模式

輸入捕獲中還有一個特殊模式,即PWM輸入模式,利用聯合通道 Combined Channels 可以直接測量出PWM波形的周期和占空比,非常方便,另外Combined Channels還可以選擇①編碼器模式、②通道1PWM輸入、③通道2PWM輸入和④傳感器XOR功能四種模式,模式②③均是使用的通用定時器的Channel1/2

3.1、CubeMX相關配置

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

3.1.1、時鐘樹配置

系統時鐘樹配置與上一實驗一致,均設置為STM32F407總線能達到的最高時鐘頻率,具體如下圖所示

3.1.2、外設參數配置

本實驗需要需要初始化USART2作為輸出信息渠道,具體配置步驟請閱讀“STM32CubeMX教程9 USART/UART 異步通信”

在Pinout & Configuration頁面右邊芯片引腳預覽Pinout view中找到PD12引腳,左鍵單擊將其設定為TIM4_CH1

然后在頁面左側功能分類欄目中點開Timers欄目,單擊欄目下的TIM4,按照上一個實驗的配置對通道1配置為PWM輸出

具體配置如下圖所示

然后單擊Timers欄目中的TIM9,配置其 Combined Channels 為通道1輸入捕獲/通道2輸入捕獲,這兩個選項除了通道對應的引腳不同外,其余均一致,這里通道1對應的是PE5,而通道2對應的是PE6

接下來對頁面中間的 Combined Channels 兩個通道參數進行配置,首先對于計數器參數的設置,如PSC、計數模式、ARR等之前的實驗已有講解,在此不再說明

然后對于通道1PWM輸入,其Input Trigger和從機模式控制器兩個參數選項唯一,不可設置

最后設置通道1的參數極性選擇上升沿,直接模式,通道2的參數極性只能選擇與通道1設置的相反,非直接模式,其他分頻和濾波不做設置,具體配置如下圖所示

為什么要這么設置?

當配置為Combined Channels的PWM輸入模式時,如果通道1設置為上升沿,則在PWM輸入引腳PE5檢測到輸入的PWM波第一個上升沿時,會將當前計數器CNT的值鎖存在TIM9_CCR1寄存器中,并且將寄存器復位,使CNT為0從這個上升沿重新開始計數,然后當檢測到下降沿時,會將當前計數器CNT的值鎖存在TIM9_CCR2寄存器中,因此TIM9_CCR2寄存器中的值即為PWM波高電平持續的計數頻率次數,然后再次遇到上升沿時重復上述過程,因此TIM9_CCR1寄存器中的值即為PWM波的周期

如下圖舉例所示

3.1.3、外設中斷配置

在Pinout & Configuration頁面左邊System Core/NVIC中勾選TIM9全局中斷,然后選擇合適的中斷優先級即可

3.2、生成代碼

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

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

3.2.1、外設初始化函數調用流程

首先在生成的工程代碼主函數main()中調用了MX_TIM9_Init()函數完成了對TIM9基本定時器參數,輸入捕獲通道1/2參數的配置

然后在HAL_TIM_IC_Init()函數中調用了HAL_TIM_IC_MspInit()函數對TIM9時鐘和中斷進行了使能,并對中斷優先級進行了配置,最后對TIM9的兩個輸入捕獲通道引腳進行了復用設置,從而完成了整個初始化過程

如下圖所示為TIM4輸出比較初始化的具體函數調用流程

3.2.2、外設中斷函數調用流程

使能定時器全局中斷后在stm32f4xx_it.c中自動生成了TIM9的中斷處理函數TIM1_BRK_TIM9_IRQHandler()

TIM1_BRK_TIM9_IRQHandler()函數調用了HAL庫的定時器中斷處理函數HAL_TIM_IRQHandler(),這個函數負責處理所有的定時器相關中斷

通過判斷中斷來源及相關寄存器,最終調用輸入捕獲事件完成的回調函數為HAL_TIM_IC_CaptureCallback(),該函數為虛函數,需要用戶重新實現

如下圖所示為TIM9輸入捕獲中斷回調的具體函數調用流程

3.2.3、添加其他必要代碼

在tim.c中重新實現輸入捕獲中斷回調函數HAL_TIM_IC_CaptureCallback(),當捕獲到上升沿/下降沿時會進入該中斷回調函數中,然后讀取TIM9_CCR1寄存器的值,該值即為PWM波形周期,然后讀取TIM9_CCR2寄存器的值,該值即為PWM波形高電平持續計數值,具體代碼如下圖所示

源代碼如下所示

/*輸入捕獲中斷回調函數*/
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
    uint16_t IC1_Width = __HAL_TIM_GET_COMPARE(&htim9,TIM_CHANNEL_1);
    uint16_t IC2_Pulse = __HAL_TIM_GET_COMPARE(&htim9,TIM_CHANNEL_2);
    if((IC1_Width==0) || (IC2_Pulse==0))
        return;
 
    printf("IC1_Width:%d,IC2_Pulse:%d\r\n", IC1_Width, IC2_Pulse);
}

在主函數中啟動通用定時器TIM4的PWM輸出,以中斷的方式啟動通用定時器TIM9,并啟動其通道1/2的輸入捕獲,最后在主函數主循環中輪詢按鍵,當按鍵按下時更改通用定時器TIM4的PWM輸出占空比即可,如下圖所示為具體代碼

源代碼如下所示

/*主函數外變量定義*/
uint16_t pulseWidth=0;
uint8_t dirInc=1;
 
/*主循環外啟動代碼*/
HAL_TIM_Base_Start(&htim4);
HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_1);
HAL_TIM_Base_Start_IT(&htim9);
HAL_TIM_IC_Start_IT(&htim9, TIM_CHANNEL_1);
HAL_TIM_IC_Start_IT(&htim9, TIM_CHANNEL_2);
 
/*主循環內代碼*/
while(1)
{
    /* USER CODE BEGIN 3 */
    if(htim->Instance != TIM4)
        return;
    
    if(dirInc == 1)	
    {
        pulseWidth ++;
        if(pulseWidth >= 195)
        {
            pulseWidth = 195;
            dirInc = 0;	
        }
    }
    else
    {
        pulseWidth --;
        if(pulseWidth <= 5)
        {
            pulseWidth = 5;
            dirInc = 1;	
        }
    }
    __HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_1, pulseWidth);
}

值得提醒的是我們的PWM波輸出引腳為PD12,而我們PWM輸入捕獲引腳為PE5,因此需要一根杜邦線將開發板上的PD12和PE5短接

4、常用函數

/*啟動輸入捕獲*/
HAL_StatusTypeDef HAL_TIM_IC_Start(TIM_HandleTypeDef *htim, uint32_t Channel)
 
/*停止輸入捕獲*/
HAL_StatusTypeDef HAL_TIM_IC_Stop(TIM_HandleTypeDef *htim, uint32_t Channel)
 
/*以中斷方式啟動輸入捕獲*/
HAL_StatusTypeDef HAL_TIM_IC_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel)
 
/*停止以中斷方式的輸入捕獲*/
HAL_StatusTypeDef HAL_TIM_IC_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel)
 
/*輸入捕獲回調函數*/
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)

5、燒錄驗證

5.1、具體步驟

“配置TIM4定時器通道1輸出PWM波 -> 配置TIM9定時器Combined Channels為PWM輸入在通道1 -> 設置PWM輸入相關參數 -> 勾選啟動TIM9輸入PWM捕獲中斷并設置合適的 -> 重新實現輸入捕獲中斷回調函數HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) -> 使用__HAL_TIM_GET_COMPARE(&htim9,TIM_CHANNEL_1/2)獲取捕獲到的PWM波形的周期和占空比 -> 主函數中使用HAL_TIM_Base_Start_IT(&htim9)以中斷方式啟動定時器 -> 然后使用HAL_TIM_IC_Start_IT(&htim9, TIM_CHANNEL_1/2)以中斷方式啟動輸入捕獲 -> 主循環中實現按鍵設置PWM輸出占空比”

5.2、實驗現象

燒錄程序,開發板上電后打開串口,串口會不斷的輸出當前測量到的PWM波形周期為固定的199,然后按下用戶按鍵USER_KEY會發現,輸出的PWM波形的占空比不停變化,變化規律和上一個實驗中LED呼吸燈變化情況一致,同時還可以觀察到GREEN_LED的亮度不斷地變化,下圖為串口輸出的詳細信息

6、注釋詳解

注釋1:請閱讀在針對計數功能中,Input Capture direct mode和IO中斷有什么區別 (stmicroelectronics.cn)

參考資料

STM32Cube高效開發教程(基礎篇)

更多內容請瀏覽 OSnotes的CSDN博客

總結

以上是生活随笔為你收集整理的STM32CubeMX教程7 TIM 通用定时器 - 输入捕获的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。