1. 程式人生 > >STM32-如何使用引腳複用功能輸出PWM

STM32-如何使用引腳複用功能輸出PWM

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