STM32CubeMX教程7 TIM 通用定时器 - 输入捕获
1、準(zhǔn)備材料
開(kāi)發(fā)板(STM32F407G-DISC1)
ST-LINK/V2驅(qū)動(dòng)
STM32CubeMX軟件(Version 6.10.0)
keil μVision5 IDE(MDK-Arm)
XCOM V2.6串口助手
杜邦線一根
2、實(shí)驗(yàn)?zāi)繕?biāo)
使用STM32CubeMX軟件配置STM32F407通用定時(shí)器TIM9為輸入捕獲模式,捕獲由上一實(shí)驗(yàn)輸出的可變占空比的PWM波型周期和占空比
3、實(shí)驗(yàn)流程
3.0、前提知識(shí)
該實(shí)驗(yàn)需要串口輸出PWM波形的周期和占空比信息,因此需要你知道如何簡(jiǎn)單使用串口,所以如果不知道如何使用請(qǐng)閱讀本系列教程“STM32CubeMX教程9 USART/UART 異步通信”實(shí)驗(yàn)
輸入捕捉的功能是記錄下要捕捉的邊沿出現(xiàn)的時(shí)刻,如果你僅僅捕捉下降沿,那么兩次捕捉的差表示輸入信號(hào)的周期,即兩次下降沿之間的時(shí)間。如果要測(cè)量低電平的寬度,你應(yīng)該在捕捉到下降沿的中斷處理中把捕捉邊沿改變?yōu)樯仙兀缓蟀褍纱尾蹲降臄?shù)值相減就得到了需要測(cè)量的低電平寬度(注釋1)
輸入捕獲有①I(mǎi)nput Capture direct mode和②Input Capture indirect mode兩種模式可選,但是在沒(méi)有通道 選擇 直接模式輸入捕獲時(shí),非直接模式的輸入捕獲是不可選擇的,這個(gè)也很好理解,直接模式輸入捕獲會(huì)將捕獲通道設(shè)置到某一個(gè)具體的引腳上,而非直接模式的輸入捕獲不會(huì)將捕獲通道設(shè)置到某一個(gè)具體的引腳上,而是使用和直接模式輸入捕獲同一引腳作為捕獲輸入
所有擁有2/4個(gè)捕獲/比較通道的通用定時(shí)器以Channel1/2、Channel3/4為兩組,每一組的兩個(gè)通道可以設(shè)置為①全部使用直接輸入捕獲模式、②一個(gè)通道直接輸入捕獲另一個(gè)通道非直接輸入捕獲 兩種模式,而剩下的只有1個(gè)捕獲/比較通道的通用定時(shí)器只能使用直接輸入捕獲模式
輸入捕獲中還有一個(gè)特殊模式,即PWM輸入模式,利用聯(lián)合通道 Combined Channels 可以直接測(cè)量出PWM波形的周期和占空比,非常方便,另外Combined Channels還可以選擇①編碼器模式、②通道1PWM輸入、③通道2PWM輸入和④傳感器XOR功能四種模式,模式②③均是使用的通用定時(shí)器的Channel1/2
3.1、CubeMX相關(guān)配置
請(qǐng)先閱讀“STM32CubeMX 工程建立”實(shí)驗(yàn)3.4.1小節(jié)配置RCC和SYS
3.1.1、時(shí)鐘樹(shù)配置
系統(tǒng)時(shí)鐘樹(shù)配置與上一實(shí)驗(yàn)一致,均設(shè)置為STM32F407總線能達(dá)到的最高時(shí)鐘頻率,具體如下圖所示
3.1.2、外設(shè)參數(shù)配置
本實(shí)驗(yàn)需要需要初始化USART2作為輸出信息渠道,具體配置步驟請(qǐng)閱讀“STM32CubeMX教程9 USART/UART 異步通信”
在Pinout & Configuration頁(yè)面右邊芯片引腳預(yù)覽Pinout view中找到PD12引腳,左鍵單擊將其設(shè)定為T(mén)IM4_CH1
然后在頁(yè)面左側(cè)功能分類欄目中點(diǎn)開(kāi)Timers欄目,單擊欄目下的TIM4,按照上一個(gè)實(shí)驗(yàn)的配置對(duì)通道1配置為PWM輸出
具體配置如下圖所示
然后單擊Timers欄目中的TIM9,配置其 Combined Channels 為通道1輸入捕獲/通道2輸入捕獲,這兩個(gè)選項(xiàng)除了通道對(duì)應(yīng)的引腳不同外,其余均一致,這里通道1對(duì)應(yīng)的是PE5,而通道2對(duì)應(yīng)的是PE6
接下來(lái)對(duì)頁(yè)面中間的 Combined Channels 兩個(gè)通道參數(shù)進(jìn)行配置,首先對(duì)于計(jì)數(shù)器參數(shù)的設(shè)置,如PSC、計(jì)數(shù)模式、ARR等之前的實(shí)驗(yàn)已有講解,在此不再說(shuō)明
然后對(duì)于通道1PWM輸入,其Input Trigger和從機(jī)模式控制器兩個(gè)參數(shù)選項(xiàng)唯一,不可設(shè)置
最后設(shè)置通道1的參數(shù)極性選擇上升沿,直接模式,通道2的參數(shù)極性只能選擇與通道1設(shè)置的相反,非直接模式,其他分頻和濾波不做設(shè)置,具體配置如下圖所示
為什么要這么設(shè)置?
當(dāng)配置為Combined Channels的PWM輸入模式時(shí),如果通道1設(shè)置為上升沿,則在PWM輸入引腳PE5檢測(cè)到輸入的PWM波第一個(gè)上升沿時(shí),會(huì)將當(dāng)前計(jì)數(shù)器CNT的值鎖存在TIM9_CCR1寄存器中,并且將寄存器復(fù)位,使CNT為0從這個(gè)上升沿重新開(kāi)始計(jì)數(shù),然后當(dāng)檢測(cè)到下降沿時(shí),會(huì)將當(dāng)前計(jì)數(shù)器CNT的值鎖存在TIM9_CCR2寄存器中,因此TIM9_CCR2寄存器中的值即為PWM波高電平持續(xù)的計(jì)數(shù)頻率次數(shù),然后再次遇到上升沿時(shí)重復(fù)上述過(guò)程,因此TIM9_CCR1寄存器中的值即為PWM波的周期
如下圖舉例所示
3.1.3、外設(shè)中斷配置
在Pinout & Configuration頁(yè)面左邊System Core/NVIC中勾選TIM9全局中斷,然后選擇合適的中斷優(yōu)先級(jí)即可
3.2、生成代碼
請(qǐng)先閱讀“STM32CubeMX 工程建立”實(shí)驗(yàn)3.4.3小節(jié)配置Project Manager
單擊頁(yè)面右上角GENERATE CODE生成工程
3.2.1、外設(shè)初始化函數(shù)調(diào)用流程
首先在生成的工程代碼主函數(shù)main()中調(diào)用了MX_TIM9_Init()函數(shù)完成了對(duì)TIM9基本定時(shí)器參數(shù),輸入捕獲通道1/2參數(shù)的配置
然后在HAL_TIM_IC_Init()函數(shù)中調(diào)用了HAL_TIM_IC_MspInit()函數(shù)對(duì)TIM9時(shí)鐘和中斷進(jìn)行了使能,并對(duì)中斷優(yōu)先級(jí)進(jìn)行了配置,最后對(duì)TIM9的兩個(gè)輸入捕獲通道引腳進(jìn)行了復(fù)用設(shè)置,從而完成了整個(gè)初始化過(guò)程
如下圖所示為T(mén)IM4輸出比較初始化的具體函數(shù)調(diào)用流程
3.2.2、外設(shè)中斷函數(shù)調(diào)用流程
使能定時(shí)器全局中斷后在stm32f4xx_it.c中自動(dòng)生成了TIM9的中斷處理函數(shù)TIM1_BRK_TIM9_IRQHandler()
TIM1_BRK_TIM9_IRQHandler()函數(shù)調(diào)用了HAL庫(kù)的定時(shí)器中斷處理函數(shù)HAL_TIM_IRQHandler(),這個(gè)函數(shù)負(fù)責(zé)處理所有的定時(shí)器相關(guān)中斷
通過(guò)判斷中斷來(lái)源及相關(guān)寄存器,最終調(diào)用輸入捕獲事件完成的回調(diào)函數(shù)為HAL_TIM_IC_CaptureCallback(),該函數(shù)為虛函數(shù),需要用戶重新實(shí)現(xiàn)
如下圖所示為T(mén)IM9輸入捕獲中斷回調(diào)的具體函數(shù)調(diào)用流程
3.2.3、添加其他必要代碼
在tim.c中重新實(shí)現(xiàn)輸入捕獲中斷回調(diào)函數(shù)HAL_TIM_IC_CaptureCallback(),當(dāng)捕獲到上升沿/下降沿時(shí)會(huì)進(jìn)入該中斷回調(diào)函數(shù)中,然后讀取TIM9_CCR1寄存器的值,該值即為PWM波形周期,然后讀取TIM9_CCR2寄存器的值,該值即為PWM波形高電平持續(xù)計(jì)數(shù)值,具體代碼如下圖所示
源代碼如下所示
/*輸入捕獲中斷回調(diào)函數(shù)*/
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);
}
在主函數(shù)中啟動(dòng)通用定時(shí)器TIM4的PWM輸出,以中斷的方式啟動(dòng)通用定時(shí)器TIM9,并啟動(dòng)其通道1/2的輸入捕獲,最后在主函數(shù)主循環(huán)中輪詢按鍵,當(dāng)按鍵按下時(shí)更改通用定時(shí)器TIM4的PWM輸出占空比即可,如下圖所示為具體代碼
源代碼如下所示
/*主函數(shù)外變量定義*/
uint16_t pulseWidth=0;
uint8_t dirInc=1;
/*主循環(huán)外啟動(dòng)代碼*/
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);
/*主循環(huán)內(nèi)代碼*/
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,因此需要一根杜邦線將開(kāi)發(fā)板上的PD12和PE5短接
4、常用函數(shù)
/*啟動(dòng)輸入捕獲*/
HAL_StatusTypeDef HAL_TIM_IC_Start(TIM_HandleTypeDef *htim, uint32_t Channel)
/*停止輸入捕獲*/
HAL_StatusTypeDef HAL_TIM_IC_Stop(TIM_HandleTypeDef *htim, uint32_t Channel)
/*以中斷方式啟動(dòng)輸入捕獲*/
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)
/*輸入捕獲回調(diào)函數(shù)*/
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
5、燒錄驗(yàn)證
5.1、具體步驟
“配置TIM4定時(shí)器通道1輸出PWM波 -> 配置TIM9定時(shí)器Combined Channels為PWM輸入在通道1 -> 設(shè)置PWM輸入相關(guān)參數(shù) -> 勾選啟動(dòng)TIM9輸入PWM捕獲中斷并設(shè)置合適的 -> 重新實(shí)現(xiàn)輸入捕獲中斷回調(diào)函數(shù)HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) -> 使用__HAL_TIM_GET_COMPARE(&htim9,TIM_CHANNEL_1/2)獲取捕獲到的PWM波形的周期和占空比 -> 主函數(shù)中使用HAL_TIM_Base_Start_IT(&htim9)以中斷方式啟動(dòng)定時(shí)器 -> 然后使用HAL_TIM_IC_Start_IT(&htim9, TIM_CHANNEL_1/2)以中斷方式啟動(dòng)輸入捕獲 -> 主循環(huán)中實(shí)現(xiàn)按鍵設(shè)置PWM輸出占空比”
5.2、實(shí)驗(yàn)現(xiàn)象
燒錄程序,開(kāi)發(fā)板上電后打開(kāi)串口,串口會(huì)不斷的輸出當(dāng)前測(cè)量到的PWM波形周期為固定的199,然后按下用戶按鍵USER_KEY會(huì)發(fā)現(xiàn),輸出的PWM波形的占空比不停變化,變化規(guī)律和上一個(gè)實(shí)驗(yàn)中LED呼吸燈變化情況一致,同時(shí)還可以觀察到GREEN_LED的亮度不斷地變化,下圖為串口輸出的詳細(xì)信息
6、注釋詳解
注釋1:請(qǐng)閱讀在針對(duì)計(jì)數(shù)功能中,Input Capture direct mode和IO中斷有什么區(qū)別 (stmicroelectronics.cn)
參考資料
STM32Cube高效開(kāi)發(fā)教程(基礎(chǔ)篇)
更多內(nèi)容請(qǐng)瀏覽 OSnotes的CSDN博客
總結(jié)
以上是生活随笔為你收集整理的STM32CubeMX教程7 TIM 通用定时器 - 输入捕获的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 简易机器学习笔记(十)Windows下
- 下一篇: Android对接华为AI - 文本识别