STM32使用TIM闪烁LED——输出比较方式

STM32定时器输出比较器可以直接操作对应的GPIO,在计数器值等于比较寄存器的值时,对应的GPIO可以有以下四种动作

  无动作

  激活

  取消激活

  翻转

激活电平由输出极性寄存器决定

将LED置于定时器输出比较对应的GPIO上,对它的操作将非常方便,完全由硬件完成,不消耗CPU时间,无需中断,每个定时器都对应有4个输出比较,可以轻松实现4个LED的流水灯效果

宏定义部分如下

#define USER_TIM_PSC        36000-1
#define USER_TIM_PERIOD        1000-1
#define USER_TIM_PULSEA        0
#define USER_TIM_PULSEB        500

#define USER_TIM            TIM2
#define USER_TIM_RCC        RCC_APB1Periph_TIM2
#define USER_TIM_RCC_CMD    RCC_APB1PeriphClockCmd
#define USER_TIM_GPIO        GPIOA
#define USER_TIM_GPIO_RCC    RCC_APB2Periph_GPIOA
#define USER_TIM_PINA        GPIO_Pin_1
#define USER_TIM_PINB        GPIO_Pin_0

定时器配置如下

    TIM_TimeBaseInitTypeDef tim_timebase_struct;
    TIM_OCInitTypeDef tim_oc_struct;
    GPIO_InitTypeDef gpio_struct;
    
    GPIO_RCC_CMD(USER_TIM_GPIO_RCC, ENABLE);
    USER_TIM_RCC_CMD(USER_TIM_RCC, ENABLE);
    
    gpio_struct.GPIO_Mode = GPIO_Mode_AF_PP;
    gpio_struct.GPIO_Speed = GPIO_Speed_2MHz;
    gpio_struct.GPIO_Pin = USER_TIM_PINA | USER_TIM_PINB;
    GPIO_Init(USER_TIM_GPIO, &gpio_struct);
    
    TIM_TimeBaseStructInit(&tim_timebase_struct);
    tim_timebase_struct.TIM_CounterMode = TIM_CounterMode_Up;
    tim_timebase_struct.TIM_Prescaler = USER_TIM_PSC;
    tim_timebase_struct.TIM_Period = USER_TIM_PERIOD;
    tim_timebase_struct.TIM_ClockDivision = TIM_CKD_DIV1;
    TIM_TimeBaseInit(USER_TIM, &tim_timebase_struct);
    
    TIM_OCStructInit(&tim_oc_struct);
    tim_oc_struct.TIM_OCMode = TIM_OCMode_Active;
    tim_oc_struct.TIM_OCPolarity = TIM_OCPolarity_Low;
    tim_oc_struct.TIM_OutputState = TIM_OutputState_Enable;
    tim_oc_struct.TIM_Pulse = USER_TIM_PULSEA;
    TIM_OC2Init(USER_TIM, &tim_oc_struct);
    
    tim_oc_struct.TIM_Pulse = USER_TIM_PULSEB;
    TIM_OC1Init(USER_TIM, &tim_oc_struct);
    
    TIM_OC2PreloadConfig(USER_TIM, TIM_OCPreload_Disable);
    TIM_OC1PreloadConfig(USER_TIM, TIM_OCPreload_Disable);
    TIM_ARRPreloadConfig(USER_TIM, ENABLE);
    
    TIM_Cmd(USER_TIM, ENABLE);

本工程使用的野火MINI开发板只有两个LED灯且都不在定时器的输出比较对应GPIO上,所以本工程使用了TIM2的CH1和CH2实现两个LED的流水灯效果,一次流水完为1秒,通过杜邦线将输出引到LED,可以观察到效果

定时器的输出比较功能对GPIO的激活和取消激活功能的应用场景不知道是怎样的,因为只要第一次激活或者取消激活,后续它的状态将保持,所以在这里用于操作LED是不方便的,但是确实可以观察到明显的一次流水效果。它们的功能有待后续发掘

在实现了单个LED的闪烁,多个LED的流水灯效果,还可以用定时器的PWM模式实现呼吸灯效果,玩转LED,待续

猜你喜欢

转载自www.cnblogs.com/qingkai/p/9779685.html