一、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周期的过程中,其他程序正常运转。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐