pwm驱动呼吸灯
#include "stm32f10x.h"
#include "Delay.h"
#include "PWM.h"uint16_t i;
int main(void){PWM_Init();while(1){for(i=30;i<=100;i++){//越来越亮PWM_SetCompare(i);Delay_ms(10);}for(i=30;i<=100;i++){//越来越暗PWM_SetCompare(130-i);Delay_ms(10);}}
}
上述代码为呼吸灯实现,呼吸灯的实现,是通过改变RCC来实现的。
下面为PWM的初始化函数和改变RCC的封装函数
#include "stm32f10x.h"void PWM_Init(void){//要产生一个fre为1KHZ,分辨率为1%的PWM波形,来实现呼吸灯,呼吸灯通过修改CCR的值//①开启时钟,TIM和GPIORCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//选择时钟源TIM_InternalClockConfig(TIM2);//②配置时基单元TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;TIM_TimeBaseInitStruct.TIM_Prescaler=72-1; //PSCTIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;TIM_TimeBaseInitStruct.TIM_Period=100-1; //ARRTIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1;TIM_TimeBaseInitStruct.TIM_RepetitionCounter=0;//这个参数只用于高级TIMTIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStruct);/*//不要上电就中断TIM_ClearFlag(TIM2, TIM_FLAG_Update);//Enablesthe specified TIM interrupts 配置中断输出TIM_ITConfig(TIM2,TIM_FLAG_Update,ENABLE);*///③配置输出比较单元TIM_OCInitTypeDef TIM_OCInitStruct;TIM_OCStructInit(&TIM_OCInitStruct);//给TIM_OCInitStruct的参数赋初始值//修改我们要用的参数TIM_OCInitStruct.TIM_Pulse=0;//Pulse是用来设置CCR的TIM_OCInitStruct.TIM_OCMode=TIM_OCMode_PWM1;TIM_OCInitStruct.TIM_OCPolarity=TIM_OCPolarity_High;TIM_OCInitStruct.TIM_OutputState=TIM_OutputState_Enable;//设置输出使能TIM_OC1Init(TIM2, &TIM_OCInitStruct);//使用不同的GPIO,选择的输出比较通道也不一样//这里使用的是GPIOA,所以选择OC1//它的参数比较多,我们只要把我们需要用的列出来就好了//但是此时需要给其他参数赋初始值,//使用TIM_OCStructInit函数//通过上述配置,就可以生成PWM波形了,但是我们需借助GPIO输出。//那TIM2的OC1通道是借了哪个GPIO口呢?//答:因为是TIM2且OC1 所以是TIM2_CH1,又因为TIM2_CH1是引脚PA0的默认服用功能之一//④配置GPIOGPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Pin=GPIO_Pin_0;GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;//定时器是片上外设,所以是复用推挽输出GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStruct);//⑤运行控制TIM_Cmd(TIM2,ENABLE);
}//修改CCR的值的封装函数
void PWM_SetCompare(uint16_t Compare1){TIM_SetCompare1(TIM2,Compare1);
}