STM32定時器----TIMx->SR寄存器

在研究stm32定時器時發現,當進入定時器的中斷時,定時器計數器以及中斷接收時正常運行的,並沒有因爲進入中斷而停止

具體看以下分析:

定時器初始化代碼:

//TIM捕獲通道開啓宏定義,1:開啓 0:關閉  
#define  TIM_ICCH1        1      
#define  TIM_ICCH2        1  
#define  TIM_ICCH3        1  
#define  TIM_ICCH4        1  
  
//最小捕獲頻率:72000000/(120*60000)=10Hz  
#define  TIM_ICARR        60000             //重裝載寄存器填充值  
#define  TIM_ICPSC        720               //分頻係數    
#define  TIM_ICFIT        0x00              //定時器捕獲濾波係數    
#define  TIM_OverF        (10-1)            //最大ARR溢出次數  
  
#define  TIM_ICSR         (u16 *)&TIM3->SR   //選擇定時器的SR寄存器地址  
#define  TIM_ICCCR        (u16 *)&TIM3->CCR1 //選擇定時器的CCR寄存器地址  

void TIM3_PWMICInit(void)  
{  
    u8 i=0;  
      
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseInitStruct;  
    TIM_ICInitTypeDef  TIM_ICInitStruct;  
    NVIC_InitTypeDef  NVIC_InitStruct;  
    GPIO_InitTypeDef  GPIO_InitStruct;  
      
    /***********************NVIC配置*****************************/  
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);  
      
    NVIC_InitStruct.NVIC_IRQChannel = TIM3_IRQn;  
    NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;  
    NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;  
    NVIC_InitStruct.NVIC_IRQChannelSubPriority = 2;  
      
    NVIC_Init(&NVIC_InitStruct);  
      
    /**********************TIM3 GPIO配置*****************************/  
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOA, ENABLE);  
      
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;  
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;  
  
    /**********************初始化TIM3*******************************/  
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);  
      
    TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;  
    TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;  
    TIM_TimeBaseInitStruct.TIM_Period = TIM_ICARR-1;        
    TIM_TimeBaseInitStruct.TIM_Prescaler = TIM_ICPSC-1;       
  
    TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStruct);  
      
    /**********************初始化TIM3 IC*******************************/  
    TIM_ICInitStruct.TIM_ICFilter = TIM_ICFIT;  
    TIM_ICInitStruct.TIM_ICPolarity = TIM_ICPolarity_Falling;  
    TIM_ICInitStruct.TIM_ICPrescaler = TIM_ICPSC_DIV1;  
    TIM_ICInitStruct.TIM_ICSelection = TIM_ICSelection_DirectTI ;  
  
    if(TIM_ICCH1==1)  
    {  
      GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6;  
      GPIO_Init(GPIOA,&GPIO_InitStruct);  
      TIM_ICInitStruct.TIM_Channel = TIM_Channel_1;  
      TIM_ICInit(TIM3, &TIM_ICInitStruct);  
    }  
      
    if(TIM_ICCH2==1)  
    {  
      GPIO_InitStruct.GPIO_Pin = GPIO_Pin_7;  
      GPIO_Init(GPIOA,&GPIO_InitStruct);  
      TIM_ICInitStruct.TIM_Channel = TIM_Channel_2;  
      TIM_ICInit(TIM3, &TIM_ICInitStruct);  
    }  
      
     if(TIM_ICCH3==1)  
       {  
      GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;  
      GPIO_Init(GPIOB,&GPIO_InitStruct);  
      TIM_ICInitStruct.TIM_Channel = TIM_Channel_3;  
      TIM_ICInit(TIM3, &TIM_ICInitStruct);    
    }  
      
    if(TIM_ICCH4==1)  
    {  
      GPIO_InitStruct.GPIO_Pin = GPIO_Pin_1;  
      GPIO_Init(GPIOB,&GPIO_InitStruct);  
      TIM_ICInitStruct.TIM_Channel = TIM_Channel_4;  
      TIM_ICInit(TIM3, &TIM_ICInitStruct);  
    }  
  
    TIM_ITConfig(TIM3, TIM_IcChannel,ENABLE);  
    TIM_Cmd(TIM3, ENABLE);  
    TIM_Ic.Ccr1=0;
}  

中斷代碼:

void TIM3_IRQHandler(void)  
{  
    u8  j = 0;  
    u16 i = 0, *pTimFre, *pTimCcrT, *pTimOver, *pTimSR, *pTimCCR;  
   
	  TIM_Ic.Ccr1++;
	  TIM3->SR = 0;
	  if(TIM_Ic.Ccr1>100) 
		{
		        while( (TIM3->SR&0x001f) != 0x001f){}
			 LCD_ClearPart(Clear_ALL,RED);
			while(1);
		}
	  else return;
	 
     ...........(省略)
}  
仿真圖中,CC1F中斷狀態位是爲0的,其他爲1,。這是引文CH1的PWM被斷開了,而其他的則是連接。具體看圖中黃色與紅色

的線:




然後,連接CH1與PWM,再次仿真運行,結果如下圖:



可見CC1F標誌位已經被置1了,說明在中斷函數中,定時器時正常運行的,並沒有因爲進入中斷而停止。



發佈了31 篇原創文章 · 獲贊 35 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章