zoukankan      html  css  js  c++  java
  • 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,待续

  • 相关阅读:
    Python 存储引擎 数据类型 主键
    Python 数据库
    Python 线程池进程池 异步回调 协程 IO模型
    Python GIL锁 死锁 递归锁 event事件 信号量
    Python 进程间通信 线程
    Python 计算机发展史 多道技术 进程 守护进程 孤儿和僵尸进程 互斥锁
    Python 异常及处理 文件上传事例 UDP socketserver模块
    Python socket 粘包问题 报头
    Django基础,Day7
    Django基础,Day6
  • 原文地址:https://www.cnblogs.com/qingkai/p/9779685.html
Copyright © 2011-2022 走看看