关于STM32通用定时器更新事件中断

时间:2022-02-27 23:31:53

 //定时器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;更新事件发生,并产生了更新事件中断,同时,对计数器重新初始化