STM32F107的通用定时器PWM实验总结

STM32F107的通用定时器PWM实验总结

1.     STM32F107的通用定时器是指:  TIM2、TIM3、TIM4、TIM5、

2.     STM32F107的通用定时器(TIM2、TIM3、TIM4、TIM5)的模式有向上计数、向下计数、中央对齐模式。

向上计数模式:计数器从0计数到自动加载值(TIMx_ARR),然后重新从0开始计数并且产生一个计数器溢出事件。

向下计数模式:计数器从自动装入的值(TIMx_ARR)开始向下计数到0,然后从自动装入的值重新开始,并产生一个计数器向下溢出事件。

中央对齐模式(向上/向下计数):计数器从0开始计数到自动装入的值-1,产生一个计数器溢出事件,然后向下计数到1并且产生一个计数器溢出事件;然后再从0开始重新计数。

3.     STM32F107的通用定时器的时钟选择有多种,一般使用RCC提供的内部时钟TIMxCLK,  由APB1时钟分频提供。

4.     状态标志位获取和清除

FlagStatus TIM_GetFlagStatus(TIM_TypeDef* TIMx, uint16_tTIM_FLAG);

void TIM_ClearFlag(TIM_TypeDef* TIMx, uint16_t TIM_FLAG);

ITStatus TIM_GetITStatus(TIM_TypeDef* TIMx, uint16_tTIM_IT);

void TIM_ClearITPendingBit(TIM_TypeDef* TIMx, uint16_tTIM_IT);

5.     PWM模式 :脉冲宽度调制模式可以产生一个由TIMx_ARR寄存器确定频率、由TIMx_CRRx寄存器确定占空比的信号。

6.      可能要设置GPIO的复用或者重映射功能。void TIM_OC2PreloadConfig(TIM_TypeDef* TIMx, uint16_tTIM_OCPreload);

void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx,FunctionalState NewState)

7.     void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalStateNewState);

简单的说,ARPE=1,ARR立即生效。。。APRE=0,ARR下个比较周期生效。

8.     void TIM_OCxInit(TIM_TypeDef* TIMx, TIM_OCInitTypeDef*TIM_OCInitStruct);

 定时器输出函数初始化设置,主要有:

TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //PWM模式2

TIM_OCInitStructure.TIM_OutputState =TIM_OutputState_Enable; //比较输出使能

TIM_OCInitStructure. TIM_Pulse=100;

TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;//输出极性:TIM输出比较极性高

TIM_OC2Init(TIM3, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM3OC2

9.     设置比较函数voidTIM_SetCompareX(TIM_TypeDef* TIMx, uint16_t Compare2);

 

 

 

 

定时器PWM实现步骤:

1.       使能定时器3和相关IO口时钟。

 使能定时器3时钟:RCC_APB1PeriphClockCmd();

  使能GPIOB时钟:RCC_APB2PeriphClockCmd();

2.        初始化IO口为复用功能输出。函数:GPIO_Init();

 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;      

3.     这里我们是要把PB5用作定时器的PWM输出引脚,所以要重映射配置,

   所以需要开启AFIO时钟。同时设置重映射。

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);

  GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE);

4.        初始化定时器:ARR,PSC等:TIM_TimeBaseInit();

5.       初始化输出比较参数:TIM_OC2Init();

6.       使能预装载寄存器: TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable);

7.       使能定时器。TIM_Cmd();

8.      不断改变比较值CCRx,达到不同的占空比效果:TIM_SetCompare2();

 

 

 

 

1)    TIM_TimeBaseStructure.TIM_ClockDivision这一行代码是干吗的啊

   CKD[1:0]: 时钟分频因子 (Clock division) 这2位定义在定时器时钟(CK_INT)频率、死区时间和由死区发生器与数字滤波器(ETR,TIx)所用的采样时钟之间的分频比例。 00: tDTS = tCK_INT01 : tDTS = 2 x tCK_INT10: tDTS = 4 x tCK_INT11 :保留,不要使用这个配置

用来屏蔽一些不需要的毛刺的。比如你数字滤波器的频率为1M,N=8,则频率大于1MHz/8=125KHz(持续时间小于8us)的脉冲都会被忽略。可以用在按键消抖之类的。

你可能感兴趣的:(STM32)