1. 程式人生 > >STM32 重新理解GPIO配置以及配置PWM波輸出

STM32 重新理解GPIO配置以及配置PWM波輸出

最近做了個SD卡BOOTLOARDER程式。在測試過程中,想到可以利用板子的LED燈進行螢火蟲燈的製作,通過BOOTLOARDER將APP檔案下載到板子裡面檢視LED燈的閃爍。可能是因為太過自信,這麼個小程式能搞不定,所以並沒有仔細閱讀DATASHEET,導致最終費了半天時間才查出原因。

此為引子,便有了這篇文章。

我的板子LED燈引腳為PB5,引腳功能為:


該引腳TIM3_CH2為REMAP功能,引腳配置如下:

  GPIO_InitTypeDef GPIO_InitStructure;
  /*配置時鐘*/
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);         //使能TIM3時鐘
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO , ENABLE);  //使能GPIOB以及複用功能時鐘
  
  /*配置PB5引腳*/
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;				//PB5複用為TIM3的通道2
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
  /*TIM3區域性複用功能開啟	 在TIM3的區域性複用開啟時,PB5會被複用為TIM3_CH2*/
  GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3 , ENABLE);		


 在定時器重對映說明中查到TIM3_CH2在PB5中是部分重對映,所以使用GPIO_PartialRemap_TIM3



 /*-------------------------------------------------------------------
  TIM3CLK=72MHz  預分頻係數Prescaler=2 經過分頻 定時器時鐘為24MHz
  根據公式 通道輸出佔空比=TIM3_CCR2/(TIM_Period+1),可以得到TIM_Pulse的計數值	 
  捕獲/比較暫存器2 TIM3_CCR2= CCR2_Val 	     
  -------------------------------------------------------------------*/
  TIM3_TimeBaseStructure.TIM_Prescaler = 2;						    //預分頻器TIM3_PSC=3	 
  TIM3_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;		//計數器向上計數模式 TIM3_CR1[4]=0
  TIM3_TimeBaseStructure.TIM_Period =24000;				            //自動重灌載暫存器TIM3_APR  確定頻率為1KHz 		     
  TIM3_TimeBaseStructure.TIM_ClockDivision = 0x0;					//時鐘分頻因子 TIM3_CR1[9:8]=00
  TIM3_TimeBaseStructure.TIM_RepetitionCounter = 0x0;

  TIM_TimeBaseInit(TIM3,&TIM3_TimeBaseStructure);					//寫TIM3各暫存器引數
  
  TIM3_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; 			    //PWM模式2 TIM3_CCMR1[14:12]=111 在向上計數時,
  																    //一旦TIMx_CNT<TIMx_CCR1時通道1為無效電平,否則為有效電平
  TIM3_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;    //輸入/捕獲2輸出允許  OC2訊號輸出到對應的輸出引腳PB5
  TIM3_OCInitStructure.TIM_Pulse = CCR2_Val; 					    //確定佔空比,這個值決定了有效電平的時間。
  TIM3_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; 	    //輸出極性  低電平有效 TIM3_CCER[5]=1;
         
  TIM_OC2Init(TIM3, &TIM3_OCInitStructure);
  TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);
  TIM_Cmd(TIM3,ENABLE);											//啟動定時器3 TIM3_CR1[0]=1; 
  

至此,各配置結束,以下只要配置系統時鐘,使其在一定時間間隔中斷,改變佔空比。