基于STM32F103ZET6主控平台实现定时器TIM3_PWM波输出的驱动

一个热爱代码的工程师,唯有凭借双手不断敲打,才可以快速提升实力!

本文谨以记录,日后相忘时再作复习,代码没有贵贱,既来之则安之。

利用TIM3定时器的PWM波形输出来实现一个呼吸灯的效果,或不多说上代码:

timer.h

#ifndef __TIM_H
#define __TIM_H
#include "sys.h"
//通过改变 TIM3->CCR2 的值来改变占空比,从而控制 LED0 的亮度
#define LED0_PWM_VAL TIM3->CCR2
void TIM3_PWM_Init(u16 arr,u16 psc);//定时器3 PWM波输出初始化
#endif

timer.c

#include "tim.h"
#include "led.h"
//定时器3 PWM波输出初始化
void TIM3_PWM_Init(u16 arr,u16 psc)
{
	RCC->APB1ENR|=1<<1;//开启TIM3定时器时钟
	RCC->APB2ENR|=1<<3;
	GPIOB->CRL&=0XFF0FFFFF;
	GPIOB->CRL|=0X00B00000;//设置PB5位复用输出
	
	RCC->APB2ENR|=1<<0;//开启辅助时钟
	AFIO->MAPR&=0XFFFFF3FF;	//清除MAPR的[11:10]位
	AFIO->MAPR|=1<<11;			//设置TIM3_CH2为部分重映射->PB5
	TIM3->ARR=arr;//设置重装载值
	TIM3->PSC=psc;//设置预分频值
	TIM3->CCMR1|=7<<12;			//CH2 PWM2 模式
	TIM3->CCMR1|=1<<11;			//CH2 预装载使能
	
	TIM3->CCER|=1<<4;				//输入/捕获2输出使能
	TIM3->CR1=0X0080;				//ARPE 使能。
	TIM3->CR1|=0x01;				//开启定时器3
}

main.c

#include "sys.h"
#include "usart.h"		
#include "delay.h"
#include "led.h"
#include "tim.h"
void Input_While(void);
u8 Wl_stat=0;//while标志位
int main(void)
{		
	u16 led0_pwm_val=0;
	u8 led_stat=1;
	Stm32_Clock_Init(9);	  //系统时钟设置
	delay_init(72);	  		  //延时初始化
	uart_init(72,115200); 	//串口初始化为115200
	LED_Init();
	TIM3_PWM_Init(599,0);
	while(1)
	{
		Input_While();
		delay_ms(10);
		if(led_stat)led0_pwm_val++;
		else led0_pwm_val--;
		if(led0_pwm_val>300)led_stat=0;
		if(led0_pwm_val==0)led_stat=1;
		LED0_PWM_VAL=led0_pwm_val;
	}
} 

void Input_While(void)
{
		if(Wl_stat==0)//代表进入WHILE循环
		{
			printf("Input While(1)-->\r\n");
			Wl_stat=1;
		}
}

编译通过后,烧录进STM32F103ZET6开发板,实现程序设计效果即可。

效果:【在完成软件设计之后,将我们将编译好的文件下载到精英 STM32 V1 上,观看其运行结果是否与我们编写的一致。如果没有错误,我们将看 DS0 不停的由暗变到亮,然后又从亮变到暗。每个过程持续时间大概为 3 秒钟左右。】

 

想太多,做太少,怎改变自己

谢谢大家的关注和支持,来自一个嵌入式软硬件工程师的内心情感!

PS:本文的代码参考正点原子

你可能感兴趣的:(基于STM32F103ZET6主控平台实现定时器TIM3_PWM波输出的驱动)