上个博客讲了通用定时器的使用
本次通过通用定时器实现呼吸灯。
其实定时器中有PWM(脉宽调制)信号的输出和配置信息,但我想通过通用定时器的呼吸灯。
脉宽调制的原理就是不断的调节 高低电平的占空比来实现平均电压的变化,从而实现呼吸灯的效果。
代码如下:
main.c
/*
创建时间:2019.9.17
创建人:王艇
*/
#include "stm32f10x.h" // Device header
#include "led.h"
#include "key.h"
#include "delay.h"
#include "time.h"
int main(void)
{
//GPIOD_init_wt();
//GPIOA_init_wt();
//GPIOC_Init_key();
GPIOE_init_led();
TIM3_Init(1,3599); // 1s
while(1)
{
}
}
time.h
#include "stdint.h"
void TIM3_Init(uint16_t per,uint16_t psc);
time.c
#include "stm32f10x_tim.h"
int temp = 1;
int count=0;
int count_cnt=0;
int x=100,flag_wt=0;
void TIM3_Init(uint16_t per,uint16_t psc)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
NVIC_InitTypeDef NVIC_InitStruct;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
TIM_TimeBaseInitStructure.TIM_Period=per; //自动装载值
TIM_TimeBaseInitStructure.TIM_Prescaler=psc; //分频系数
TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //设置向上计数模式
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);
NVIC_InitStruct.NVIC_IRQChannel=TIM3_IRQn;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=2;
NVIC_InitStruct.NVIC_IRQChannelSubPriority=3;
NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStruct);
TIM_Cmd(TIM3,ENABLE);
}
void TIM3_IRQHandler(void)
{
if(TIM_GetITStatus(TIM3,TIM_IT_Update) == SET)
{
TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
count++;
if(count>100)
{
count = 0;
}
if(count == 1 && temp == 1)
{
temp = -1;
GPIO_WriteBit(GPIOE, GPIO_Pin_0, Bit_SET);
}
else if(count==x && temp == -1)
{
temp = 1;
if(flag_wt == 0)
{
x = x-2;
if(x<4)
{
flag_wt = 1;
}
}
else
{
x = x+2;
if(x>98)
{
flag_wt = 0;
}
}
GPIO_WriteBit(GPIOE, GPIO_Pin_0, Bit_RESET);
}
}
}
接线:PE0接在LED灯上
效果如下: