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