STM32-如何使用引脚复用功能输出PWM

  • Post author:
  • Post category:其他


#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使能



}




版权声明:本文为feiya_hui原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。