STM32的通用定时器使用实现呼吸灯

**

STM32的通用定时器使用实现呼吸灯

**

STM32通用定时器应用

STM3F1拥有4个通用定时器,分别是TIM2、 TIM3、 TIM4 和 TIM5;高级定时器2个分别是TIM1和TIM8。

TIM3主要功能

1、通用TIMx (TIM2、 TIM3、 TIM4和TIM5)定时器功能包括:
(1) 16位可编程(可以实时修改)预分频器,计数器时钟频率的分频系数为1~65536之间的任意
数值
(2)16位向上、向下、向上/向下自动装载计数器
2、4个独立通道:
(1)输入捕获
(2)输出比较
(3)PWM生成
(4)单脉冲模式输出

TIM3相关寄存器

1、计数器寄存器(TIMx_CNT)
2、预分频器寄存器 (TIMx_PSC)
3、自动装载寄存器 (TIMx_ARR)

TIM3代码实现

一、初始化TIM3

1、第一步
使能定时器3的时钟,由于TIM3是挂在APB1上的所以调用下面函数

// 
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE); 

2、第二步
定义一个名为TIM_TimeBaseInitStructure的结构体变量

// 
    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;

3、第三步
初始化TIM3

// 
    TIM_TimeBaseInitStructure.TIM_Period = arr;//设置重装载周期值                             
	TIM_TimeBaseInitStructure.TIM_Prescaler = psc;//设置预分频值
	TIM_TimeBaseInitStructure.TIM_ClockDivision = 0;//设置时钟分割
	TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;//TIM向上计数模式
	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStructure);//初始化TIM3

二、初始化TIM3 Chnnel2 PWM模式

1、第一步
定义一个名为TIM_OCInitStructure的结构体变量

// 
    TIM_OCInitTypeDef TIM_OCInitStructure;

2、第二步
初始化TIM3 Chnnel2 PWM模式

// 
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;//选择PWM模式2
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//比较输出使能
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;//输出极性高
	TIM_OC2Init(TIM3, &TIM_OCInitStructure);//初始化TIM3 OC2
	TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);//使能预装载寄存器

初始化GPIO并开启复用功能

1、第一步
使能GPIO的时钟,并开启端口复用时钟(AFIO)由于PB5是挂在APB2上的所以调用下面函数

// 
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO,ENABLE);

2、第二步
定义一个名为GPIO_InitStructure的结构体变量

// 
    GPIO_InitTypeDef GPIO_InitStructure;

2、第三步
初始化GPIO端口并开启端口复用模式

// Timer3部分重映射  TIM3_CH2->PB5   
    GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE);
    
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB,&GPIO_InitStructure);

使能定时器

最后使能TIM3

// 
    TIM_Cmd(TIM3, ENABLE);

主函数代码

// 
   int main(void)
{
  u16 ledpwmval = 0;
	u8 dir = 1;
	LED_GPIO_Config();     		//LED初始化
	TIM3_PWM_Init(899,0);  		//不分频。PWM频率=72000000/900=80Khz
	while(1)                            
	{
		SysTick_Delay_ms(3);	//延时3ms
		if(dir)
			ledpwmval++;
		else
			ledpwmval--;
		if(ledpwmval>500)
			dir = 0;
		if(ledpwmval==0)
			dir = 1;
		TIM_SetCompare2(TIM3, ledpwmval);//修改 TIM3_CCR2 占空比的函数
	}
}

实现了LED的呼吸灯功能。

你可能感兴趣的:(STM32F1)