
?STM32F103C8T6核心定時器 (5個)
TIM1 (高級控制定時器 - Advanced-control timer)
16位向上/向下計數器
4個獨立通道(可用于輸入捕獲、輸出比較、PWM生成)
支持互補輸出帶死區插入(非常適合電機控制、電源轉換)
支持編碼器接口
支持剎車信號輸入
最高可達72MHz計數時鐘。
TIM2 (通用定時器 - General-purpose timer)
16位向上/向下計數器
4個獨立通道(輸入捕獲、輸出比較、PWM)
支持編碼器接口
具有32位可編程預分頻器(提供非常精細的時鐘分頻)。
最高可達72MHz計數時鐘。
TIM3 (通用定時器 - General-purpose timer)
16位向上/向下計數器
4個獨立通道(輸入捕獲、輸出比較、PWM)
支持編碼器接口
最高可達72MHz計數時鐘。
TIM4 (通用定時器 - General-purpose timer)
16位向上/向下計數器
4個獨立通道(輸入捕獲、輸出比較、PWM)
支持編碼器接口
最高可達72MHz計數時鐘。
TIM5 (通用定時器 - General-purpose timer)
16位向上/向下計數器
4個獨立通道(輸入捕獲、輸出比較、PWM)
支持編碼器接口
最高可達72MHz計數時鐘。
2.三種STM32定時器的區別:
?即:高級定時器具有捕獲/比較通道和互補輸出,通用定時器只有捕獲/比較通道,基本定時器沒有以上兩者
?
二:基本定時器
1.基本定時器的結構框圖
1. 時鐘源 (Clock Sources)
來源:?圖中最上方明確標注了?
來自RCC的TIMxCLK
。含義:
RCC
?(Reset and Clock Control):STM32的時鐘控制器模塊,負責產生和分配系統所有時鐘信號。TIMxCLK
:這是分配給特定定時器(TIM1, TIM2, TIM3等)的時鐘源。這個時鐘的頻率決定了定時器運行的最快速度。
常見TIMxCLK來源 (STM32F1為例):
內部時鐘 (CK_INT):?這是最常用的模式。通常TIMxCLK直接來源于
APB1
(低速外設總線,TIM2-4掛在上面)或APB2
(高速外設總線,TIM1掛在上面)的時鐘。在標準庫/HAL庫中,調用?HAL_TIM_Base_Init()
?或類似初始化函數后,默認選擇的就是內部時鐘。外部時鐘模式1 (External Clock Mode 1):?時鐘信號來自定時器的特定輸入通道(如TI1, TI2)。通常用于外部脈沖計數或測量外部信號頻率。
外部時鐘模式2 (External Clock Mode 2):?時鐘信號來自
ETR
引腳(外部觸發輸入)。內部觸發輸入 (ITRx):?一個定時器可以被另一個定時器觸發,此時觸發信號就成為被觸發定時器的時鐘源。
圖中體現:?
來自RCC的TIMxCLK
?就是進入定時器的最初時鐘信號。它首先被送入?觸發控制器 (Trigger Controller)?和?時基單元。關鍵點:?時鐘源的選擇和頻率是決定定時器計數速度和精度的最根本因素。
因為APB1的預分頻系數是2,所以是36MHz*2=72MHz;
核心功能:
通過寄存器控制定時器的啟停、計數模式、中斷/DMA觸發及事件生成。
關鍵寄存器及作用:
寄存器 | 核心功能 | 關鍵位說明 |
---|---|---|
CR1 | 控制計數方向、使能、預裝載設置 | CEN :定時器使能位(1=啟動計數)DIR :計數方向(0=向上,1=向下)ARPE :ARR預裝載使能(影子寄存器開關) |
CR2 | 主模式配置、觸發輸出選擇 | MMS[2:0] :選擇TRGO觸發源(如更新事件UEV、捕獲比較事件等) |
DIER | 使能中斷/DMA請求 | UIE :更新事件中斷使能UDE :更新事件DMA請求使能 |
EGR | 軟件強制生成事件 | UG :置1時立即生成更新事件(強制重載影子寄存器) |
SR | 狀態標志監測 | UIF :更新事件標志位(需軟件清零) |
最終定時周期計算 (以向上計數為例):
定時器時鐘頻率 (CK_CNT) = TIMxCLK / (PSC + 1)
計數器溢出頻率 (更新事件頻率) = CK_CNT / (ARR + 1)
定時周期 (每次更新事件的時間間隔) = (ARR + 1) / CK_CNT = (ARR + 1) * (PSC + 1) / TIMxCLK
例子 (STM32F103C8T6 @72MHz, TIM2 定時1ms):
TIMxCLK
?(APB1 Timer Clk) = 72 MHz目標周期 T = 0.001s (1ms)
選擇?
PSC = 7199
?(分頻系數 7200)CK_CNT
?= 72,000,000 Hz / 7200 = 10,000 Hz (周期 0.0001s)
需要計數次數 N = T / (1 / CK_CNT) = 0.001s / 0.0001s = 10
設置?
ARR = 9
?(因為計數從0到9是10次)驗證:周期 = (9 + 1) * (7199 + 1) / 72,000,000 = 10 * 7200 / 72,000,000 = 72,000 / 72,000,000 = 0.001s = 1ms ?
這張框圖完美地詮釋了STM32定時器如何利用時鐘源、控制器和時基單元(PSC, CNT, ARR)協同工作來產生精確的定時基礎。理解這三個部分及其相互關系是掌握STM32定時器的關鍵。
三、影子寄存器:關鍵緩沖機制
存在意義:解決運行時修改參數導致的周期撕裂問題
兩種模式對比:
特性 | 啟用影子寄存器 (ARPE=1) | 禁用影子寄存器 (ARPE=0) |
---|---|---|
修改生效時機 | 下次更新事件(UEV)時 | 立即生效 |
安全性 | ???? 無周期撕裂風險 | ?? 可能中斷當前計數周期 |
典型場景 | 實時調整PWM周期/頻率 | 單次觸發或無需平滑切換的場景 |
寄存器操作 | 修改后需等待UEV或手動觸發EGR.UG=1 | 直接寫入即生效 |
關鍵場景演示(ARPE=1時修改ARR):
CNT正在計數至舊ARR值(如200)
用戶寫入新ARR=300 → 存入預裝載寄存器
CNT到達200 → 觸發UEV →
影子寄存器加載300
CNT清零并按新值300重新計數
完美避免計數中途切換導致的周期異常
通用定時器(TIM2/3/4/5)?和?高級定時器(TIM1/8)?、
一、定時器核心功能對比
功能 | 通用定時器 (TIM2/3/4/5) | 高級定時器 (TIM1/8) |
---|---|---|
基礎定時 | ? 支持 | ? 支持 |
輸出比較 | ? 4通道獨立PWM輸出 | ? 4通道PWM +?3路互補輸出 |
輸入捕獲 | ? 測量脈沖寬度/頻率 | ? 增強型捕獲(支持正交編碼器) |
斷路輸入 | ? 不支持 | ??緊急關斷引腳(Break Input) |
重復計數器 | ? 無 | ??RCR(實現事件分頻) |
時鐘源 | PCLK1 (36/72MHz) | PCLK2 (72MHz) |
📌?注:
F103的通用定時器掛載在APB1總線(最大72MHz),高級定時器掛載在APB2總線(72MHz)。
互補輸出和斷路輸入是高級定時器用于電機控制/逆變器的關鍵安全特性。
二、高級定時器獨有功能詳解
1. 重復計數器 (RCR)
作用:實現事件分頻,避免頻繁中斷。
2. 互補輸出與死區控制
通道結構:
TIM1_CH1 --> PWM主輸出 (e.g., PA8) TIM1_CH1N --> 互補輸出 (e.g., PB13) // 低有效,帶死區
死區發生器 (DBG):
防止上下管(如MOSFET)同時導通造成短路,插入納秒級延遲。
3. 斷路輸入 (Break Input)
緊急關斷場景:過流/過壓時,外部信號拉低→?立即關閉所有PWM輸出。
寄存器控制:
BDTR
寄存器配置斷路極性、鎖定模式、OSSR/OSSI狀態。
三、通用定時器核心特性
1. 時基單元(與高級定時器相同)
16位PSC(預分頻器) + 16位ARR(自動重裝) → 靈活定時間隔
計算公式:
<code>T<sub>out</sub>?= (ARR + 1) × (PSC + 1) / TIM<sub>CLK</sub></code>
(例:72MHz下,PSC=7199, ARR=9 → 1ms定時)
3 定時器控制LED?
#include "stm32f10x.h"
#include "Tim.h"void Base_Tim_Init(void)
{TIM_TimeBaseInitTypeDef TIM_TimeBaseInitstruct;NVIC_InitTypeDef NVIC_Initstruct;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);TIM_TimeBaseInitstruct.TIM_ClockDivision=TIM_CKD_DIV1;//看心得1TIM_TimeBaseInitstruct.TIM_CounterMode=TIM_CounterMode_Up;TIM_TimeBaseInitstruct.TIM_Period=7200;TIM_TimeBaseInitstruct.TIM_Prescaler=10000;TIM_TimeBaseInitstruct.TIM_RepetitionCounter=0;TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitstruct);TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE );TIM_Cmd( TIM2, ENABLE);NVIC_Initstruct.NVIC_IRQChannel=TIM2_IRQn ;NVIC_Initstruct.NVIC_IRQChannelPreemptionPriority=0;NVIC_Initstruct.NVIC_IRQChannelSubPriority=0;NVIC_Initstruct.NVIC_IRQChannelCmd=ENABLE;NVIC_Init(&NVIC_Initstruct);}
Tim.h
#ifndef _TIM_H_
#define _TIM_H_void Base_Tim_Init(void);#endif
main.c
#include "stm32f10x.h"
#include "main.h"
#include "led.h"
#include "Bear.h"
#include "key.h"
#include "relay.h"
#include "shake.h"
#include "wireless.h"
#include "exti_key.h"
#include "usart.h"
#include "stdio.h"
#include "Tim.h"void delay(uint16_t time)//延時1ms 軟件延時粗延時
{uint16_t i=0;while(time --){i=12000;while(i --);}}int main()
{LED_Init();Base_Tim_Init();while(1){}}void TIM2_IRQHandler (void)
{if(TIM_GetITStatus(TIM2, TIM_IT_Update)!=RESET){GPIO_ResetBits(GPIOA,GPIO_Pin_1);delay(1000);GPIO_SetBits(GPIOA,GPIO_Pin_1);delay(1000);TIM_ClearITPendingBit(TIM2, TIM_IT_Update);}}
今日心得:
1:定時器時鐘分頻(TIM_Clock_Division_CKD)詳解
在STM32定時器(TIM)中,CKD
(Clock Division)用于配置輸入時鐘源的分頻系數,從而調整定時器的內部時鐘頻率。以下是核心概念的解釋:
1. 分頻宏定義的含義
宏定義 | 值(十六進制) | 二進制值 | 分頻系數 | 作用描述 |
---|---|---|---|---|
TIM_CKD_DIV1 | 0x0000 | 00 | 1 | 不分頻(時鐘源直接使用) |
TIM_CKD_DIV2 | 0x0100 | 01 | 2 | 時鐘源2分頻(頻率減半) |
TIM_CKD_DIV4 | 0x0200 | 10 | 4 | 時鐘源4分頻(頻率降為1/4) |
關鍵點:
這些值通過位操作寫入定時器控制寄存器(
TIMx_CR1
)的?CKD[1:0]?位(第8-9位)。例如:
0x0100
(即0000 0001 0000 0000
)會將第8位置1,第9位保持
總結
TIM_CKD_DIVx?是配置定時器時鐘源分頻的選項,直接影響定時器的基礎頻率。
分頻系數1/2/4?分別對應不分頻、2分頻、4分頻,通過寄存器位?
CKD[1:0]
?控制。與預分頻器(PSC)協同工作,可實現更靈活的時鐘頻率調整。
通過合理配置?CKD
,開發者可以優化定時器的功耗和性能,適配不同應用場景的需求。
?2:TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState);作用是啥
核心作用
配置定時器(TIM)的中斷使能狀態
通過設置/清除定時器的?DIER(DMA/Interrupt Enable Register)寄存器?的特定位,控制特定定時器事件是否觸發中斷。
參數解析
參數 | 類型 | 說明 |
---|---|---|
TIMx | TIM_TypeDef* | 定時器實例指針(如 TIM1, TIM2 等) |
TIM_IT | uint16_t | 中斷源選擇(使用位掩碼指定要配置的中斷事件) |
NewState | FunctionalState | 中斷狀態:ENABLE (使能)或?DISABLE (禁用) |
中斷源(TIM_IT)詳解
TIM_IT
?是以下宏的位掩碼組合(可多選):
中斷源宏 | 值(十六進制) | 觸發事件說明 |
---|---|---|
TIM_IT_Update | 0x0001 | 計數器溢出/更新事件(如計數器達到自動重載值) |
TIM_IT_CC1 | 0x0002 | 通道 1 捕獲/比較事件(如輸入捕獲觸發或比較匹配) |
TIM_IT_CC2 | 0x0004 | 通道 2 捕獲/比較事件 |
TIM_IT_CC3 | 0x0008 | 通道 3 捕獲/比較事件 |
TIM_IT_CC4 | 0x0010 | 通道 4 捕獲/比較事件 |
TIM_IT_Trigger | 0x0040 | 觸發事件(由從模式控制器觸發,如外部信號同步) |
TIM_IT_Break | 0x0080 | 斷路輸入事件(高級定時器特有,用于緊急關閉輸出) |
?