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