一、定時(shí)器分類(lèi)
STM32F1 系列中,除了互聯(lián)型的產(chǎn)品,共有 8 個(gè)定時(shí)器,分為基本定時(shí)器,通用定時(shí)器和高級(jí)定時(shí)器?;径〞r(shí)器 TIM6 和 TIM7 是一個(gè) 16 位的只能向上計(jì)數(shù)的定時(shí)器,只能定時(shí),沒(méi)有外部 IO。通用定時(shí)器 TIM2/3/4/5 是一個(gè) 16 位的可以向上/下計(jì)數(shù)的定時(shí)器,可以定時(shí),可以輸出比較,可以輸入捕捉,每個(gè)定時(shí)器有四個(gè)外部 IO。高級(jí)定時(shí)器 TIM1/8是一個(gè) 16 位的可以向上/下計(jì)數(shù)的定時(shí)器,可以定時(shí),可以輸出比較,可以輸入捕捉,還可以有三相電機(jī)互補(bǔ)輸出信號(hào),每個(gè)定時(shí)器有 8 個(gè)外部 IO。
基本定時(shí)器的核心是時(shí)基,通用計(jì)時(shí)器和高級(jí)定時(shí)器也有。
1、時(shí)鐘源
定時(shí)器時(shí)鐘TIMxCLK,即內(nèi)部時(shí)鐘CK_INT,經(jīng)APB1預(yù)分頻器后分頻提供,如果APB1 預(yù)分頻系數(shù)等于 1,則頻率不變,否則頻率乘以 2,庫(kù)函數(shù)中 APB1 預(yù)分頻的系數(shù)是 2,即 PCLK1=36M,所以定時(shí)器時(shí)鐘 TIMxCLK=36*2=72M 。
2、計(jì)數(shù)器時(shí)鐘
定時(shí)器時(shí)鐘經(jīng)過(guò) PSC 預(yù)分頻器之后,即 CK_CNT,用來(lái)驅(qū)動(dòng)計(jì)數(shù)器計(jì)數(shù)。PSC 是一個(gè)16 位的預(yù)分頻器,可以對(duì)定時(shí)器時(shí)鐘 TIMxCLK 進(jìn)行 1~65536 之間的任何一個(gè)數(shù)進(jìn)行分頻。
具體計(jì)算方式為:CK_CNT=TIMxCLK/(PSC+1)。
3.計(jì)數(shù)器
計(jì)數(shù)器 CNT 是一個(gè) 16 位的計(jì)數(shù)器,只能往上計(jì)數(shù),最大計(jì)數(shù)值為 65535。當(dāng)計(jì)數(shù)達(dá)到自動(dòng)重裝載寄存器的時(shí)候產(chǎn)生更新事件,并清零從頭開(kāi)始計(jì)數(shù)。
4、自動(dòng)重裝載寄存器
自動(dòng)重裝載寄存器 ARR 是一個(gè) 16 位的寄存器,這里面裝著計(jì)數(shù)器能計(jì)數(shù)的最大數(shù)值。當(dāng)計(jì)數(shù)到這個(gè)值的時(shí)候,如果使能了中斷的話,定時(shí)器就產(chǎn)生溢出中斷。
5. 定時(shí)時(shí)間的計(jì)算
定時(shí)器的定時(shí)時(shí)間等于計(jì)數(shù)器的中斷周期乘以中斷的次數(shù)。計(jì)數(shù)器在 CK_CNT 的驅(qū)動(dòng)下,計(jì)一個(gè)數(shù)的時(shí)間則是 CK_CLK 的倒數(shù),等于:1/(TIMxCLK/(PSC+1)),產(chǎn)生一次中斷的時(shí)間則等于:1/(CK_CLK * ARR)。如果在中斷服務(wù)程序里面設(shè)置一個(gè)變量 time,用來(lái)記錄中斷的次數(shù),那么就可以計(jì)算出我們需要的定時(shí)時(shí)間等于: 1/CK_CLK *(ARR+1)*time。
1.定義
設(shè)置等待時(shí)間,到達(dá)等待時(shí)間之后執(zhí)行指定的硬件操作。
定時(shí)器最基本的功能就是定時(shí),比如說(shuō)定時(shí)發(fā)送串口數(shù)據(jù),定時(shí)采集AD數(shù)據(jù),也可以產(chǎn)生PWM方波等,定時(shí)器產(chǎn)生PWM控制電機(jī)狀態(tài)是工業(yè)控制的普通。
2、STM32F4xx系列的芯片:2個(gè)高級(jí)控制定時(shí)器(TIM1和TIM8)、10個(gè)通用定時(shí)器(10TIM2-TIM5,TIM9-TIM14)、2個(gè)基本定時(shí)器(TIM6和TIM7)、2個(gè)看門(mén)狗定時(shí)器
具體可參考中文參考手冊(cè)了解其特性及原理
3、定時(shí)器計(jì)數(shù)模式:
通用定時(shí)器可以向上計(jì)數(shù)、向下計(jì)數(shù)、向上向下雙向計(jì)數(shù)模式。
①向上計(jì)數(shù)模式:計(jì)數(shù)器從0計(jì)數(shù)到自動(dòng)加載值(TIMx_ARR),然后重新從0開(kāi)始計(jì)數(shù)并且產(chǎn)生一個(gè)計(jì)數(shù)器溢出事件。
②向下計(jì)數(shù)模式:計(jì)數(shù)器從自動(dòng)裝入的值(TIMx_ARR)開(kāi)始向下計(jì)數(shù)到0,然后從自動(dòng)裝入的值重新開(kāi)始,并產(chǎn)生一個(gè)計(jì)數(shù)器向下溢出事件。
③中央對(duì)齊模式(向上/向下計(jì)數(shù)):計(jì)數(shù)器從0開(kāi)始計(jì)數(shù)到自動(dòng)裝入的值-1,產(chǎn)生一個(gè)計(jì)數(shù)器溢出事件,然后向下計(jì)數(shù)到1并且產(chǎn)生一個(gè)計(jì)數(shù)器溢出事件;然后再?gòu)?開(kāi)始重新計(jì)數(shù)。
如圖:
4、通用定時(shí)器工作原理:
● 計(jì)數(shù)器寄存器 (TIMx_CNT)
● 預(yù)分頻器寄存器 (TIMx_PSC)
● 自動(dòng)重載寄存器 (TIMx_ARR)
假如是向上增長(zhǎng)模式,計(jì)數(shù)器(CNT)從0加到自動(dòng)重載值(ARR),預(yù)分頻器(PSC)減一次。
時(shí)間計(jì)算方式:
假設(shè)頻率為:42M*2 == 84M == 84000000 == 1s //42根據(jù)定時(shí)器時(shí)鐘數(shù)可知 并且一般都是*2
定時(shí)器定時(shí)1s產(chǎn)生中斷:
ARR = 84000; // 1ms
PSC = 1000; // 1000*1ms == 1s
如圖:可知基本定時(shí)器的時(shí)鐘是42M,那么對(duì)應(yīng)*2就是84M=84000000=1S(ARR*PSC)
高級(jí)的既是84*2=96M=96000000=1S
-----------------------------------------------------------------------------------------------------------------------------------------------------------
5、定時(shí)器中斷實(shí)現(xiàn)步驟
//5.1、能定時(shí)器時(shí)鐘。
RCC_APB1PeriphClockCmd();
//5.2、初始化定時(shí)器,配置ARR,PSC。(申明結(jié)構(gòu)體)
TIM_TimeBaseInit();
typedef struct
{
uint16_t TIM_Prescaler;
uint16_t TIM_CounterMode;
uint16_t TIM_Period;
uint16_t TIM_ClockDivision;
uint8_t TIM_RepetitionCounter;
} TIM_TimeBaseInitTypeDef;
//5.3、啟定時(shí)器中斷,配置NVIC(申明結(jié)構(gòu)體)
NVIC_Init();
進(jìn)行NVIC中斷配置
NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQn; //定時(shí)器 3 中斷
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x01; //搶占優(yōu)先級(jí) 1
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x03; //響應(yīng)優(yōu)先級(jí) 3
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);// ④初始化 NVIC
TIM_Cmd(TIM3,ENABLE); //⑤使能定時(shí)器 3
//5.4、設(shè)置 TIM3_DIER 允許更新中斷
TIM_ITConfig();
//5.5、使能定時(shí)器。
TIM_Cmd();
//5.6、編寫(xiě)中斷服務(wù)函數(shù)。
TIMx_IRQHandler();
//定時(shí)器 3 中斷服務(wù)函數(shù)
void TIM3_IRQHandler(void)
{
if(TIM_GetITStatus(TIM3,TIM_IT_Update)==SET) //溢出中斷
{
/*處理的程序段*/
}
TIM_ClearITPendingBit(TIM3,TIM_IT_Update); //清除中斷標(biāo)志位
}
TIM3_Int_Init(5000-1,8400-1); //定時(shí)器時(shí)鐘84M,分頻系數(shù)8400,所以84M/8400=10Khz的計(jì)數(shù)頻率,計(jì)數(shù)5000次為500ms
void TIM3_Int_Init(u16 arr,u16 psc)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE); ///使能TIM3時(shí)鐘
TIM_TimeBaseInitStructure.TIM_Period = arr; //自動(dòng)重裝載值
TIM_TimeBaseInitStructure.TIM_Prescaler=psc; //定時(shí)器分頻
TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上計(jì)數(shù)模式
TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);//初始化TIM3
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE); //允許定時(shí)器3更新中斷
TIM_Cmd(TIM3,ENABLE); //使能定時(shí)器3
NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQn; //定時(shí)器3中斷
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x01; //搶占優(yōu)先級(jí)1
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x03; //子優(yōu)先級(jí)3
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
//定時(shí)器3中斷服務(wù)函數(shù)
void TIM3_IRQHandler(void)
{
if(TIM_GetITStatus(TIM3,TIM_IT_Update)==SET) //溢出中斷
{
LED1=!LED1;//DS1翻轉(zhuǎn)
}
TIM_ClearITPendingBit(TIM3,TIM_IT_Update); //清除中斷標(biāo)志位
}
定時(shí)器初始化結(jié)構(gòu)體詳解
在標(biāo)準(zhǔn)庫(kù)函數(shù)頭文件stm32f10x_tim.h中對(duì)定時(shí)器外設(shè)建立了四個(gè)初始化結(jié)構(gòu)體,基本定時(shí)器只用到其中一個(gè)即TIM_TimeBaseInitTypeDef,其他三個(gè)在高級(jí)定時(shí)器章節(jié)講解。
typedef struct {
uint16_t TIM_Prescaler; // 預(yù)分頻器
uint16_t TIM_CounterMode; // 計(jì)數(shù)模式
uint32_t TIM_Period; // 定時(shí)器周期
uint16_t TIM_ClockDivision; // 時(shí)鐘分頻
uint8_t TIM_RepetitionCounter; // 重復(fù)計(jì)算器
} TIM_TimeBaseInitTypeDef;1234567
(1) TIM_Prescaler:定時(shí)器預(yù)分頻器設(shè)置,時(shí)鐘源經(jīng)該預(yù)分頻器才是定時(shí)器時(shí)鐘,它設(shè)定TIMx_PSC 寄存器的值??稍O(shè)置范圍為 0 至 65535,實(shí)現(xiàn) 1至 65536 分頻。
(2) TIM_CounterMode:定時(shí)器計(jì)數(shù)方式,可是在為向上計(jì)數(shù)、向下計(jì)數(shù)以及三種中心對(duì)齊模式?;径〞r(shí)器只能是向上計(jì)數(shù),即 TIMx_CNT只能從 0開(kāi)始遞增,并且無(wú)需初始化。
(3) TIM_Period:定時(shí)器周期,實(shí)際就是設(shè)定自動(dòng)重載寄存器的值,在事件生成時(shí)更新到影子寄存器??稍O(shè)置范圍為 0至 65535。
(4) TIM_ClockDivision:時(shí)鐘分頻,設(shè)置定時(shí)器時(shí)鐘 CK_INT 頻率與數(shù)字濾波器采樣時(shí)鐘頻率分頻比,基本定時(shí)器沒(méi)有此功能,不用設(shè)置。
(5) TIM_RepetitionCounter:重復(fù)計(jì)數(shù)器,屬于高級(jí)控制寄存器專(zhuān)用寄存器位,利用它可以非常容易控制輸出 PWM 的個(gè)數(shù)。這里不用設(shè)置。
雖然定時(shí)器基本初始化結(jié)構(gòu)體有 5 個(gè)成員,但對(duì)于基本定時(shí)器只需設(shè)置其中兩個(gè)就可以。
評(píng)論