1. 程式人生 > >關於STM32通用定時器更新事件中斷

關於STM32通用定時器更新事件中斷

 //定時器3中斷服務程式 
 void TIM3_IRQHandler(void)
 {                 
  if(TIM3->SR&0X0001) //產生更新事件
  {
   LED1=!LED1;
   LED0=!LED0;                             
  }      
  TIM3->SR&=~(1<<0);//清除中斷標誌位     
 }
 //通用定時器中斷初始化
 //這裡時鐘選擇為APB1的2倍,而APB1為36M
 //arr:自動重灌值。
 //psc:時鐘預分頻數
 //這裡使用的是定時器3!
 void Timerx_Init(u16 arr,u16 psc)
 { 
  TIM3->SMCR&=0xfffffff8;   //從模式控制暫存器設定預分頻時鐘由內部時鐘提供
  RCC->APB1ENR|=1<<1;       //TIM3時鐘使能    
  TIM3->ARR=arr;            //設定計數器自動重灌值 
  TIM3->PSC=psc;            //預分頻器7200,得到10Khz的計數時鐘,//CK_CNT=Fck_psc/([15:0]+1)
  TIM3->CR1|=1<<4;          //計數器向下計數
  TIM3->CR1|=1<<7;          //每一次更新事件(UEV)時,才把預裝在暫存器的內容送到影子暫存器
  TIM3->CR1&=0xfffffffd;    //設定UDIS允許更新事件(UEV)
  TIM3->CR1&=0xfffffffb;   //設定更新請求源                
  TIM3->CR1|=0x01;          //使能計數器
  TIM3->DIER|=1<<0;         //允許更新中斷          
  MY_NVIC_Init(1,3,TIM3_IRQChannel,2);//搶佔1,子優先順序3,組2         
 } 
 int main(void)
{   
  Stm32_Clock_Init(9); //系統時鐘設定72MHZ
 delay_init(72);      //延時初始化
 uart_init(72,9600);  //串列埠初始化
 LED_Init();      //初始化與LED連線的硬體介面
 Timerx_Init(5000,7199);//10Khz的計數頻率,計數到5000為500ms      
 while(1)
 {
    delay_ms(200);
    TIM3->EGR|=0x0001;
 
 
 
 }
}

這樣設定以後,個人做了測試,可以在計數器在計數到2000時,設定了TIM3->EGR|=0x0001;更新事件發生,併產生了更新事件中斷,同時,對計數器重新初始化