25
2020
11

stm32运用PWM写呼吸灯的例子

代码不太完整,因为我的stm32板子的灯的引脚没有定时器所以就写个差不多的模板供以后参考

#include "stm32f10x.h"
#include "sys.h"
static GPIO_InitTypeDef   GPIO_InitStructure;


static TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;//配置频率
static TIM_OCInitTypeDef  TIM_OCInitStructure;        //配置占空比

void delay_ms(uint32_t n){
    while(n--){
    SysTick->CTRL=0; //关闭系统定时器,第0位:使能位,1为使能
    SysTick->LOAD=(168000)-1;//配置计数值,因为计算机从0开始,所以减一
    SysTick->VAL=0;//清空当前的值(标志位),定时器在计数时,标志位为0,当计数完毕时,标志位为1
    SysTick->CTRL=5;//5=101  使能系统计时器,并且使用系统时钟
        //第二位:时钟选择位,0=系统时钟/8,1=系统时钟
    while((SysTick->CTRL&0x10000)==0);//等待计数到0
        //第16位:计数到0则为1
    
    }
    
    SysTick->CTRL=0;
}

void led0(void){
	//led0-->PB5
	//使能端口
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
	//初始化GPIO引脚
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//要用到复用功能,所以把引脚的模式改成复用推挽
	GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz;//高速响应
	GPIO_Init(GPIOB, &GPIO_InitStructure);
	GPIO_SetBits(GPIOB,GPIO_Pin_5);
	//这里还缺一行:将引脚连接到定时器x
}


//由于精英版led灯引脚没有定时器复用功能,所以我就以下面这个定时器举个例子供以后参考
void TIM2init(void){
	//使能定时器2硬件时钟
	 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
	//配置定时器2 分配值,计数值等
	//频率的配置
   TIM_TimeBaseStructure.TIM_Period = 10000/100-1;//计数值,决定输出频率为100Hz
   TIM_TimeBaseStructure.TIM_Prescaler = 7200-1;//预分频器7100-1+1,隐形着一个+1操作,所以要减一
   TIM_TimeBaseStructure.TIM_ClockDivision = 0;//这个用不到
   TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//向上计数
   TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
	//配置占空比
   TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;              //通道
   TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;  //打开/关闭脉冲输出
   TIM_OCInitStructure.TIM_Pulse = 50;							  //比较值
   TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;      //输出电平的极性,有效状态为高电平,则无效状态是低电平
   TIM_OC1Init(TIM10, &TIM_OCInitStructure);

	
	//配置定时器2中断的触发方式
	// TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
	//配置定时器2的中断优先级
	//由于没有用到中断所以就不用写这个
  // NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
  // NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  // NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  // NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
   //NVIC_Init(&NVIC_InitStructure);
	//使能定时器2
	TIM_Cmd(TIM2, ENABLE);



}
	

int main(){
	uint32_t pwm_cmp;
    led0();
	TIM2init();
  //呼吸灯
	while(1){
	//灯逐渐变暗
	  for(pwm_cmp=0;pwm_cmp<=100;pwm_cmp++){
	  TIM_SetCompare1(TIM2,pwm_cmp);
	  delay_ms(20);
	  }
	  //灯逐渐变亮
	  for(pwm_cmp=100;pwm_cmp<=0;pwm_cmp--){
	  TIM_SetCompare1(TIM2,pwm_cmp);
	  delay_ms(20);
	  }
	}
}


« 上一篇 下一篇 »

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。