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