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

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

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

STM32定時(shí)器的分類及中斷原理

CHANBAEK ? 來源:不懂幽默的秦二 ? 作者:diandianmo ? 2023-01-12 17:29 ? 次閱讀

本文主要介紹常規(guī)定時(shí)器中的TIM3,實(shí)現(xiàn)定時(shí)器中斷的功能。STM32定時(shí)器的分類在其中一篇文章中已經(jīng)介紹過,本文主要內(nèi)容主要介紹定時(shí)器的基礎(chǔ)功能-定時(shí)器中斷,對(duì)于STM32定時(shí)器分類簡單復(fù)習(xí)一下。

一、STM32定時(shí)器的分類

1.1 按照內(nèi)核、外核、特定、常規(guī)分為4大類:

1)內(nèi)核定時(shí)器:Systick

2)外設(shè)定時(shí)器:特定應(yīng)用定時(shí)器+常規(guī)定時(shí)器

3)特定應(yīng)用定時(shí)器:LPTIM,RTC,WTD,HRTIM

4)常規(guī)定時(shí)器:基本定時(shí)器TIM6&TIM7)、通用定時(shí)器(TIM2TIM5,TIM9TIM14)、高級(jí)定時(shí)器(TIM1&TIM8)

1.2 CPU時(shí)序

此處我們提一下學(xué)習(xí)單片機(jī)原理的課程時(shí),提到的幾個(gè)CPU時(shí)序。

振蕩周期:為單片機(jī)提供定時(shí)信號(hào)的振蕩源的周期。

狀態(tài)周期:1個(gè)狀態(tài)周期=2個(gè)振蕩周期

機(jī)器周期:1個(gè)機(jī)器周期=6個(gè)狀態(tài)周期=12個(gè)振蕩周期

指令周期:完成1條指令所占用的全部時(shí)間,以機(jī)器周期為單位。

以12MHz外接晶振為例

振蕩周期=1/12us,相當(dāng)于1/12*10^6,所以單位為us;

狀態(tài)周期=1/6us

機(jī)器周期=1us

指令周期=1~4us

STM32共有14組常規(guī)定時(shí)器,其實(shí)也可以稱為計(jì)數(shù)器,定時(shí)器/計(jì)數(shù)器的工作過程是自動(dòng)完成的,不需要CPU的參與,互相獨(dú)立,執(zhí)行不同的任務(wù),可以增加單片機(jī)的效率。

二、定時(shí)器中斷原理

2.1 何為定時(shí)器中斷:定時(shí)器中斷是由單片機(jī)中的定時(shí)器溢出而申請(qǐng)的中斷。

提到中斷,必須滿足幾個(gè)要素: 中斷源, 中斷請(qǐng)求 , 中斷優(yōu)先級(jí)。 使CPU發(fā)生中斷的事件稱為中斷源,中斷源向CPU發(fā)出中斷請(qǐng)求,CPU暫時(shí)中斷原來執(zhí)行的事件A轉(zhuǎn)去執(zhí)行事件B,事件B處理完成后繼續(xù)返回原先中斷的位置(該過程稱為中斷返回,原先中斷的地方稱為斷點(diǎn)),繼續(xù)執(zhí)行原先的事件。

2.2 中斷流程可以用下圖表示:

圖片

圖片

2.3 中斷優(yōu)先級(jí)

在這篇文章里,介紹了STM32中的 中斷優(yōu)先級(jí)分組、中斷優(yōu)先級(jí)(搶占優(yōu)先級(jí)&響應(yīng)優(yōu)先級(jí))、嵌套向量中斷控制器NVIC等概念,那么我們定時(shí)器中斷也必須滿足這個(gè)規(guī)則---定時(shí)器中斷也要用NVIC來設(shè)置其中斷組別、搶占優(yōu)先級(jí)、響應(yīng)優(yōu)先級(jí)。

STM32中斷分組有5種

圖片

#define NVIC_PriorityGroup_0 ((uint32_t)0x700)

/*!< 0 bits for pre-emption priority 4 bits for subpriority */

#define NVIC_PriorityGroup_1 ((uint32_t)0x600)

/*!< 1 bits for pre-emption priority 3 bits for subpriority */

#define NVIC_PriorityGroup_2 ((uint32_t)0x500)

/*!< 2 bits for pre-emption priority 2 bits for subpriority */

#define NVIC_PriorityGroup_3 ((uint32_t)0x400)

/*!< 3 bits for pre-emption priority1 bits for subpriority */

#define NVIC_PriorityGroup_4 ((uint32_t)0x300)

/*!< 4 bits for pre-emption priority 0 bits for subpriority */

在函數(shù)中要調(diào)用

void MY_NVIC_Init(u8 NVIC_PreemptionPriority,u8 NVIC_SubPriority,u8 NVIC_Channel,u8 NVIC_Group)

實(shí)現(xiàn)對(duì)某一個(gè)中斷的中斷分組和優(yōu)先級(jí)配置。

與定時(shí)器配置緊密相關(guān)的就是自動(dòng)重裝載計(jì)數(shù)器(CNT)和預(yù)分頻器(PSC),初始化定時(shí)器就是對(duì)定時(shí)器的CNT、PSC進(jìn)行設(shè)置。下面介紹一下與本文密切相關(guān)的幾個(gè)通用定時(shí)器的寄存器

三、定時(shí)器相關(guān)寄存器及中斷編程

3.1****定時(shí)器相關(guān)寄存器

3.1.1 控制寄存器TIMx_CR1

圖片

位0 CEN:計(jì)數(shù)器使能,0:禁止計(jì)數(shù)器,1,使能計(jì)數(shù)器

注意:只有事先通過軟件將CEN位置去,才可以使用外部時(shí)鐘、門控模式、編碼器模式,而觸發(fā)模式可以通過硬件自動(dòng)將CEN置1;在單脈沖模式下,當(dāng)發(fā)生更新事件時(shí)會(huì)自動(dòng)將CEN位清零。

本實(shí)驗(yàn)中,我們只用到了TIMx_CR1的最低位,也就是計(jì)數(shù)器使能位,該位必須置1,才能讓定時(shí)器開始計(jì)數(shù)。

3.1.2 DMA中斷使能寄存器 TIMx_DIER

圖片

位0 UIE:更新中斷使能,0:禁止更新中斷,1:使能更新中斷

TIMx_DIER是一個(gè)16bit的寄存器,對(duì)于要實(shí)現(xiàn)的中斷試驗(yàn),我們僅關(guān)心第0bit,因?yàn)槎〞r(shí)器中斷實(shí)驗(yàn)要用到定時(shí)器的更新中斷,所以將該位置為1,表示允許更新時(shí)間所產(chǎn)生的中斷。

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

圖片

位0:15 PSC:預(yù)分頻器值。(范圍是0~65535)

表示計(jì)數(shù)器時(shí)鐘頻率CK_INT 等于Fck_psc/(PSC[15:0]+1).PSC包含在每次發(fā)生更新事件時(shí)要裝載到實(shí)際預(yù)分頻器寄存器的值。(84MHz的CK_INT,那計(jì)數(shù)器的時(shí)鐘頻率為84/(PSC[15:0]+1)MHz,計(jì)數(shù)器時(shí)鐘的取值范圍為(0.00128~84)MHz,那么計(jì)數(shù)器時(shí)鐘周期為0.012us(84MHz)~781us(0.001MHz);

這個(gè)地方要注意:預(yù)分頻值=實(shí)際分頻值-1,如果要設(shè)定實(shí)際分頻值為8400(定時(shí)器的工作頻率為10kHz),那我們?cè)O(shè)定預(yù)分頻值為8399

也再復(fù)習(xí)一下定時(shí)器的時(shí)鐘知識(shí):

1.STM32總的有3種時(shí)鐘源,分為 內(nèi)部時(shí)鐘、外部時(shí)鐘、鎖相環(huán)倍頻輸出時(shí)鐘,包含LSI,LSE,HSI,HSE等;

2.系統(tǒng)時(shí)鐘為168MHz,其他時(shí)鐘都是通過分頻(系統(tǒng)時(shí)鐘除以一個(gè)分頻系數(shù))給系統(tǒng)的各板塊使用;

3.看下圖三個(gè)紅色框的部分,系統(tǒng)時(shí)鐘(以F407系列為例)是168MHZ,通過設(shè)置不同的分頻值給AHB總線,看第一個(gè)紅框,可以設(shè)置為1.2...512,然后AHB總線再分頻給APB分線,看第二個(gè)紅框,再次分頻的值可以為1.2.4.8.16,上面的是直接分頻過后給APBx外設(shè)時(shí)鐘使用,我們重點(diǎn)看第二根線,注意第三個(gè)紅框,如果APBx的分頻值設(shè)置為1,那么APBx的定時(shí)器時(shí)鐘的時(shí)鐘頻率設(shè)置為與APB一樣,如果是其他的數(shù)字,那么設(shè)置為APB的時(shí)鐘頻率的兩倍。通過查手冊(cè)知道兩個(gè)基本定時(shí)器的時(shí)鐘頻率都?xì)w屬于APB線上的,且APB1和APB2的分頻系數(shù)都不為1(可以通過中找到配置),因此基本定時(shí)器的時(shí)鐘頻率已經(jīng)確定。

圖片

看下面這張圖,在文件system.stm324fxx.c中可以找到,

第一行表示系統(tǒng)時(shí)鐘來源是HSE,之前提過,它是高速外部時(shí)鐘,由外部晶振產(chǎn)生,第二三行表示系統(tǒng)時(shí)鐘設(shè)置為168MHZ(由外部時(shí)鐘HSE倍頻實(shí)現(xiàn),具體這里不深究),第四五六行,分別表示AHB,APB1,APB2的分頻系數(shù),即分別設(shè)置為168MHZ,42MHZ,84MHZ。

注意,如前所述APB1的分頻值為4,不為1,故其包含的基本定時(shí)器模塊的時(shí)鐘頻率需乘2,即42×2為84MHZ。由此我們得知基本定時(shí)器的時(shí)鐘源為84MHZ。

圖片

1)內(nèi)部時(shí)鐘(CK_INT)

2)外部時(shí)鐘模式1:外部輸入引腳(TIx)

3)外部時(shí)鐘模式2:外部觸發(fā)輸入(ETR)用于TIM2.TIM3.TIM4

4)內(nèi)部觸發(fā)輸入(ITRx),使用定時(shí)器A作為B定時(shí)器的預(yù)分頻(A為B提供時(shí)鐘)

這些時(shí)鐘,具體選擇哪個(gè)可以通過TIMx_SMCR寄存器的相關(guān)位來設(shè)置,CK_INT時(shí)鐘是從APB1倍頻來的,除非APB1的時(shí)鐘分頻數(shù)設(shè)置為1,否則通用定時(shí)器TIMx的時(shí)鐘是APB1時(shí)鐘的2倍,當(dāng)APB1時(shí)鐘不分頻時(shí),通用定時(shí)器的時(shí)鐘就等于APB1的時(shí)鐘,這里還要注意的就是高級(jí)定時(shí)器以及TIM9~TIM11的時(shí)鐘是來自APB2。

3.1.4 TIMx_CNT計(jì)數(shù)器

圖片

位15:0 CNT[15:0]:計(jì)數(shù)器值,該寄存器存儲(chǔ)了當(dāng)前寄存器的計(jì)數(shù)值。范圍為065535,可以計(jì)時(shí)的范圍是051s(假定是分頻PSC設(shè)為65535,計(jì)數(shù)器時(shí)鐘頻率是84/65536MHz,每個(gè)時(shí)鐘脈沖周期為781us)

3.1.5自動(dòng)重載寄存器(TIMx_ARR)

圖片

位15:0 ARR[15:0]:自動(dòng)重載值。

ARR是要裝載到實(shí)際自動(dòng)重載寄存器的值。需要注意,該寄存器在物理上實(shí)際對(duì)應(yīng)著2個(gè)寄存器,一個(gè)是程序員可以直接配置的,另外一個(gè)是程序員看不到的,這個(gè)看不到的寄存器叫影子寄存器,在《STM32F4xx中文參考手冊(cè)》里面有提到,事實(shí)上真正起作用的是影子寄存器,根據(jù)TIMx_CR1寄存器中的APRE位的設(shè)置:APRE=0,預(yù)裝載寄存器的內(nèi)容可以隨時(shí)傳送到影子寄存器,此時(shí)兩者是連通的;而APRE=1時(shí),每一次更新事件(UEV)時(shí),才能把預(yù)裝載寄存器ARR的內(nèi)容傳送到影子寄存器。

3.1.6狀態(tài)寄存器(TIMx_SR)

圖片

位0 UIF:更新中斷標(biāo)志。

  • 該位在發(fā)生更新事件時(shí)通過硬件置1,但需要通過軟件清零。0:未發(fā)生更新,1:更新中斷掛起
  • 上溢或者下溢(對(duì)于TIM2~TIM5)以及當(dāng)TIMx_CR1寄存器UDIS=0時(shí),
  • TIMx_CR1中的寄存器中的URS=0且UDIS=0,并且由軟件使用TIMx_EGR寄存器中的UG位重新初始化CNT時(shí)。TIMx_CR1寄存器中的URS=0&UDIS=0,并且由CNT由觸發(fā)事件重新初始化。

3.2定時(shí)器中斷編程

3.2.1編程步驟

1)TIM3時(shí)鐘使能,通過APB1ENR的第1位來設(shè)置TIM3的時(shí)鐘,APB1的分頻系數(shù)是4,那么APB1為168/4=42MHz,TIM3時(shí)鐘是APB1時(shí)鐘的2倍,等于84MHz.

2)設(shè)置TIM3_ARR和TIM3_PSC的值,通過這兩個(gè)寄存器,設(shè)置自動(dòng)重裝值和分頻系數(shù),這兩個(gè)參數(shù)加上時(shí)鐘頻率決定了定時(shí)器的溢出事件。

3)設(shè)置TIM3_DIER允許更新中斷。因?yàn)槲覀円褂肨IM3的更新中斷,所以設(shè)置DIER的UIE位為1,使能更新中斷

4)允許TIM3工作。設(shè)置好定時(shí)器參數(shù)后,還需要開啟定時(shí)器,通過TIM3_CR1的CEN位來設(shè)置

5)TIM3中斷分組設(shè)置。配置完定時(shí)器后,因?yàn)橐a(chǎn)生中斷,必須要設(shè)置NVIC相關(guān)寄存器,以使能TIM3中斷。

6)編寫中斷服務(wù)函數(shù)。在中斷產(chǎn)生后,通過狀態(tài)寄存器的值來判斷此次產(chǎn)生的中斷屬于什么類型,然后執(zhí)行相關(guān)的操作,這里采用的是更新(溢出)中斷,所以要關(guān)注狀態(tài)寄存器的SR的最低位,在處理完成之后,將TIM3_SR的最低位寫0,來清除該中斷標(biāo)志。

以下是定時(shí)器3的中斷測試代碼

//通用定時(shí)器3中斷初始化
//時(shí)鐘選擇為APB1的2倍,APB1=42MHz
//arr:自動(dòng)重載值
//psc:時(shí)鐘預(yù)分頻數(shù)
//定時(shí)器溢出時(shí)間:Tout=((arr+1)*(psc+1))/ft
//ft=定時(shí)器的工作頻率,MHz
void TIM3_Int_Init(u16 arr,u16 psc)
{
RCC->APB1ENR|=1<<1;//TIM3時(shí)鐘使能    
 TIM3->ARR=arr;  //設(shè)定計(jì)數(shù)器自動(dòng)重裝值 
TIM3->PSC=psc;  //預(yù)分頻器  
TIM3->DIER|=1<<0;   //允許更新中斷  
TIM3->CR1|=0x01;    //使能定時(shí)器3
MY_NVIC_Init(1,3,TIM3_IRQn,2);//搶占1,子優(yōu)先級(jí)3,組2 }
//定時(shí)器3中斷服務(wù)程序   
void TIM3_IRQHandler(void)
{                         
  if(TIM3->SR&0X0001)//溢出中斷
  {
    LED1=!LED1;                                          
  }           
  TIM3->SR&=~(1<<0);//清除中斷標(biāo)志位       
}
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • STM32
    +關(guān)注

    關(guān)注

    2270

    文章

    10900

    瀏覽量

    356046
  • 計(jì)數(shù)器
    +關(guān)注

    關(guān)注

    32

    文章

    2256

    瀏覽量

    94575
  • 時(shí)鐘
    +關(guān)注

    關(guān)注

    10

    文章

    1733

    瀏覽量

    131484
  • 中斷
    +關(guān)注

    關(guān)注

    5

    文章

    898

    瀏覽量

    41502
  • 定時(shí)器
    +關(guān)注

    關(guān)注

    23

    文章

    3248

    瀏覽量

    114816
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    STM32定時(shí)器(一)PWM輸出

    STM32定時(shí)器分類眾多,按照內(nèi)核、外核標(biāo)準(zhǔn)分為兩部分:核內(nèi)定時(shí)器+核外定時(shí)器
    的頭像 發(fā)表于 07-21 14:51 ?4876次閱讀
    <b class='flag-5'>STM32</b><b class='flag-5'>定時(shí)器</b>(一)PWM輸出

    STM32定時(shí)器分類

    文章目錄STM32定時(shí)器分類定時(shí)器中斷實(shí)驗(yàn)計(jì)數(shù)時(shí)鐘頻率計(jì)數(shù)
    發(fā)表于 08-13 07:48

    定時(shí)器中斷應(yīng)用

    定時(shí)器中斷應(yīng)用。
    發(fā)表于 03-15 14:56 ?3次下載

    stm32定時(shí)器中斷程序

    STM32定時(shí)器是個(gè)強(qiáng)大的模塊,定時(shí)器使用的頻率也是很高的,定時(shí)器可以做一些基本的定時(shí),還可以做PWM輸出或者輸入捕獲功能。 以下是進(jìn)行
    發(fā)表于 10-12 16:59 ?1.3w次閱讀

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

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

    stm32定時(shí)器中斷與誤區(qū)

    在用到STM32定時(shí)器的更新中斷時(shí),發(fā)現(xiàn)有些情形下只要開啟定時(shí)器就立即進(jìn)入一次中斷。準(zhǔn)確說,只要使能更新
    發(fā)表于 06-17 15:48 ?2.7w次閱讀
    <b class='flag-5'>stm32</b><b class='flag-5'>定時(shí)器</b><b class='flag-5'>中斷</b>與誤區(qū)

    STM32——如何配置通用定時(shí)器中斷

    STM32定時(shí)器STM32F103ZET6一共有8個(gè)定時(shí)器,其中分別為:高級(jí)定時(shí)器(TIM1、TIM8);通用
    發(fā)表于 11-23 17:51 ?14次下載
    <b class='flag-5'>STM32</b>——如何配置通用<b class='flag-5'>定時(shí)器</b><b class='flag-5'>中斷</b>

    STM32定時(shí)器中斷整理

    目錄1、系統(tǒng)異常中斷2、外部中斷(全部)3、優(yōu)先級(jí)5、如何開關(guān)中斷示例6、搶斷優(yōu)先級(jí)、響應(yīng)優(yōu)先級(jí)說明7、定時(shí)器說明7.1基本定時(shí)器7.2高級(jí)
    發(fā)表于 11-23 18:06 ?3次下載
    <b class='flag-5'>STM32</b><b class='flag-5'>定時(shí)器</b>與<b class='flag-5'>中斷</b>整理

    STM32定時(shí)器-基本定時(shí)器

    目錄定時(shí)器分類基本定時(shí)器功能框圖講解基本定時(shí)器功能時(shí)鐘源計(jì)數(shù)時(shí)鐘計(jì)數(shù)自動(dòng)重裝載寄存
    發(fā)表于 11-23 18:21 ?31次下載
    <b class='flag-5'>STM32</b><b class='flag-5'>定時(shí)器</b>-基本<b class='flag-5'>定時(shí)器</b>

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

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

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

    STM32定時(shí)器知多少這里寫目錄標(biāo)題STM32---定時(shí)器知多少定時(shí)器分類
    發(fā)表于 11-30 14:36 ?19次下載
    <b class='flag-5'>STM32</b>---<b class='flag-5'>定時(shí)器</b>知多少

    STM32CubeMX_定時(shí)器中斷_PWM

    文章目錄前言STM32CubeMX新建工程基本定時(shí)器配置生成代碼定時(shí)器中斷PWM配置工程代碼前言STM32CubeMX_環(huán)境搭建_GPIO_
    發(fā)表于 12-05 13:51 ?13次下載
    <b class='flag-5'>STM32</b>CubeMX_<b class='flag-5'>定時(shí)器</b><b class='flag-5'>中斷</b>_PWM

    STM32定時(shí)器中斷顯示時(shí)間

    前言利用STM32定時(shí)器中斷,實(shí)現(xiàn)時(shí)間的顯示。我們知道利用定時(shí)器中斷只能進(jìn)行tick的計(jì)算,然而用來顯示時(shí)間我們應(yīng)該怎么辦呢?經(jīng)過項(xiàng)目的實(shí)
    發(fā)表于 12-24 18:56 ?21次下載
    <b class='flag-5'>STM32</b><b class='flag-5'>定時(shí)器</b><b class='flag-5'>中斷</b>顯示時(shí)間

    STM32定時(shí)器中斷應(yīng)用實(shí)例

    本文將介紹:通過STM32cube mx配置工程文件,實(shí)現(xiàn)定時(shí)器中斷的功能。
    的頭像 發(fā)表于 04-21 11:36 ?1951次閱讀
    <b class='flag-5'>STM32</b><b class='flag-5'>定時(shí)器</b><b class='flag-5'>中斷</b>應(yīng)用實(shí)例

    定時(shí)器中斷是什么意思,定時(shí)器中斷的工作原理

    定時(shí)器中斷是由單片機(jī)中的定時(shí)器溢出而申請(qǐng)的中斷。51單片機(jī)中有兩個(gè)定時(shí)器T0和T1。STM32
    的頭像 發(fā)表于 07-23 09:45 ?6184次閱讀