STM32F4xx系列控制器有共有14個(gè)TIM定時(shí)器。其中2個(gè)高級(jí)控制定時(shí)器TIM1和TIM8、10 個(gè)通用定時(shí)器TIM2TIM5和TIM9TIM14、 2個(gè)基本定時(shí)器TIM6和TIM7。
各個(gè)定時(shí)器的特性如下:
三種定時(shí)器中基本定時(shí)器是最簡(jiǎn)單的,功能少,結(jié)構(gòu)簡(jiǎn)單,我們先從簡(jiǎn)單的開始入手。
基本定時(shí)器主要兩個(gè)功能,第一就是基本定時(shí)功能,生成時(shí)基,第二就是專門用于驅(qū)動(dòng)數(shù)模轉(zhuǎn)換器(DAC)。由于PWM波可以實(shí)現(xiàn)DAC的輸出,所以一般也就不用到基本定時(shí)器的第二個(gè)功能了。控制器的兩個(gè)基本定時(shí)器 功能完全一樣,但所用資源彼此都完全獨(dú)立,可以同時(shí)使用。
基本定時(shí)器 TIM6 和 TIM7是一個(gè) 16位向上遞增的定時(shí)器,當(dāng)在自動(dòng)重載寄存器(TIMx_ARR)添加一個(gè)計(jì)數(shù)值后并使能 TIMx,計(jì)數(shù)寄存器(TIMx_CNT)就會(huì)從 0 開始遞增,當(dāng) TIMx_CNT 的數(shù)值與 TIMx_ARR值相同時(shí)就會(huì)生成事件并把 TIMx_CNT 寄存器清 0,完成一次循環(huán)過程。如果沒有停止定時(shí)器就循環(huán)執(zhí)行上述過程。
基本定時(shí)器框圖
時(shí)基單元
可編程定時(shí)器的主要模塊由一個(gè) 16 位遞增計(jì)數(shù)器及其相關(guān)的自動(dòng)重載寄存器組成。計(jì)數(shù)器的時(shí)鐘可通過預(yù)分頻器進(jìn)行分頻。
計(jì)數(shù)器、自動(dòng)重載寄存器和預(yù)分頻器寄存器可通過軟件進(jìn)行讀寫。即使在計(jì)數(shù)器運(yùn)行時(shí)也可執(zhí)行讀寫操作。
時(shí)基單元包括:
● 計(jì)數(shù)器寄存器 (TIMx_CNT)
● 預(yù)分頻器寄存器 (TIMx_PSC)
● 自動(dòng)重載寄存器 (TIMx_ARR)
自動(dòng)重載寄存器是預(yù)裝載的。每次嘗試對(duì)自動(dòng)重載寄存器執(zhí)行讀寫操作時(shí),都會(huì)訪問預(yù)裝載寄存器。預(yù)裝載寄存器的內(nèi)容既可以直接傳送到影子寄存器,也可以在每次發(fā)生更新事件 UEV 時(shí)傳送到影子寄存器,這取決于 TIMx_CR1 寄存器中的自動(dòng)重載預(yù)裝載使能位 (ARPE)。當(dāng)計(jì)數(shù)器達(dá)到上溢值并且 TIMx_CR1 寄存器中的 UDIS 位為 0 時(shí),將發(fā)送更新事件。該更新事件也可由軟件產(chǎn)生。
計(jì)數(shù)器由預(yù)分頻器輸出 CK_CNT 提供時(shí)鐘,僅當(dāng) TIMx_CR1 寄存器中的計(jì)數(shù)器啟動(dòng)位 (CEN)置 1 時(shí),才會(huì)啟動(dòng)計(jì)數(shù)器。
請(qǐng)注意,實(shí)際的計(jì)數(shù)器使能信號(hào) CNT_EN 在 CEN 置 1 的一個(gè)時(shí)鐘周期后被置 1。
預(yù)分頻器
預(yù)分頻器可對(duì)計(jì)數(shù)器時(shí)鐘頻率進(jìn)行分頻,分頻系數(shù)介于 1 和 65536 之間。該預(yù)分頻器基于TIMx_PSC 寄存器中的 16 位寄存器所控制的 16 位計(jì)數(shù)器。由于 TIMx_PSC 控制寄存器有緩沖,因此可對(duì)預(yù)分頻器進(jìn)行實(shí)時(shí)更改。而新的預(yù)分頻比將在下一更新事件發(fā)生時(shí)被采用。
計(jì)數(shù)模式
計(jì)數(shù)器從 0 計(jì)數(shù)到自動(dòng)重載值(TIMx_ARR 寄存器的內(nèi)容),然后重新從 0 開始計(jì)數(shù)并生成計(jì)數(shù)器上溢事件。
每次發(fā)生計(jì)數(shù)器上溢時(shí)會(huì)生成更新事件,或?qū)?TIMx_EGR 寄存器中的 UG 位置 1(通過軟件或使用從模式控制器)也可以生成更新事件。
通過軟件將 TIMx_CR1 寄存器中的 UDIS 位置 1 可禁止 UEV 事件。這可避免向預(yù)裝載寄存器寫入新值時(shí)更新影子寄存器。這樣,直到 UDIS 位中寫入 0 前便不會(huì)生成任何更新事件,但計(jì)數(shù)器和預(yù)分頻器計(jì)數(shù)器都會(huì)重新從 0 開始計(jì)數(shù)(而預(yù)分頻比保持不變)。此外,如果TIMx_CR1 寄存器中的 URS 位(更新請(qǐng)求選擇)已置 1,則將 UG 位置 1 會(huì)生成更新事件UEV,但不會(huì)將 UIF 標(biāo)志置 1(因此,不會(huì)發(fā)送任何中斷或 DMA 請(qǐng)求)。
發(fā)生更新事件時(shí),將更新所有寄存器且將更新標(biāo)志(TIMx_SR 寄存器中的 UIF 位)置 1(取決于 URS 位):
● 使用預(yù)裝載值(TIMx_PSC 寄存器的內(nèi)容)重新裝載預(yù)分頻器的緩沖區(qū)
● 使用預(yù)裝載值 (TIMx_ARR) 更新自動(dòng)重載影子寄存器
時(shí)鐘源
計(jì)數(shù)器時(shí)鐘由內(nèi)部時(shí)鐘 (CK_INT) 源提供。
CEN(TIMx_CR1 寄存器中)和 UG 位(TIMx_EGR 寄存器中)為實(shí)際控制位,并且只能通過軟件進(jìn)行更改(保持自動(dòng)清零的 UG 除外)。當(dāng)對(duì)CEN 位寫入 1 時(shí),預(yù)分頻器的時(shí)鐘就由內(nèi)部時(shí)鐘 CK_INT 提供。
接下來了解基本定時(shí)器的相關(guān)寄存器:
TIM6 和 TIM7 控制寄存器 1 (TIMx_CR1)
位 7 ARPE:自動(dòng)重載預(yù)裝載使能 (Auto-reload preload enable)
0:TIMx_ARR 寄存器不進(jìn)行緩沖。
1:TIMx_ARR 寄存器進(jìn)行緩沖。
位 3 OPM:單脈沖模式 (One-pulse mode)
0:計(jì)數(shù)器在發(fā)生更新事件時(shí)不會(huì)停止計(jì)數(shù)
1:計(jì)數(shù)器在發(fā)生下一更新事件時(shí)停止計(jì)數(shù)(將 CEN 位清零)。
位 2 URS:更新請(qǐng)求源 (Update request source)
此位由軟件置 1 和清零,用以選擇 UEV 事件源。
0:使能時(shí),所有以下事件都會(huì)生成更新中斷或 DMA 請(qǐng)求。此類事件包括:
— 計(jì)數(shù)器上溢/下溢
— 將 UG 位置 1
— 通過從模式控制器生成的更新事件
1:使能時(shí),只有計(jì)數(shù)器上溢/下溢會(huì)生成更新中斷或 DMA 請(qǐng)求。
位 1 UDIS:更新禁止 (Update disable)
此位由軟件置 1 和清零,用以使能/禁止 UEV 事件生成。
0:使能 UEV。更新 (UEV) 事件可通過以下事件之一生成:
— 計(jì)數(shù)器上溢/下溢
— 將 UG 位置 1
— 通過從模式控制器生成的更新事件
然后更新影子寄存器的值。
1:禁止 UEV。不會(huì)生成更新事件,各影子寄存器的值(ARR 和 PSC)保持不變。但如果將UG 位置 1,或者從從模式控制器接收到硬件復(fù)位,則會(huì)重新初始化計(jì)數(shù)器和預(yù)分頻器。
位 0 CEN:計(jì)數(shù)器使能 (Counter enable)
0:禁止計(jì)數(shù)器
1:使能計(jì)數(shù)器
注意:只有事先通過軟件將 CEN 位置 1 ,才可以使用門控模式。而觸發(fā)模式可通過硬件自動(dòng)將CEN 位置 1 。
在單脈沖模式下,當(dāng)發(fā)生更新事件時(shí)會(huì)自動(dòng)將 CEN 位清零。
TIM6 和 TIM7 控制寄存器 2 (TIMx_CR2)
位 6:4 MMS:主模式選擇 (Master mode selection)
這些位用于選擇主模式下將要發(fā)送到從定時(shí)器以實(shí)現(xiàn)同步的信息 (TRGO)。這些位的組合如下:
000:復(fù)位——TIMx_EGR 寄存器中的 UG 位用作觸發(fā)輸出 (TRGO)。如果復(fù)位由觸發(fā)輸入生成(從模式控制器配置為復(fù)位模式),則 TRGO 上的信號(hào)相比實(shí)際復(fù)位會(huì)有延遲。
001:使能——計(jì)數(shù)器使能信號(hào) (CNT_EN) 用作觸發(fā)輸出 (TRGO)。該觸發(fā)輸出可用于同時(shí)啟動(dòng)多個(gè)定時(shí)器,或者控制在一段時(shí)間內(nèi)使能從定時(shí)器。計(jì)數(shù)器使能信號(hào)由 CEN 控制位與門控模式下的觸發(fā)輸入的邏輯或運(yùn)算組合而成。
當(dāng)計(jì)數(shù)器使能信號(hào)由觸發(fā)輸入控制時(shí),TRGO 上會(huì)存在延遲,選擇主/從模式時(shí)除外(請(qǐng)參見TIMx_SMCR 寄存器中對(duì) MSM 位的說明)。
010:更新——選擇更新事件作為觸發(fā)輸出 (TRGO)。例如,主定時(shí)器可用作從定時(shí)器的預(yù)分頻器。
TIM6 和 TIM7 DMA/ 中斷使能寄存器 (TIMx_DIER)
位 8 UDE:更新 DMA 請(qǐng)求使能 (Update DMA request enable)
0:禁止更新 DMA 請(qǐng)求。
1:使能更新 DMA 請(qǐng)求。
位 0 UIE:更新中斷使能 (Update interrupt enable)
0:禁止更新中斷。
1:使能更新中斷。
TIM6 和 TIM7 狀態(tài)寄存器 (TIMx_SR)
位 0 UIF:更新中斷標(biāo)志 (Update interrupt flag)
該位在發(fā)生更新事件時(shí)通過硬件置 1。但需要通過軟件清零。
0:未發(fā)生更新。
1:更新中斷掛起。該位在以下情況下更新寄存器時(shí)由硬件置 1:
— 上溢或下溢并且當(dāng) TIMx_CR1 寄存器中 UDIS = 0 時(shí)。
— 當(dāng)由于 TIMx_CR1 寄存器中 URS = 0 且 UDIS = 0 而通過軟件使用 TIMx_EGR 寄存器中的 UG 位重新初始化 CNT 時(shí)。
TIM6 和 TIM7 事件生成寄存器 (TIMx_EGR)
位 0 UG:更新生成 (Update generation)
該位可通過軟件置 1,并由硬件自動(dòng)清零。
0:不執(zhí)行任何操作。
1:重新初始化定時(shí)器計(jì)數(shù)器并生成寄存器更新事件。請(qǐng)注意,預(yù)分頻器計(jì)數(shù)器也將清零(但預(yù)分頻比不受影響)。
基本定時(shí)器初始化函數(shù)和中斷處理函數(shù)如下
void Timer6_Init(u16 arr,u16 pre)
{
u32 prigroup = 0;
u32 priority = 0;
//1. 開時(shí)鐘
RCC- >APB1ENR |= 1< 4;
//2. 設(shè)置模式
// TIM6- >CR1 = 0;
TIM6- >CR1 |= 1< 7; //開啟預(yù)裝載功能
TIM6- >CR1 &= ~(1< 3); //連續(xù)計(jì)數(shù)
TIM6- >CR1 |= 1< 2; //UG置1,產(chǎn)生更新,但不產(chǎn)生中斷
TIM6- >CR1 |= 1< 1; //暫時(shí)不產(chǎn)生更新
TIM6- >CR1 &= ~(1< 0); //配置完成前,先關(guān)閉計(jì)數(shù)器
//3. 設(shè)置預(yù)分頻
Timer6_SetPre(pre);
//4. 設(shè)置自動(dòng)重裝載
Timer6_SetArr(arr);
//5. 設(shè)置中斷
//清標(biāo)記
TIM6- >SR &= ~(1< 0);
//開外設(shè)中斷
TIM6- >DIER |= 1< 0;
//NVIC
prigroup = NVIC_GetPriorityGrouping();
priority = NVIC_EncodePriority(prigroup,1,2);
NVIC_SetPriority(TIM6_DAC_IRQn,priority);
NVIC_EnableIRQ(TIM6_DAC_IRQn);
//6. 更新并開啟計(jì)數(shù)器
TIM6- >CNT = 0;
//允許更新
TIM6- >CR1 &= ~(1< 1);
//產(chǎn)生更新
TIM6- >EGR |= 1< 0;
//開啟定時(shí)器
TIM6- >CR1 |= 1< 0;
}
void Timer6_SetArr(u16 arr)//重裝載值設(shè)置
{
if(arr == 0)
TIM6- >ARR = 0;
else
TIM6- >ARR = arr - 1;
}
void Timer6_SetPre(u16 pre)//分頻設(shè)置
{
if(pre == 0)
TIM6- >PSC = 0;
else
TIM6- >PSC = pre - 1;
}
u8 led_flag = 0;
//中斷處理
void TIM6_DAC_IRQHandler()
{
if(TIM6- >SR & (1< 0))
{
//1. 清標(biāo)記
TIM6- >SR &= ~(1< 0);
//2. 中斷處理
led_flag = ~led_flag;
}
else
TIM6- >SR = 0;
}
接著編寫主函數(shù)進(jìn)行測(cè)試
#include "stm32f4xx.h"
#include "led.h"
#include "timer.h"
int main()
{
LED_Init();
Timer6_Init(18000,1250); //一個(gè)周期0.125s
while(1)
{
if(led_flag)
LED_Toggle(); //0.25sLED翻轉(zhuǎn)一次,1s翻轉(zhuǎn)四次
}
}
```至此,基本定時(shí)器的功能就結(jié)束了,對(duì)于通用定時(shí)器和高級(jí)定時(shí)器的定時(shí)功能與基本定時(shí)器使用方法一樣,這里就不再贅述。
-
控制器
+關(guān)注
關(guān)注
114文章
17019瀏覽量
183245 -
定時(shí)器
+關(guān)注
關(guān)注
23文章
3290瀏覽量
117413 -
數(shù)模轉(zhuǎn)換器
+關(guān)注
關(guān)注
14文章
1055瀏覽量
84023 -
PWM波
+關(guān)注
關(guān)注
0文章
100瀏覽量
17281 -
STM32F4
+關(guān)注
關(guān)注
3文章
197瀏覽量
28871
發(fā)布評(píng)論請(qǐng)先 登錄
STM32 TIM定時(shí)器的外部計(jì)數(shù)功能 計(jì)數(shù)值能不能為1啊?
STM32 TIM定時(shí)器
STM32 TIM定時(shí)器的使用(1)——定時(shí) 精選資料分享
stm32TIM定時(shí)器 精選資料分享
萌新求助,求STM32 TIM定時(shí)器的庫(kù)函數(shù)學(xué)習(xí)筆記
STM32定時(shí)器基本計(jì)數(shù)原理解析

STM32-通用定時(shí)器-定時(shí)器中斷

STM32---定時(shí)器知多少

STM32定時(shí)器學(xué)習(xí)---基本定時(shí)器

STM32 TIM定時(shí)器的使用(5)——PWM驅(qū)動(dòng)電調(diào)控制無刷電機(jī)

STM32的通用定時(shí)器
STM32速成筆記(6)—定時(shí)器

評(píng)論