测试STM32库函数TIM_SetCompare()的工作机制

一、TIM_SetCompare()函数的定义

  • 其中,TIM_SetCompareX()这个函数有四个,它们为:TIM_SetCompare1、TIM_SetCompare2、TIM_SetCompare3、TIM_SetCompare4,同时分别对应:CH1、CH2、CH3、CH4。
  • /**
      * @brief  Sets the TIMx Capture Compare1 Register value
      * @param  TIMx: where x can be 1 to 17 except 6 and 7 to select the TIM peripheral.
      * @param  Compare1: specifies the Capture Compare1 register new value.
      * @retval None
      */
    void TIM_SetCompare1(TIM_TypeDef* TIMx, uint16_t Compare1)
    {
      /* Check the parameters */
      assert_param(IS_TIM_LIST8_PERIPH(TIMx));
      /* Set the Capture Compare1 Register value */
      TIMx->CCR1 = Compare1;
    }
    

    二、各定时器下能输出PWM的GPIO口汇总


    三、实验程序

  • 该例程通过TIM_SetCompare()这个函数可以产生PWM波,该波形的理论周期为12.5毫秒。细心的读者可以发现,TIM_SetCompare()函数是放在while这个大循环中的,我们知道程序执行的速度是非常快的,以该例程为例,也意味着在12.5毫秒以内,TIM_SetCompare()这个函数会被执行多遍,那么会不会出现某一个PWM周期还没有完全执行完毕,TIM_SetCompare()这个函数又传递了新的占空比,将上一个未执行完毕的PWM周期给打断呢?
  • 本文就将探索该问题,一起来看看吧~
  •  int main(void)
     {		
     	u16 led0pwmval=0;
    	u8 dir=1;	
    	delay_init();	    	 //延时函数初始化	  
    	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); 	 //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
    	uart_init(115200);	 //串口初始化为115200
     	LED_Init();			     //LED端口初始化
     	TIM3_PWM_Init(899,0);	 //不分频。PWM频率=72000000/900=80Khz
    	 
       	while(1)
    	{	 
    		if(dir)led0pwmval++;
    		else led0pwmval--;
     		if(led0pwmval>300)dir=0;
    		if(led0pwmval==0)dir=1;										 
    		TIM_SetCompare2(TIM3,led0pwmval);		
    	}	 
     }
    

    四、示波器测试结果分析

    – 从示波器结果可以看出:
    1.执行TIM_SetCompare()函数会将每个PWM周期完整的运行完毕,不会存在还未运行完毕就被打断的情况;

    2.TIM_SetCompare2(TIM_TypeDef* TIMx, uint16_t Compare2)函数中的第二个入口参数“uint16_t Compare2”,它的值是在上一个周期运行完毕之后,系统再给它赋值的;

    3.TIM_SetCompare()函数的运行,并不会影响其他函数的正常运行,例如本例程中,运行TIM_SetCompare()函数并不会影响上面“if 函数”,TIM_SetCompare()在产生一个PWM周期的过程中,其他程序正常运转。

    物联沃分享整理
    物联沃-IOTWORD物联网 » 测试STM32库函数TIM_SetCompare()的工作机制

    发表评论