方波产生
经过上次学习,可以通过PWM完成呼吸灯。本次实验是在呼吸灯的基础上进行改进,关于PWM的基础知识请移步上一篇文章。
接下来对上篇文章的代码进行如下改进:
time.h
#ifndef __TIMER_H
#define __TIMER_H
#include "sys.h"
#define LED0_PWM_VAL TIM3->CCR4
//void TIM3_Int_Init(u16 arr,u16 psc);
void TIM3_PWM_Init(u16 arr,u16 psc);
#endif
time.c
#include "timer.h"
//#include "led.h"
//TIM3_CH1 PWM输出初始化
//arr:自动重装值
//psc:时钟预分频数
void TIM3_PWM_Init(u16 arr,u16 psc)
{
RCC->APB1ENR|=1<<1; //TIM3时钟使能
GPIOB->CRL&=0XFFFFFF0F; //PB1清除之前的设置
GPIOB->CRL|=0X000000B0; //复用功能输出
TIM3->ARR=arr; //设定计数器自动重装值
TIM3->PSC=psc; //预分频器设置
TIM3->CCMR2|=7<<12; //CH4 PWM2模式
TIM3->CCMR2|=1<<11; //CH4预装载使能
TIM3->CCER|=1<<12; //OC4 输出使能
TIM3->CR1=0x0080; //ARPE使能
TIM3->CR1|=0x01; //使能定时器3
}
main.c
#include "sys.h"
#include "usart.h"
#include "delay.h"
//#include "led.h"
#include "timer.h"
int main(void)
{
// u16 led0pwmval=0;
// int dir=1;
Stm32_Clock_Init(9); //系统时钟设置
delay_init(72); //延时初始化
uart_init(72,9600); //串口初始化
//LED_Init(); //初始化与LED连接的硬件接口
TIM3_PWM_Init(7199,0);//不分频。PWM频率=7200000/(7199+1)=1Khz
while(1)
{
//PBout(1) = 0;
delay_ms(10);
LED0_PWM_VAL = 3600;
}
}
3600/7200 = 0.5 即我们设置占空比为50%
最后我们输出的为占空比为50%的方波:
ok!!!