本篇筆記主要探討 MM32F0140 定時(shí)器模塊的框圖結(jié)構(gòu)、定時(shí)器提供的計(jì)數(shù)定時(shí)等功能以及配置定時(shí)器的流程,并以 pokt-f0140 開發(fā)板作為實(shí)際演示平臺(tái),使用開發(fā)板上 32 位定時(shí)器 TIM2 進(jìn)行 pwm 波輸出實(shí)驗(yàn)。
TIM 功能描述
MM32F0140 TIM 最基本的功能為計(jì)數(shù)定時(shí),此功能依靠定時(shí)器內(nèi)部的預(yù)分頻器 PSC 、計(jì)數(shù)器 CNT 和 自動(dòng)預(yù)裝載寄存器 ARR 合作完成。此外,定時(shí)器如有輸入輸出通道,則還能提供輸入捕獲、比較輸出和從模式輸入等功能。在此之上,對(duì)于擁有額外剎車輸入通道的高級(jí)定時(shí)器而言,還可提供剎車和死區(qū)設(shè)置。
TIM 框圖
下圖1 為 MM32F0140 高級(jí)定時(shí)器的結(jié)構(gòu)框圖,各部分支持不同的功能。其中:
紅框支持最基本的計(jì)數(shù)定時(shí)功能。計(jì)數(shù)器、預(yù)分頻器和自動(dòng)預(yù)裝載器也被稱為定時(shí)器的時(shí)基單元。預(yù)分頻器 PSC 將輸入的時(shí)鐘信號(hào)進(jìn)行分頻,計(jì)數(shù)器 CNT 對(duì)分頻信號(hào)進(jìn)行計(jì)數(shù)。計(jì)數(shù)器值和自動(dòng)預(yù)裝載寄存器 ARR 值進(jìn)行比較,發(fā)生上溢或下溢時(shí),則表明完成一次周期計(jì)數(shù),周期值為 ARR 寄存器寫入值,頻率為輸入時(shí)鐘源經(jīng)過 PSC 預(yù)分頻器分頻后頻率。
灰框支持從模式輸入功能。除內(nèi)部時(shí)鐘外,定時(shí)器模塊可以通過配置從模式,選擇來自外部輸入引腳 TI1 或 TI2 的輸入信號(hào)或 ETR 引腳信號(hào)或其他定時(shí)器的 ITRx 信號(hào)作為時(shí)鐘輸入源。
綠框支持輸入捕獲功能。當(dāng)通道 x 配置為輸入捕獲模式時(shí),通道 x 的輸入信號(hào)依次經(jīng)過濾波、邊沿檢測(cè)以及分頻,觸發(fā)通道 x 捕獲事件。定時(shí)器模塊會(huì)將當(dāng)前計(jì)數(shù)器計(jì)數(shù)值寫入對(duì)應(yīng)通道的捕獲/比較寄存器 CCRx 中。
藍(lán)框支持比較輸出功能。當(dāng)通道 x 配置為比較輸出模式時(shí),定時(shí)器將當(dāng)前計(jì)數(shù)器值與通道 x 捕獲/比較寄存器 CCRx 中值進(jìn)行比較,相等時(shí)定時(shí)器將改變通道 x 的參考輸出電壓 REF。
黑框支持剎車功能,當(dāng) BKIN 通道有指定剎車信號(hào)出現(xiàn)時(shí),各路輸出通道將輸出預(yù)設(shè)的空閑輸出電壓。
圖1. MM32F0140 高級(jí)定時(shí)器框圖
下文將詳細(xì)敘述定時(shí)器的計(jì)數(shù)定時(shí)、輸入捕獲和比較輸出這三個(gè)主要功能。
計(jì)數(shù)定時(shí)
計(jì)數(shù)定時(shí)即計(jì)數(shù)器使能后,在一定計(jì)數(shù)頻率下進(jìn)行計(jì)數(shù)。根據(jù)設(shè)置的計(jì)數(shù)方向,計(jì)數(shù)器完成周期次計(jì)數(shù)后,定時(shí)器觸發(fā)更新中斷。
計(jì)數(shù)器頻率計(jì)算
設(shè)定時(shí)器輸入頻率為 clk_frq,預(yù)分頻器分頻值為 psc,則計(jì)數(shù)器頻率 cnt_frq 為
計(jì)數(shù)器計(jì)數(shù)方向
MM32F0140 定時(shí)器中 TIM14、TIM16 和 TIM17 僅提供向上計(jì)數(shù)。其余定時(shí)器可以提供以下三種可選計(jì)數(shù)方向:
向上計(jì)數(shù),計(jì)數(shù)器從 0 開始向上計(jì)數(shù),遞增到 ARR 自動(dòng)預(yù)裝載寄存器值后,計(jì)數(shù)器產(chǎn)生上溢事件。定時(shí)器產(chǎn)生一個(gè)更新事件,計(jì)數(shù)器又從 0 開始計(jì)數(shù)。
向下計(jì)數(shù),計(jì)數(shù)器從 ARR 自動(dòng)預(yù)裝載寄存器值開始向下計(jì)數(shù),遞減到 0 后,計(jì)數(shù)器產(chǎn)生下溢事件。定時(shí)器產(chǎn)生一個(gè)更新事件,計(jì)數(shù)器又從 ARR 自動(dòng)預(yù)裝載寄存器值開始計(jì)數(shù)。
先向上計(jì)數(shù)再向下計(jì)數(shù)。計(jì)數(shù)器從 0 開始向上計(jì)數(shù),遞增到 ARR 自動(dòng)預(yù)裝載寄存器值后,計(jì)數(shù)器產(chǎn)生上溢事件。定時(shí)器產(chǎn)生一個(gè)更新事件。然后計(jì)數(shù)器從 ARR 自動(dòng)預(yù)裝載寄存器值開始向下計(jì)數(shù),遞減到 0 后,計(jì)數(shù)器產(chǎn)生下溢事件。定時(shí)器再產(chǎn)生一個(gè)更新事件。
圖2 定時(shí)器向上計(jì)數(shù)
如圖2 所示,定時(shí)器輸入時(shí)鐘即分頻器時(shí)鐘 CK_PSC,預(yù)分頻器 PSC 值為 1 ,即定時(shí)器頻率為 CK_PSC 的二分頻頻率。定時(shí)器自動(dòng)裝載值 ARR 為 5,從圖中可見計(jì)數(shù)器 CNT 達(dá)到 5 時(shí),產(chǎn)生一個(gè)更新事件 UEV。
定時(shí)器周期長(zhǎng)度
ARR 自動(dòng)預(yù)裝載寄存器的值為定時(shí)器周期長(zhǎng)度,決定定時(shí)器計(jì)數(shù)多少次后產(chǎn)生一個(gè)更新事件。
比較輸出
如圖3 所示,定時(shí)器比較輸出功能通過計(jì)數(shù)器、通道 x 的捕獲/比較寄存器 CCRx 以及輸出控制電路實(shí)現(xiàn)。定時(shí)器將計(jì)數(shù)器和捕獲/比較寄存器 CCRx 值實(shí)時(shí)比較,當(dāng)二值相等時(shí)會(huì)改變通道 x 的參考輸出電壓 REF,參考輸出電壓 REF 和輸出控制電路共同決定通道 x 的實(shí)際電壓值。
圖3 MM32F0140 定時(shí)器輸出通道1示意圖
比較輸出匹配值
輸出通道x 對(duì)應(yīng)的 CCRx 寄存器值為比較輸出匹配值,定時(shí)器將在計(jì)數(shù)器值和通道 x 的匹配值相等時(shí),根據(jù)比較輸出模式,改變通道 x 的參考輸出電壓REF。
比較輸出模式選擇
MM32 F0140 的 TIM 模塊一共有 7 種比較輸出模式:
匹配結(jié)果對(duì)于參考輸出電壓 REF 沒有影響。
匹配時(shí)將參考輸出電壓 REF 設(shè)為高電平。
匹配時(shí)將參考輸出電壓 REF 設(shè)為低電平。
匹配時(shí)翻轉(zhuǎn)參考輸出電壓 REF。
強(qiáng)制參考輸出電壓 REF為低電平。
強(qiáng)制參考輸出電壓 REF為高電平。
PWM模式1:當(dāng)計(jì)數(shù)值小于匹配值時(shí),參考電壓REF為高電平,否則為低電平。
PWM模式2:當(dāng)計(jì)數(shù)值小于匹配值時(shí),參考電壓REF為低電平,否則為高電平。
參考輸出電壓和實(shí)際輸出電壓間關(guān)系
定時(shí)器 CCER[CCxP] 位決定了參考輸出電壓和實(shí)際輸出電壓間關(guān)系,具體可見表1。CCER[CCxP]值為0表示高電平有效,為1表示低電平有效。
表1 CCER[CCxP]值對(duì)實(shí)際輸出電壓的影響
如下圖 4 所示,通道1的比較值為1,當(dāng)計(jì)數(shù)器值小于1時(shí),通道1的比較輸出電壓 OC1REF 為高;當(dāng)計(jì)數(shù)器值等于1時(shí),通道1 的比較輸出電壓 OC1REF 拉低,產(chǎn)生一個(gè)下降沿。OC1REF 將一直保持為低,直到定時(shí)器更新事件發(fā)生,計(jì)數(shù)器從 0 開始計(jì)數(shù)時(shí),OC1REF 又被拉高。
圖4 遞增計(jì)數(shù)下PWM模式1時(shí)輸出通道參考電壓
輸入捕獲
如圖5 所示,輸入通道 x 的輸入信號(hào) TIx 經(jīng)過濾波器、邊沿檢測(cè)、分頻以后被定時(shí)器捕獲,定時(shí)器將輸入捕獲時(shí)刻的計(jì)數(shù)器值寫入相應(yīng)通道的捕獲/比較寄存器 CCRx 中。
圖5 MM32F0140輸入捕獲框圖
計(jì)數(shù)定時(shí)配置
時(shí)基配置
配置定時(shí)器工作模式
配置 CR1[OPM] 位可以設(shè)置定時(shí)器工作模式,其中值為 0 表示定時(shí)器將循環(huán)計(jì)時(shí),值為 1 表示計(jì)時(shí) 1 次后就停止計(jì)數(shù)器。
配置是否預(yù)裝載
配置 CR1[ARPE] 位可以配置定時(shí)器自動(dòng)預(yù)裝載寄存器 ARR 的實(shí)際更新方式,值為1則用戶寫入 ARR 寄存器的值會(huì)在下一次計(jì)數(shù)器更新時(shí)起效,否則立刻生效。
配置計(jì)數(shù)模式
配置 CR1[DIR] 位和 CR1[CMS] 位可以配置計(jì)數(shù)器計(jì)數(shù)模式。如果選擇單向計(jì)數(shù),CR1[CMS]需配置為 0,此時(shí)CR1[DIR] 配置為 0 時(shí),向上計(jì)數(shù),配置為 1 時(shí)向下計(jì)數(shù)。如果選擇先向上計(jì)數(shù)再向下計(jì)數(shù),則需要配置 CR1[CMS],CR1[DIR] 值保持為 0。
配置預(yù)分頻值
由上述計(jì)數(shù)器頻率計(jì)算小結(jié)可知,如果需要定時(shí)器頻率為 cnt_frq, 定時(shí)器輸入源頻率為 clk_frq,定時(shí)器的預(yù)分頻值 psc 應(yīng)為
計(jì)算出的 psc 值寫入 PSC 寄存器。
配置自動(dòng)預(yù)裝載寄存器 ARR
自動(dòng)預(yù)裝載寄存器 ARR 的值決定定時(shí)器周期計(jì)數(shù)次數(shù)。假如定時(shí)器向上計(jì)數(shù),則計(jì)數(shù)器從 0 遞增到 ARR 值,即 ARR 寄存器值為 arrv,則實(shí)際計(jì)數(shù)器一個(gè)周期內(nèi)會(huì)做arrv+1 次計(jì)數(shù),所以ARR 寄存器值應(yīng)為需要的周期計(jì)數(shù)值減一。將此值寫入 ARR 寄存器。
使能計(jì)數(shù)器
完成上述配置后,將 CR1[CEN] 置為 1 即可啟動(dòng)計(jì)數(shù)器計(jì)數(shù)。當(dāng)不需要計(jì)數(shù)時(shí),將此位設(shè)置為 0。
比較輸出配置
配置通道輸出模式
配置 CCMRy[CCxS] 位為 0,可以將通道 x 配置為輸出模式。
配置是否預(yù)裝載匹配值
配置 CCMRy[OCxPE] 位可以設(shè)置通道 x 的比較輸出匹配值生效方式,為 0 則一旦寫入立刻生效,否則匹配值將在下一次更新事件后生效。
配置比較輸出模式
配置 CCMRy[OCxM] 字段可以選擇不同的比較輸出模式,具體字段值和比較輸出模式間關(guān)系可見表3。
表3 CCMRy[OCxM] 與 比較輸出模式間對(duì)應(yīng)關(guān)系
配置有效輸出電壓
配置 CCER[CCxP] 位,可以設(shè)置通道 x 的有效輸出電壓。值為0,則參考電壓的高電平為有效電平;值為1,則參考電壓的低電平為有效電平。
使能通道輸出
配置 CCER[CCxE] 位為1,使能通道輸出功能;配置為 0,則關(guān)閉通道輸出功能。
輸入捕獲配置
配置通道輸入模式
配置 CCMRy[CCxS] 位為1,可將通道 x 配置為輸入模式。
配置輸入信號(hào)邊沿選擇
配置 CCER[CCxP] 和 CCER[CCxNP] 位,可以配置輸入信號(hào)的有效邊沿選擇,具體對(duì)應(yīng)關(guān)系如表4。
表4 輸入模式下,CCER[CCxP]和CCER[CCxNP]
對(duì)于輸入邊沿影響
配置采樣和濾波
配置 CCMRy[ICxF] 字段,設(shè)置通道 x 的輸入捕獲濾波器。
配置預(yù)分頻器
配置 CCMRy[IC1PSC] 字段,設(shè)置通道 x 輸入信號(hào)的預(yù)分頻值。
使能通道輸入
配置 CCER[CCxE] 位為 1,使能通道輸入捕獲功能;配置為 0,則關(guān)閉通道輸入捕獲功能。
樣例
pokt-f0140 開發(fā)板 定時(shí)器實(shí)現(xiàn)TIM2通道1輸出pwm波
在 SDK 中已有支持的 pokt-f0140 開發(fā)板上,在 tim_32b_0 樣例工程中,通過 tim_32b_output_compare_pwm 可以使用定時(shí)器 TIM2 的通道 1 輸出 pwm 波。
時(shí)鐘初始化
TIM2 在 APB2 總線上,需要使能時(shí)鐘。TIM2 的通道 1 復(fù)用 PA0 引腳,需要使能 GPIOA 時(shí)鐘。
/* 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。 */
定時(shí)器時(shí)基配置
TIM_32B_Init_Type tim_init;tim_init.ClockFreqHz = BOARD_TIM_32B_FREQ;/* 因?yàn)?TIM_32B 在APB2總線上,所以BOARD_TIM_32B_FREQ的值實(shí)際為APB2總線時(shí)鐘頻率。*/tim_init.StepFreqHz = APP_TIM_UPDATE_PERIOD; /* 定時(shí)器周期時(shí)長(zhǎng)為定時(shí)器周期長(zhǎng)度Period加1后除定時(shí)器頻率StepFreqHz。*/tim_init.Period = APP_TIM_UPDATE_PERIOD - 1u; /* 所以可得值為1,也即定時(shí)器周期時(shí)長(zhǎng)為1s。 */tim_init.EnablePreloadPeriod = false; /* 不采用預(yù)裝載,修改ARR寄存器將立即生效。 */tim_init.PeriodMode = TIM_32B_PeriodMode_Continuous;/* 循環(huán)計(jì)時(shí)。 */tim_init.CountMode = TIM_32B_CountMode_Increase; /* 遞增計(jì)數(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);
使能計(jì)數(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文章
5343瀏覽量
120366 -
分頻器
+關(guān)注
關(guān)注
43文章
447瀏覽量
49911 -
定時(shí)器
+關(guān)注
關(guān)注
23文章
3248瀏覽量
114800 -
MM32
+關(guān)注
關(guān)注
1文章
106瀏覽量
763
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論