一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

STM32 TIM—基本定時器

冬至子 ? 來源:紛紜雜談 ? 作者:CY_CHEN ? 2023-07-22 17:05 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

STM32F4xx系列控制器有共有14個TIM定時器。其中2個高級控制定時器TIM1和TIM8、10 個通用定時器TIM2TIM5和TIM9TIM14、 2個基本定時器TIM6和TIM7。

各個定時器的特性如下:

圖片

三種定時器中基本定時器是最簡單的,功能少,結(jié)構(gòu)簡單,我們先從簡單的開始入手。

基本定時器主要兩個功能,第一就是基本定時功能,生成時基,第二就是專門用于驅(qū)動數(shù)模轉(zhuǎn)換器(DAC)。由于PWM波可以實現(xiàn)DAC的輸出,所以一般也就不用到基本定時器的第二個功能了。控制器的兩個基本定時器 功能完全一樣,但所用資源彼此都完全獨立,可以同時使用。

基本定時器 TIM6 和 TIM7是一個 16位向上遞增的定時器,當(dāng)在自動重載寄存器(TIMx_ARR)添加一個計數(shù)值后并使能 TIMx,計數(shù)寄存器(TIMx_CNT)就會從 0 開始遞增,當(dāng) TIMx_CNT 的數(shù)值與 TIMx_ARR值相同時就會生成事件并把 TIMx_CNT 寄存器清 0,完成一次循環(huán)過程。如果沒有停止定時器就循環(huán)執(zhí)行上述過程。

基本定時器框圖

圖片

時基單元

編程定時器的主要模塊由一個 16 位遞增計數(shù)器及其相關(guān)的自動重載寄存器組成。計數(shù)器的時鐘可通過預(yù)分頻器進(jìn)行分頻。

計數(shù)器、自動重載寄存器和預(yù)分頻器寄存器可通過軟件進(jìn)行讀寫。即使在計數(shù)器運行時也可執(zhí)行讀寫操作。

時基單元包括:

● 計數(shù)器寄存器 (TIMx_CNT)

● 預(yù)分頻器寄存器 (TIMx_PSC)

● 自動重載寄存器 (TIMx_ARR)

自動重載寄存器是預(yù)裝載的。每次嘗試對自動重載寄存器執(zhí)行讀寫操作時,都會訪問預(yù)裝載寄存器。預(yù)裝載寄存器的內(nèi)容既可以直接傳送到影子寄存器,也可以在每次發(fā)生更新事件 UEV 時傳送到影子寄存器,這取決于 TIMx_CR1 寄存器中的自動重載預(yù)裝載使能位 (ARPE)。當(dāng)計數(shù)器達(dá)到上溢值并且 TIMx_CR1 寄存器中的 UDIS 位為 0 時,將發(fā)送更新事件。該更新事件也可由軟件產(chǎn)生。

計數(shù)器由預(yù)分頻器輸出 CK_CNT 提供時鐘,僅當(dāng) TIMx_CR1 寄存器中的計數(shù)器啟動位 (CEN)置 1 時,才會啟動計數(shù)器。

請注意,實際的計數(shù)器使能信號 CNT_EN 在 CEN 置 1 的一個時鐘周期后被置 1。

預(yù)分頻器

預(yù)分頻器可對計數(shù)器時鐘頻率進(jìn)行分頻,分頻系數(shù)介于 1 和 65536 之間。該預(yù)分頻器基于TIMx_PSC 寄存器中的 16 位寄存器所控制的 16 位計數(shù)器。由于 TIMx_PSC 控制寄存器有緩沖,因此可對預(yù)分頻器進(jìn)行實時更改。而新的預(yù)分頻比將在下一更新事件發(fā)生時被采用。

計數(shù)模式

計數(shù)器從 0 計數(shù)到自動重載值(TIMx_ARR 寄存器的內(nèi)容),然后重新從 0 開始計數(shù)并生成計數(shù)器上溢事件。

每次發(fā)生計數(shù)器上溢時會生成更新事件,或?qū)?TIMx_EGR 寄存器中的 UG 位置 1(通過軟件或使用從模式控制器)也可以生成更新事件。

通過軟件將 TIMx_CR1 寄存器中的 UDIS 位置 1 可禁止 UEV 事件。這可避免向預(yù)裝載寄存器寫入新值時更新影子寄存器。這樣,直到 UDIS 位中寫入 0 前便不會生成任何更新事件,但計數(shù)器和預(yù)分頻器計數(shù)器都會重新從 0 開始計數(shù)(而預(yù)分頻比保持不變)。此外,如果TIMx_CR1 寄存器中的 URS 位(更新請求選擇)已置 1,則將 UG 位置 1 會生成更新事件UEV,但不會將 UIF 標(biāo)志置 1(因此,不會發(fā)送任何中斷或 DMA 請求)。

發(fā)生更新事件時,將更新所有寄存器且將更新標(biāo)志(TIMx_SR 寄存器中的 UIF 位)置 1(取決于 URS 位):

● 使用預(yù)裝載值(TIMx_PSC 寄存器的內(nèi)容)重新裝載預(yù)分頻器的緩沖區(qū)

● 使用預(yù)裝載值 (TIMx_ARR) 更新自動重載影子寄存器

時鐘源

計數(shù)器時鐘由內(nèi)部時鐘 (CK_INT) 源提供。

CEN(TIMx_CR1 寄存器中)和 UG 位(TIMx_EGR 寄存器中)為實際控制位,并且只能通過軟件進(jìn)行更改(保持自動清零的 UG 除外)。當(dāng)對CEN 位寫入 1 時,預(yù)分頻器的時鐘就由內(nèi)部時鐘 CK_INT 提供。

接下來了解基本定時器的相關(guān)寄存器:

TIM6 和 TIM7 控制寄存器 1 (TIMx_CR1)

圖片

位 7 ARPE:自動重載預(yù)裝載使能 (Auto-reload preload enable)

0:TIMx_ARR 寄存器不進(jìn)行緩沖。

1:TIMx_ARR 寄存器進(jìn)行緩沖。

位 3 OPM:單脈沖模式 (One-pulse mode)

0:計數(shù)器在發(fā)生更新事件時不會停止計數(shù)

1:計數(shù)器在發(fā)生下一更新事件時停止計數(shù)(將 CEN 位清零)。

位 2 URS:更新請求源 (Update request source)

此位由軟件置 1 和清零,用以選擇 UEV 事件源。

0:使能時,所有以下事件都會生成更新中斷或 DMA 請求。此類事件包括:

— 計數(shù)器上溢/下溢

— 將 UG 位置 1

— 通過從模式控制器生成的更新事件

1:使能時,只有計數(shù)器上溢/下溢會生成更新中斷或 DMA 請求。

位 1 UDIS:更新禁止 (Update disable)

此位由軟件置 1 和清零,用以使能/禁止 UEV 事件生成。

0:使能 UEV。更新 (UEV) 事件可通過以下事件之一生成:

— 計數(shù)器上溢/下溢

— 將 UG 位置 1

— 通過從模式控制器生成的更新事件

然后更新影子寄存器的值。

1:禁止 UEV。不會生成更新事件,各影子寄存器的值(ARR 和 PSC)保持不變。但如果將UG 位置 1,或者從從模式控制器接收到硬件復(fù)位,則會重新初始化計數(shù)器和預(yù)分頻器。

位 0 CEN:計數(shù)器使能 (Counter enable)

0:禁止計數(shù)器

1:使能計數(shù)器

注意:只有事先通過軟件將 CEN 位置 1 ,才可以使用門控模式。而觸發(fā)模式可通過硬件自動將CEN 位置 1 。

在單脈沖模式下,當(dāng)發(fā)生更新事件時會自動將 CEN 位清零。

TIM6 和 TIM7 控制寄存器 2 (TIMx_CR2)

圖片

位 6:4 MMS:主模式選擇 (Master mode selection)

這些位用于選擇主模式下將要發(fā)送到從定時器以實現(xiàn)同步的信息 (TRGO)。這些位的組合如下:

000:復(fù)位——TIMx_EGR 寄存器中的 UG 位用作觸發(fā)輸出 (TRGO)。如果復(fù)位由觸發(fā)輸入生成(從模式控制器配置為復(fù)位模式),則 TRGO 上的信號相比實際復(fù)位會有延遲。

001:使能——計數(shù)器使能信號 (CNT_EN) 用作觸發(fā)輸出 (TRGO)。該觸發(fā)輸出可用于同時啟動多個定時器,或者控制在一段時間內(nèi)使能從定時器。計數(shù)器使能信號由 CEN 控制位與門控模式下的觸發(fā)輸入的邏輯或運算組合而成。

當(dāng)計數(shù)器使能信號由觸發(fā)輸入控制時,TRGO 上會存在延遲,選擇主/從模式時除外(請參見TIMx_SMCR 寄存器中對 MSM 位的說明)。

010:更新——選擇更新事件作為觸發(fā)輸出 (TRGO)。例如,主定時器可用作從定時器的預(yù)分頻器。

TIM6 和 TIM7 DMA/ 中斷使能寄存器 (TIMx_DIER)

圖片

位 8 UDE:更新 DMA 請求使能 (Update DMA request enable)

0:禁止更新 DMA 請求。

1:使能更新 DMA 請求。

位 0 UIE:更新中斷使能 (Update interrupt enable)

0:禁止更新中斷。

1:使能更新中斷。

TIM6 和 TIM7 狀態(tài)寄存器 (TIMx_SR)

圖片

位 0 UIF:更新中斷標(biāo)志 (Update interrupt flag)

該位在發(fā)生更新事件時通過硬件置 1。但需要通過軟件清零。

0:未發(fā)生更新。

1:更新中斷掛起。該位在以下情況下更新寄存器時由硬件置 1:

— 上溢或下溢并且當(dāng) TIMx_CR1 寄存器中 UDIS = 0 時。

— 當(dāng)由于 TIMx_CR1 寄存器中 URS = 0 且 UDIS = 0 而通過軟件使用 TIMx_EGR 寄存器中的 UG 位重新初始化 CNT 時。

TIM6 和 TIM7 事件生成寄存器 (TIMx_EGR)

圖片

位 0 UG:更新生成 (Update generation)

該位可通過軟件置 1,并由硬件自動清零。

0:不執(zhí)行任何操作。

1:重新初始化定時器計數(shù)器并生成寄存器更新事件。請注意,預(yù)分頻器計數(shù)器也將清零(但預(yù)分頻比不受影響)。

基本定時器初始化函數(shù)和中斷處理函數(shù)如下

void Timer6_Init(u16 arr,u16 pre)
{
  u32 prigroup = 0;
  u32 priority = 0;
  //1. 開時鐘
  RCC- >APB1ENR  |= 1< 4;
  //2. 設(shè)置模式
//  TIM6- >CR1  = 0;
  TIM6- >CR1 |= 1< 7;    //開啟預(yù)裝載功能
  TIM6- >CR1 &= ~(1< 3);  //連續(xù)計數(shù)
  TIM6- >CR1 |= 1< 2;    //UG置1,產(chǎn)生更新,但不產(chǎn)生中斷
  TIM6- >CR1 |= 1< 1;    //暫時不產(chǎn)生更新
  TIM6- >CR1 &= ~(1< 0);  //配置完成前,先關(guān)閉計數(shù)器
  //3. 設(shè)置預(yù)分頻
  Timer6_SetPre(pre);
  //4. 設(shè)置自動重裝載
  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. 更新并開啟計數(shù)器
    TIM6- >CNT = 0;
    //允許更新
    TIM6- >CR1 &= ~(1< 1);
    //產(chǎn)生更新
    TIM6- >EGR |= 1< 0;
    //開啟定時器
    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)行測試

#include "stm32f4xx.h"
#include "led.h"
#include "timer.h"


int main()
{
  LED_Init();
  Timer6_Init(18000,1250);    //一個周期0.125s

  while(1)
  {
    if(led_flag)              
        LED_Toggle();    //0.25sLED翻轉(zhuǎn)一次,1s翻轉(zhuǎn)四次
  }
}
```至此,基本定時器的功能就結(jié)束了,對于通用定時器和高級定時器的定時功能與基本定時器使用方法一樣,這里就不再贅述。
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 控制器
    +關(guān)注

    關(guān)注

    114

    文章

    17048

    瀏覽量

    183518
  • 定時器
    +關(guān)注

    關(guān)注

    23

    文章

    3297

    瀏覽量

    117573
  • 數(shù)模轉(zhuǎn)換器

    關(guān)注

    14

    文章

    1062

    瀏覽量

    84070
  • PWM波
    +關(guān)注

    關(guān)注

    0

    文章

    100

    瀏覽量

    17313
  • STM32F4
    +關(guān)注

    關(guān)注

    3

    文章

    201

    瀏覽量

    28917
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    STM32 TIM定時器的外部計數(shù)功能 計數(shù)值能不能為1???

    在利用STM32定時器TIM3和TIM4進(jìn)行外部計數(shù)脈沖個數(shù)時,發(fā)現(xiàn)將重裝載寄存的值設(shè)為0時的計數(shù)值不為1,而是不能進(jìn)中斷;所以問一下,
    發(fā)表于 05-19 16:00

    STM32 TIM定時器

    各位大蝦幫忙看一下,我想在有數(shù)據(jù)操作時清除TIM2的計數(shù)值,當(dāng)沒有數(shù)據(jù)操作是讓TIM2 正常計數(shù),是不是在TIM2中斷里調(diào)用TIM_SetCounter(
    發(fā)表于 03-12 14:48

    STM32 TIM定時器的使用(1)——定時 精選資料分享

    1、定時器簡介STM32中,定時器的應(yīng)用非常廣泛,涉及計時、信號檢測、電機控制等等,并且定時器章節(jié)的介紹在STM32F1的手冊里面也占據(jù)了大
    發(fā)表于 08-05 06:50

    stm32TIM定時器 精選資料分享

    簡介? STM32F1 系列中有 8 個定時器,分為基本定時器,通用定時器和高級定時器。? 基本定時器
    發(fā)表于 08-19 07:00

    如何去使用STM32 TIM定時器

    定時器總共分為哪幾種?如何去使用STM32TIM定時器呢?
    發(fā)表于 10-27 07:18

    STM32 TIM定時器怎么使用?

    輸入捕獲的原理是什么?STM32 TIM定時器怎么使用?
    發(fā)表于 11-18 06:32

    stm32TIM定時器的工作框圖求分享

    stm32TIM定時器的工作框圖求分享
    發(fā)表于 11-24 06:54

    萌新求助,求STM32 TIM定時器的庫函數(shù)學(xué)習(xí)筆記

    萌新求助,求STM32 TIM定時器的庫函數(shù)學(xué)習(xí)筆記
    發(fā)表于 11-24 06:31

    STM32定時器基本計數(shù)原理解析

    STM32TIM定時器分為三類:基本定時器、通用定時器和高級定時器。從分類來看就知道
    發(fā)表于 12-27 16:20 ?1.9w次閱讀
    <b class='flag-5'>STM32</b><b class='flag-5'>定時器</b>基本計數(shù)原理解析

    STM32-通用定時器-定時器中斷

    1STM32定時器STM32F103ZET6一共有8個定時器,其中分別為:高級定時器TIM1
    發(fā)表于 11-26 15:36 ?16次下載
    <b class='flag-5'>STM32</b>-通用<b class='flag-5'>定時器</b>-<b class='flag-5'>定時器</b>中斷

    STM32---定時器知多少

    14,15,16章節(jié),里面對定時器的知識有詳細(xì)的介紹。STM32F1系列的開發(fā)板一共有8個定時器,按照功能的不同可以分為:高級定時器TIM
    發(fā)表于 11-30 14:36 ?19次下載
    <b class='flag-5'>STM32</b>---<b class='flag-5'>定時器</b>知多少

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

    STM32F1系列的產(chǎn)品,除了互聯(lián)網(wǎng)產(chǎn)品外,工作8個,3種定時器,其中一種就是基本定時器。那么STM32單片機的基本定時器如何操作以及編程呢
    發(fā)表于 12-02 14:06 ?28次下載
    <b class='flag-5'>STM32</b><b class='flag-5'>定時器</b>學(xué)習(xí)---基本<b class='flag-5'>定時器</b>

    STM32 TIM定時器的使用(5)——PWM驅(qū)動電調(diào)控制無刷電機

    CCR的值,從而使PWM的占空比跟隨按鍵改變,將PWM信號輸入電調(diào),最終實現(xiàn)對無刷電機的控制。3、實驗用具正點原子STM32F1精英板新西達(dá)30A無刷電調(diào)A2212 1000KV無刷電機4、程序設(shè)計分析程序設(shè)計可以分為三大塊:定時器、按鍵配置電機控制程序按鍵中斷服務(wù)函數(shù)
    發(fā)表于 01-14 12:18 ?19次下載
    <b class='flag-5'>STM32</b> <b class='flag-5'>TIM</b><b class='flag-5'>定時器</b>的使用(5)——PWM驅(qū)動電調(diào)控制無刷電機

    STM32的通用定時器

    STM32F1 的定時器非常多,由 2 個基本定時器TIM6、TIM7)、4 個通用定時器
    的頭像 發(fā)表于 02-10 14:47 ?3825次閱讀

    STM32速成筆記(6)—定時器

    關(guān)于什么是定時器,簡單來講,就是是用來定時的。STM32F103ZET6有兩個基本定時器TIM6和TIM
    的頭像 發(fā)表于 10-24 09:41 ?5302次閱讀
    <b class='flag-5'>STM32</b>速成筆記(6)—<b class='flag-5'>定時器</b>