一个热爱代码的工程师,唯有凭借双手不断敲打,才可以快速提升实力!
本文谨以记录,日后相忘时再作复习,代码没有贵贱,既来之则安之。
利用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:本文的代码参考正点原子