stm32寄存器版學習筆記 定時計數器中斷


STM32共有8個定時計數器,

高級定時器:   TIME1  TIME8

是通用定時器:TIME2~TIME5

基本定時器:     TIME6和TIME7

 

以TIME3通用定時器為例總結定時計數器的基本用法

一:TIM3時鍾使能

APB1外設時鍾使能寄存器(RCC_APB1ENR)

Eg:RCC->APB1ENR|=1<<1;  //使能TIM3時鍾

 二:設置TIM3_ARR和TIM3_PSC的值

通過這兩個寄存器來設置自動重裝的值以及分頻系數

 

自動重裝載寄存器(TIMx_ARR)

 

 

 

預分頻器(TIMx_PSC)

 

 三:設置TIM3_DIER允許更新中斷

 

 中斷使能寄存器(TIMx_DIER)

 

Eg:  TIM3->DIER|=1<<0;   //允許更新中斷

四:允許TIM3工作

控制寄存器1(TIMx_CR1)

 

 

CEN:使能計數器 位0  0:禁止計數器; 1:使能計數器

Eg:          TIM3->CR1|=0x01;    //使能定時器3

       TIM3->CR1|=1<<0;

五:TIM3中斷分組設置

直接調用MY_NVIC_Init()函數

Eg:MY_NVIC_Init(1,3,TIM3_IRQChannel,2);//搶占1,子優先級3,組2

 

 六:編寫中斷服務函數

狀態寄存器(TIMx_SR)

 

 

 

Eg:  if(TIM3->SR&0X0001)//溢出中斷

 

Eg:          //定時器3中斷服務程序 
  void TIM3_IRQHandler(void) //TIM3_Int_Init(5000,7199);  //10Khz的計數頻率,計數到5000為500ms//500ms中斷一次
  
    if(TIM3->SR&0X0001)  //溢出中斷
    {
      //add your code
    }
    TIM3->SR&=~(1<<0);  //清除中斷標志位 
  }

 六:關於溢出事件的計算

 

        因為Stm32_Clock_Init函數里面已經初始化APB1的時鍾為2分頻,所以APB1的時鍾是32MHz(系統時鍾72MHz)。

        從STM32內部時鍾樹圖可知:

        當APB1的時鍾分頻數為1時,TIM2~7的時鍾為APB1的時鍾;

        而如果APB1的時鍾分頻數不為1,那么TIM2~7的時鍾頻率是APB1時鍾的兩倍。

         因此TIM3的時鍾為72MHz,再根據arr和psc即可計算中斷時間

                      Tout = ( (arr+1) * (psc+1) ) / Tclk

 

       其中,Tclk為TIM3的輸入時鍾頻率(單位:MHz)。

       Tout為TIM3的溢出時間(單位:us)。

        Eg:void TIM3_Int_Init(u16 arr,u16 psc)----->TIM3_Int_Init(5000,7199);//10Khz的計數頻率,計數到5000為500ms 

 

       Tout = (5000 * 7200)/72 = 500,000us = 500ms

 

 

 

示例程序

 //定時器3中斷服務程序      

 void TIM3_IRQHandler(void)      //TIM3_Int_Init(5000,7199);//10Khz的計數頻率,計數到5000500ms   

          //500ms中斷一次 

   {                                       

     if(TIM3->SR&0X0001)//溢出中斷 

     { 

         LED1=!LED1;                                                                     9     }                   

     TIM3->SR&=~(1<<0);//清除中斷標志位         

 }

 //通用定時器中斷初始化

 //這里時鍾選擇為APB12倍,而APB136M

 //arr:自動重裝值。

 //psc:時鍾預分頻數

 //這里使用的是定時器3!

 void TIM3_Int_Init(u16 arr,u16 psc)

 {

     RCC->APB1ENR|=1<<1;    //TIM3時鍾使能   

      TIM3->ARR=arr;      //設定計數器自動重裝值

     TIM3->PSC=psc;      //預分頻器設置

     TIM3->DIER|=1<<0;   //允許更新中斷               

     TIM3->CR1|=0x01;    //使能定時器3

      MY_NVIC_Init(1,3,TIM3_IRQn,2);//搶占1,子優先級3,組2                                  

 }

 

 int main(void) 

 {             

     Stm32_Clock_Init(9); //系統時鍾設置

     delay_init(72);         //延時初始化 

     uart_init(72,9600);  //串口初始化  

     LED_Init();               //初始化與LED連接的硬件接口 

     TIM3_Int_Init(5000,7199);//10Khz的計數頻率,計數到5000500ms   

        while(1)

     {

         LED0=!LED0;

         delay_ms(200);           

     }

 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM