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了,说明在中断函数中,定时器时正常运行的,并没有因为进入中断而停止。



  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值