赞
踩
前段时间学习stm32的时候就做过呼吸灯实验,浏览了一些博客后,做下总结
呼吸灯原理其实是利用pwm(脉冲宽度调节)技术,通过改变占空比来实现呼吸灯,占空比是指高电平除以总的周期,
下面直接上代码
int xxx=20000;
while(1)
{
for(i=0;i<xxx;i++)
{
GPIO_ResetBits(GPIOF,GPIO_Pin_10);
delay(xxx-i);
GPIO_SetBits(GPIOF,GPIO_Pin_10);
delay(i);
}
for(i=0;i<xxx;i++)
{
GPIO_ResetBits(GPIOF,GPIO_Pin_10);
delay(i);
GPIO_SetBits(GPIOF,GPIO_Pin_10);
delay(xxx-i);
}
delay(100);
}
还有一种方法是使用灯引脚用作为定时器复用功能,然后初始化定时器输出功能为pwm,再通过修改CCR1改变占空比。
下面上程序,
定时器程序
GPIO_InitTypeDef aaa;//GPIO初始化结构体
TIM_TimeBaseInitTypeDef bbb;
TIM_OCInitTypeDef ccc;
//0、时钟使能 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);//PF9对应的时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM14,ENABLE); //1、初始化需要用到的模块 aaa.GPIO_Pin = GPIO_Pin_9;//PF9 aaa.GPIO_Mode = GPIO_Mode_AF;//复用功能 因为pF9等会要被用作定时器输出功能 aaa.GPIO_Speed = GPIO_Fast_Speed;//引脚速度选择 aaa.GPIO_OType = GPIO_OType_PP;//推挽输出 GPIO_OType_OD 开漏 aaa.GPIO_PuPd = GPIO_PuPd_NOPULL;//选择浮空 无上下拉 GPIO_Init(GPIOF,&aaa);//LED1初始化 //2、初始化定时器模块---设置PWM周期 计数器+预分频器+设定值 bbb.TIM_Prescaler = 84-1;//1us/脉冲 bbb.TIM_Period = 1000-1; bbb.TIM_CounterMode = TIM_CounterMode_Up; bbb.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseInit(TIM14,&bbb); //3、将指定的引脚用作为某个复用功能 GPIO_PinAFConfig(GPIOF, GPIO_PinSource9, GPIO_AF_TIM14);// //4、初始化定时器14的输出功能模块--根据通道 OC1--CH1 OC2--CH2 ccc.TIM_OCMode = TIM_OCMode_PWM1;//PWM模式1 PWM模式2 ccc.TIM_OCPolarity = TIM_OCPolarity_High;//TIM_OCPolarity_Low ccc.TIM_Pulse = 500;//一开始是1000的一半----调节占空比的CCR1 ccc.TIM_OutputState = TIM_OutputState_Enable;//输出使能 TIM_OC1Init(TIM14,&ccc); //开启自动重载载寄存器的使能--TIM 开启定时器ARR寄存器缓冲 TIM_ARRPreloadConfig(TIM14,ENABLE); //6、开启CCRx的缓冲 TIM_OC1PreloadConfig(TIM14, TIM_OCPreload_Enable); //7、开启定时器13 TIM_Cmd(TIM14,ENABLE); GPIO_ResetBits(GPIOF,GPIO_Pin_9);//复位PF9 点灯
主程序
while(1)
{
//呼吸灯
for(i=0;i<1000;i++)
{
TIM14->CCR1=i;
delay(1);
}
for(;i>=0;i--)
{
TIM14->CCR1=i;
delay(1);
}
}
以上就是我个人对呼吸灯实验的总结。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。