• 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,待续

  • 相关阅读:
    【LeetCode】456. 132 Pattern
    【Python&Sort】QuickSort
    Python虚拟环境的配置
    【LeetCode】459. Repeated Substring Pattern
    【LeetCode】462. Minimum Moves to Equal Array Elements II
    【LeetCode】20. Valid Parentheses
    radio 获取选中值
    页面加载时自动执行(加载)js的几种方法
    加一个字段: updateTime 更新时间
    多用户同时处理同一条数据解决办法
  • 原文地址:https://www.cnblogs.com/qingkai/p/9779685.html
Copyright © 2020-2023  润新知