一、什麼是定時器
對于stm32f103系列單片機,其定時器是一個通過可程式設計預分頻器驅動的,16位自動裝載計數器。
- 可程式設計預分頻器驅動
- 計數器是16位的
- 自動裝載
二、STM32中的定時器
定時器種類 | 捕獲/比較通道 | 互補輸出 | 特殊應用場景 |
---|---|---|---|
基本定時器(TIM6,TIM7) | 無 | 主要應用于驅動DAC | |
通用定時器(TIM2~TIM5) | 4 | 無 | 通用。定時器技術,PWM輸出,輸入捕獲,輸出比較 |
進階定時器(TIM1,TIM8) | 4 | 有 | 帶死區控制盒緊急刹車,可應用于PWM電機控制 |
三、通用定時器基本原理

- 位于低速的APB1總線上
- 16位的,計數值在1到65535之間調節
- 支援向上、向下和向上/向下(也即中央對齊)3種計數模式;
- 重裝載值自動裝載
- 含有16位可程式設計預分頻器(也即TIMx_PSC寄存器),計數器時鐘頻率分頻系數可以在1到65535之間調節
- 含有4個獨立通道(也即CH1到CH4),每個通道都可以用來:輸入捕獲、輸出比較、pwm生成以及單脈沖模式輸出;
- 可以使用外部信号(TIMx_ETR)控制定時器之間的級聯
- 如下事件發生時産生中斷/DMA(6個獨立的IRQ/DMA請求生成器)
- 更新事件,也即計數器向上或向下溢出;
- 觸發事件,也即計數器啟動、停止、初始化等;
- 輸入捕獲;
- 輸出比較;
- 支援針對定位的增量(正交)編碼器和霍爾傳感器電路
- 觸發輸入作為外部時鐘,或者按周期的電流管理。
- 每個通用定時器都是完全獨立的,之間不共享任何資源,不會産生互相幹擾就制約。
四、時鐘系統
- STM32有5個時鐘源:HSI、HSE、LSI、LSE、PLL
- HSI是高速内部時鐘,RC振蕩器,頻率約為8MHz,精度不高
- HSE是高速外部時鐘,可接石英/陶瓷諧振器,或者外接時鐘源,頻率範圍為4~16MHz
- LSI是低速内部時鐘,RC振蕩器,頻率約為40kHz,提供低功耗時鐘。WDG
- LSE是低速外部時鐘,接頻率為32.768kHz石英晶體。RTC
- PLL為鎖相環倍頻輸出,其時鐘輸入可選擇HSI2、HSE或者HSE/2。倍頻可選擇2~16倍,但是其輸出頻率不超過72MHz
- 系統時鐘 SYSCLK可來源于三個時鐘源
- HS振蕩器時鐘
- HSE振蕩器時鐘
- PLL時鐘
- STM32可以選擇一個時鐘信号輸出到MCO腳(PA8)上,可以選擇為PLL輸出的2分頻、HSI、HSE、或者系統時鐘
- 有2條總線,AHB總線和APB總線,APB總線又分為低速APB1總線和高速APB2總線
- 任何一個外設在使用之前,必須首先使能其相應的時鐘
五、計數器模式
通用定時器可以使用向上計數、向下計數、中央對齊(向上向下)計數模式。
Tout(溢出時間) = (ARR+1)(PSC+1) / Tclk
六、PWM輸出配置步驟
- 使能定時器3和相關IO口時鐘。
- 使能定時器3時鐘:
RCC_APB1PeriphClockCmd();
- 使能GPIOB時鐘:
RCC_APB2PeriphClockCmd();
- 使能定時器3時鐘:
- 初始化IO口為複用功能輸出。函數:
GPIO_Init();
-
這裡我們是要把PB5用作定時器的PWM輸出引腳,是以要重映射配置,
是以需要開啟AFIO時鐘。同時設定重映射。
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE);
- 初始化定時器:ARR,PSC等:
TIM_TimeBaseInit();
參數 代碼 備注 計數 TIM_Period arr 預分頻數 TIM_Prescaler psc 時鐘分割 TIM_ClockDivision 通常用于輸入捕獲PWM直接等于0 計數模式 TIM_CounterMode 向上、向下向上/向下 - 初始化輸出比較參數:
TIM_OC2Init();
參數 代碼 備注 選擇定時器模式 TIM_OCMode TIM_OCMode_PWM2 比較輸出使能 TIM_OutputState ENABLE/DISABLE 輸出極性 TIM_OCPolarity 高/低 - 使能預裝載寄存器:
TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);
- 使能定時器。
TIM_Cmd();
- 不斷改變比較值CCRx,達到不同的占空比效果:
TIM_SetCompare2();