#define LED0_PWM_VAL TIM3->CCR2 //比较寄存器(TIM3通道2),可以调节PWM占空比,
int main(void)
{
u16 led0pwmval=0;
u8 dir=1;
Stm32_Clock_Init(9); //系统时钟设置
delay_init(72); //延时初始化
PWM_Init(900,0);//设置PWM频率,不分频
while(1)
{
delay_ms(10);
if(dir)led0pwmval++;
else led0pwmval--;
if(led0pwmval>300)dir=0;
if(led0pwmval==0)dir=1;
LED0_PWM_VAL=led0pwmval; //呼吸灯(改变比较寄存器的值)
}
}
void PWM_Init(u16 arr,u16 psc)
{
RCC->APB2ENR|=1<<2; //开启GPIOA使能
RCC->APB2ENR|=1<<5; //开启GPIOD使能
RCC->APB2ENR|=1<<4; //开启GPIOC使能
RCC->APB1ENR|=1<<1; //TIM3使能
GPIOA->CRH&=0XFFFFFFF0;//PA8输入(LED灯引脚,记得与PA7或PC7用杜邦线连接,PA7默认,PC7复用功能)
GPIOA->CRH|=0X00000004;//浮空输入
GPIOA->CRL&=0X0FFFFFFF;//PA7输出
GPIOA->CRL|=0XB0000000;//复用功能输出
GPIOA->ODR|=1<<7;//PA7上拉
/* //如果需要使用复用功能,及用PC7控制呼吸灯,取消注释,不然默认PA7输出PWM
RCC->APB2ENR|=1<<0; //AFIO时钟使能,一定要开,找了半天才找到这个问题,开启才可以使用复用功能
AFIO->MAPR|=3<<10; //PC7为全复用,不写的话不能使用使用复用功能
GPIOC->CRL&=0X0FFFFFFF;//PC7输出
GPIOC->CRL|=0XB0000000;//复用功能输出
GPIOC->ODR|=1<<7;//PC7上拉
*/
TIM3->ARR=arr;//设置定时器自动重装值
TIM3->PSC=psc;//预分频不分频
TIM3->CCMR1|=7<<12; //CH2 PWM2模式
TIM3->CCMR1|=1<<11; //CH2预装载使能
TIM3->CCER|=1<<4; //OC2输出使能
TIM3->CR1=0x0080; //ARPE使能,好像没有多大用,写不写都可以运行
TIM3->CR1|=0x01; //定时器3使能
}
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』