**
STM32的通用定时器使用实现呼吸灯
**
STM3F1拥有4个通用定时器,分别是TIM2、 TIM3、 TIM4 和 TIM5;高级定时器2个分别是TIM1和TIM8。
1、通用TIMx (TIM2、 TIM3、 TIM4和TIM5)定时器功能包括:
(1) 16位可编程(可以实时修改)预分频器,计数器时钟频率的分频系数为1~65536之间的任意
数值
(2)16位向上、向下、向上/向下自动装载计数器
2、4个独立通道:
(1)输入捕获
(2)输出比较
(3)PWM生成
(4)单脉冲模式输出
1、计数器寄存器(TIMx_CNT)
2、预分频器寄存器 (TIMx_PSC)
3、自动装载寄存器 (TIMx_ARR)
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
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);//使能预装载寄存器
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的呼吸灯功能。