本篇筆記主要探討 MM32F0140 定時器模塊的框圖結(jié)構(gòu)、定時器提供的計數(shù)定時等功能以及配置定時器的流程,并以 pokt-f0140 開發(fā)板作為實(shí)際演示平臺,使用開發(fā)板上 32 位定時器 TIM2 進(jìn)行 pwm 波輸出實(shí)驗(yàn)。
TIM 功能描述
MM32F0140 TIM 最基本的功能為計數(shù)定時,此功能依靠定時器內(nèi)部的預(yù)分頻器 PSC 、計數(shù)器 CNT 和 自動預(yù)裝載寄存器 ARR 合作完成。此外,定時器如有輸入輸出通道,則還能提供輸入捕獲、比較輸出和從模式輸入等功能。在此之上,對于擁有額外剎車輸入通道的高級定時器而言,還可提供剎車和死區(qū)設(shè)置。
TIM 框圖
下圖1 為 MM32F0140 高級定時器的結(jié)構(gòu)框圖,各部分支持不同的功能。其中:
紅框支持最基本的計數(shù)定時功能。計數(shù)器、預(yù)分頻器和自動預(yù)裝載器也被稱為定時器的時基單元。預(yù)分頻器 PSC 將輸入的時鐘信號進(jìn)行分頻,計數(shù)器 CNT 對分頻信號進(jìn)行計數(shù)。計數(shù)器值和自動預(yù)裝載寄存器 ARR 值進(jìn)行比較,發(fā)生上溢或下溢時,則表明完成一次周期計數(shù),周期值為 ARR 寄存器寫入值,頻率為輸入時鐘源經(jīng)過 PSC 預(yù)分頻器分頻后頻率。
灰框支持從模式輸入功能。除內(nèi)部時鐘外,定時器模塊可以通過配置從模式,選擇來自外部輸入引腳 TI1 或 TI2 的輸入信號或 ETR 引腳信號或其他定時器的 ITRx 信號作為時鐘輸入源。
綠框支持輸入捕獲功能。當(dāng)通道 x 配置為輸入捕獲模式時,通道 x 的輸入信號依次經(jīng)過濾波、邊沿檢測以及分頻,觸發(fā)通道 x 捕獲事件。定時器模塊會將當(dāng)前計數(shù)器計數(shù)值寫入對應(yīng)通道的捕獲/比較寄存器 CCRx 中。
藍(lán)框支持比較輸出功能。當(dāng)通道 x 配置為比較輸出模式時,定時器將當(dāng)前計數(shù)器值與通道 x 捕獲/比較寄存器 CCRx 中值進(jìn)行比較,相等時定時器將改變通道 x 的參考輸出電壓 REF。
黑框支持剎車功能,當(dāng) BKIN 通道有指定剎車信號出現(xiàn)時,各路輸出通道將輸出預(yù)設(shè)的空閑輸出電壓。
圖1. MM32F0140 高級定時器框圖
下文將詳細(xì)敘述定時器的計數(shù)定時、輸入捕獲和比較輸出這三個主要功能。
計數(shù)定時
計數(shù)定時即計數(shù)器使能后,在一定計數(shù)頻率下進(jìn)行計數(shù)。根據(jù)設(shè)置的計數(shù)方向,計數(shù)器完成周期次計數(shù)后,定時器觸發(fā)更新中斷。
計數(shù)器頻率計算
設(shè)定時器輸入頻率為 clk_frq,預(yù)分頻器分頻值為 psc,則計數(shù)器頻率 cnt_frq 為
計數(shù)器計數(shù)方向
MM32F0140 定時器中 TIM14、TIM16 和 TIM17 僅提供向上計數(shù)。其余定時器可以提供以下三種可選計數(shù)方向:
向上計數(shù),計數(shù)器從 0 開始向上計數(shù),遞增到 ARR 自動預(yù)裝載寄存器值后,計數(shù)器產(chǎn)生上溢事件。定時器產(chǎn)生一個更新事件,計數(shù)器又從 0 開始計數(shù)。
向下計數(shù),計數(shù)器從 ARR 自動預(yù)裝載寄存器值開始向下計數(shù),遞減到 0 后,計數(shù)器產(chǎn)生下溢事件。定時器產(chǎn)生一個更新事件,計數(shù)器又從 ARR 自動預(yù)裝載寄存器值開始計數(shù)。
先向上計數(shù)再向下計數(shù)。計數(shù)器從 0 開始向上計數(shù),遞增到 ARR 自動預(yù)裝載寄存器值后,計數(shù)器產(chǎn)生上溢事件。定時器產(chǎn)生一個更新事件。然后計數(shù)器從 ARR 自動預(yù)裝載寄存器值開始向下計數(shù),遞減到 0 后,計數(shù)器產(chǎn)生下溢事件。定時器再產(chǎn)生一個更新事件。
圖2 定時器向上計數(shù)
如圖2 所示,定時器輸入時鐘即分頻器時鐘 CK_PSC,預(yù)分頻器 PSC 值為 1 ,即定時器頻率為 CK_PSC 的二分頻頻率。定時器自動裝載值 ARR 為 5,從圖中可見計數(shù)器 CNT 達(dá)到 5 時,產(chǎn)生一個更新事件 UEV。
定時器周期長度
ARR 自動預(yù)裝載寄存器的值為定時器周期長度,決定定時器計數(shù)多少次后產(chǎn)生一個更新事件。
比較輸出
如圖3 所示,定時器比較輸出功能通過計數(shù)器、通道 x 的捕獲/比較寄存器 CCRx 以及輸出控制電路實(shí)現(xiàn)。定時器將計數(shù)器和捕獲/比較寄存器 CCRx 值實(shí)時比較,當(dāng)二值相等時會改變通道 x 的參考輸出電壓 REF,參考輸出電壓 REF 和輸出控制電路共同決定通道 x 的實(shí)際電壓值。
圖3 MM32F0140 定時器輸出通道1示意圖
比較輸出匹配值
輸出通道x 對應(yīng)的 CCRx 寄存器值為比較輸出匹配值,定時器將在計數(shù)器值和通道 x 的匹配值相等時,根據(jù)比較輸出模式,改變通道 x 的參考輸出電壓REF。
比較輸出模式選擇
MM32 F0140 的 TIM 模塊一共有 7 種比較輸出模式:
匹配結(jié)果對于參考輸出電壓 REF 沒有影響。
匹配時將參考輸出電壓 REF 設(shè)為高電平。
匹配時將參考輸出電壓 REF 設(shè)為低電平。
匹配時翻轉(zhuǎn)參考輸出電壓 REF。
強(qiáng)制參考輸出電壓 REF為低電平。
強(qiáng)制參考輸出電壓 REF為高電平。
PWM模式1:當(dāng)計數(shù)值小于匹配值時,參考電壓REF為高電平,否則為低電平。
PWM模式2:當(dāng)計數(shù)值小于匹配值時,參考電壓REF為低電平,否則為高電平。
參考輸出電壓和實(shí)際輸出電壓間關(guān)系
定時器 CCER[CCxP] 位決定了參考輸出電壓和實(shí)際輸出電壓間關(guān)系,具體可見表1。CCER[CCxP]值為0表示高電平有效,為1表示低電平有效。
表1 CCER[CCxP]值對實(shí)際輸出電壓的影響
如下圖 4 所示,通道1的比較值為1,當(dāng)計數(shù)器值小于1時,通道1的比較輸出電壓 OC1REF 為高;當(dāng)計數(shù)器值等于1時,通道1 的比較輸出電壓 OC1REF 拉低,產(chǎn)生一個下降沿。OC1REF 將一直保持為低,直到定時器更新事件發(fā)生,計數(shù)器從 0 開始計數(shù)時,OC1REF 又被拉高。
圖4 遞增計數(shù)下PWM模式1時輸出通道參考電壓
輸入捕獲
如圖5 所示,輸入通道 x 的輸入信號 TIx 經(jīng)過濾波器、邊沿檢測、分頻以后被定時器捕獲,定時器將輸入捕獲時刻的計數(shù)器值寫入相應(yīng)通道的捕獲/比較寄存器 CCRx 中。
圖5 MM32F0140輸入捕獲框圖
計數(shù)定時配置
時基配置
配置定時器工作模式
配置 CR1[OPM] 位可以設(shè)置定時器工作模式,其中值為 0 表示定時器將循環(huán)計時,值為 1 表示計時 1 次后就停止計數(shù)器。
配置是否預(yù)裝載
配置 CR1[ARPE] 位可以配置定時器自動預(yù)裝載寄存器 ARR 的實(shí)際更新方式,值為1則用戶寫入 ARR 寄存器的值會在下一次計數(shù)器更新時起效,否則立刻生效。
配置計數(shù)模式
配置 CR1[DIR] 位和 CR1[CMS] 位可以配置計數(shù)器計數(shù)模式。如果選擇單向計數(shù),CR1[CMS]需配置為 0,此時CR1[DIR] 配置為 0 時,向上計數(shù),配置為 1 時向下計數(shù)。如果選擇先向上計數(shù)再向下計數(shù),則需要配置 CR1[CMS],CR1[DIR] 值保持為 0。
配置預(yù)分頻值
由上述計數(shù)器頻率計算小結(jié)可知,如果需要定時器頻率為 cnt_frq, 定時器輸入源頻率為 clk_frq,定時器的預(yù)分頻值 psc 應(yīng)為
計算出的 psc 值寫入 PSC 寄存器。
配置自動預(yù)裝載寄存器 ARR
自動預(yù)裝載寄存器 ARR 的值決定定時器周期計數(shù)次數(shù)。假如定時器向上計數(shù),則計數(shù)器從 0 遞增到 ARR 值,即 ARR 寄存器值為 arrv,則實(shí)際計數(shù)器一個周期內(nèi)會做arrv+1 次計數(shù),所以ARR 寄存器值應(yīng)為需要的周期計數(shù)值減一。將此值寫入 ARR 寄存器。
使能計數(shù)器
完成上述配置后,將 CR1[CEN] 置為 1 即可啟動計數(shù)器計數(shù)。當(dāng)不需要計數(shù)時,將此位設(shè)置為 0。
比較輸出配置
配置通道輸出模式
配置 CCMRy[CCxS] 位為 0,可以將通道 x 配置為輸出模式。
配置是否預(yù)裝載匹配值
配置 CCMRy[OCxPE] 位可以設(shè)置通道 x 的比較輸出匹配值生效方式,為 0 則一旦寫入立刻生效,否則匹配值將在下一次更新事件后生效。
配置比較輸出模式
配置 CCMRy[OCxM] 字段可以選擇不同的比較輸出模式,具體字段值和比較輸出模式間關(guān)系可見表3。
表3 CCMRy[OCxM] 與 比較輸出模式間對應(yīng)關(guān)系
配置有效輸出電壓
配置 CCER[CCxP] 位,可以設(shè)置通道 x 的有效輸出電壓。值為0,則參考電壓的高電平為有效電平;值為1,則參考電壓的低電平為有效電平。
使能通道輸出
配置 CCER[CCxE] 位為1,使能通道輸出功能;配置為 0,則關(guān)閉通道輸出功能。
輸入捕獲配置
配置通道輸入模式
配置 CCMRy[CCxS] 位為1,可將通道 x 配置為輸入模式。
配置輸入信號邊沿選擇
配置 CCER[CCxP] 和 CCER[CCxNP] 位,可以配置輸入信號的有效邊沿選擇,具體對應(yīng)關(guān)系如表4。
表4 輸入模式下,CCER[CCxP]和CCER[CCxNP]
對于輸入邊沿影響
配置采樣和濾波
配置 CCMRy[ICxF] 字段,設(shè)置通道 x 的輸入捕獲濾波器。
配置預(yù)分頻器
配置 CCMRy[IC1PSC] 字段,設(shè)置通道 x 輸入信號的預(yù)分頻值。
使能通道輸入
配置 CCER[CCxE] 位為 1,使能通道輸入捕獲功能;配置為 0,則關(guān)閉通道輸入捕獲功能。
樣例
pokt-f0140 開發(fā)板 定時器實(shí)現(xiàn)TIM2通道1輸出pwm波
在 SDK 中已有支持的 pokt-f0140 開發(fā)板上,在 tim_32b_0 樣例工程中,通過 tim_32b_output_compare_pwm 可以使用定時器 TIM2 的通道 1 輸出 pwm 波。
時鐘初始化
TIM2 在 APB2 總線上,需要使能時鐘。TIM2 的通道 1 復(fù)用 PA0 引腳,需要使能 GPIOA 時鐘。
/* Enable TIM. */RCC_EnableAPB1Periphs(RCC_APB1_PERIPH_TIM2, true);RCC_ResetAPB1Periphs(RCC_APB1_PERIPH_TIM2);/* Enable GPIOA for TIM2_CH1. */RCC_EnableAHB1Periphs(RCC_AHB1_PERIPH_GPIOA, true);RCC_ResetAHB1Periphs(RCC_AHB1_PERIPH_GPIOA);
初始化輸出引腳
GPIO_Init_Type gpio_init;gpio_init.Pins = GPIO_PIN_0;gpio_init.PinMode = GPIO_PinMode_AF_PushPull;gpio_init.Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &gpio_init);GPIO_PinAFConf(GPIOA, gpio_init.Pins, GPIO_AF_2);/* 根據(jù)data sheet, 配置復(fù)用模式2。 */
定時器時基配置
TIM_32B_Init_Type tim_init;tim_init.ClockFreqHz = BOARD_TIM_32B_FREQ;/* 因?yàn)?TIM_32B 在APB2總線上,所以BOARD_TIM_32B_FREQ的值實(shí)際為APB2總線時鐘頻率。*/tim_init.StepFreqHz = APP_TIM_UPDATE_PERIOD; /* 定時器周期時長為定時器周期長度Period加1后除定時器頻率StepFreqHz。*/tim_init.Period = APP_TIM_UPDATE_PERIOD - 1u; /* 所以可得值為1,也即定時器周期時長為1s。 */tim_init.EnablePreloadPeriod = false; /* 不采用預(yù)裝載,修改ARR寄存器將立即生效。 */tim_init.PeriodMode = TIM_32B_PeriodMode_Continuous;/* 循環(huán)計時。 */tim_init.CountMode = TIM_32B_CountMode_Increase; /* 遞增計數(shù)。 */TIM_32B_Init(BOARD_TIM_32B_PORT, &tim_init);
配置輸出通道
TIM_32B_OutputCompareConf_Type tim_outcomp_conf;tim_outcomp_conf.ChannelValue = 0u;/* Compare value initialize with 0. */tim_outcomp_conf.EnableFastOutput = false; /* Disable fast output. */tim_outcomp_conf.EnablePreLoadChannelValue = false; /* Disable preload, put data immediately. */tim_outcomp_conf.RefOutMode = TIM_32B_OutputCompareRefOut_FallingEdgeOnMatch;/*Generate a falling edge when matched.*/tim_outcomp_conf.ClearRefOutOnExtTrigger = false; /* Ext signal won't clear output. */tim_outcomp_conf.PinPolarity = TIM_32B_PinPolarity_Rising;/* High polarity is valid. */TIM_32B_EnableOutputCompare(BOARD_TIM_32B_PORT, BOARD_TIM_32B_CHANNEL, &tim_outcomp_conf);
使能計數(shù)器
TIM_32B_Start(BOARD_TIM_32B_PORT);
main 函數(shù)
main 函數(shù)將輪詢鍵入,并按設(shè)定的占空比數(shù)組循環(huán)輸出不同的 PWM 波。
int main(void){ BOARD_Init(); printf("\r\ntim_32b_output_compare_pwm.\r\n"); /* Setup the timer. */ app_tim_32b_init(); printf("press any key to change the pwm ...\r\n"); while (1) { for (uint32_t i = 0; i < APP_TIM_32B_PWM_NUM; i++) { getchar(); TIM_32B_PutChannelValue(BOARD_TIM_32B_PORT, BOARD_TIM_32B_CHANNEL, app_tim_32_pwm_val[i]);/* Change duty cycle. */ printf("PWM value: %u\r\n", (unsigned)app_tim_32_pwm_val[i]); } }}
審核編輯:彭菁
-
寄存器
+關(guān)注
關(guān)注
31文章
5435瀏覽量
124604 -
分頻器
+關(guān)注
關(guān)注
43文章
492瀏覽量
51185 -
定時器
+關(guān)注
關(guān)注
23文章
3300瀏覽量
119032 -
MM32
+關(guān)注
關(guān)注
1文章
108瀏覽量
1111
發(fā)布評論請先 登錄
評論