STM32 TIM2 的PWM輸出——寄存器控制

STM32 TIM2 的PWM輸出

使用純寄存器的方法,設置STM32的TIM2 channel 1通道輸出PWM脈衝,控制GPIOA0 管腳的LED燈,實現呼吸燈效果!
直接上代碼吧。

/*
 * @Author: kimiyang
 * @Date: 2020-06-03 13:50:05
 * @LastEditors: kimiyang
 * @LastEditTime: 2020-06-03 23:14:50
 * @Description: 
 * @FilePath: \Pk_PWM\Src\main.c
 */ 

#include <stm32f1xx.h>
//#include "stm32f1xx_hal.h"
void _delay_xxs(uint32_t dcnt)
{
  uint16_t i;
  do
  {
    for(i=0;i<1000;i++);
    dcnt--;
  } while (dcnt > 0);

}

int main()
{
  // 使能GPIOA和TIM2的時鐘
  __HAL_RCC_GPIOA_CLK_ENABLE();
  __HAL_RCC_TIM2_CLK_ENABLE();
  //  設置GPIOA0 爲複用功能,推輓輸出模式
  SET_BIT( GPIOA->CRL, GPIO_CRL_CNF0_1 | GPIO_CRL_MODE0_1);

    TIM2->PSC = 100-1;
    TIM2->ARR = 800-1;
    // 設置PWM模式
    SET_BIT( TIM2->CCMR1, TIM_CCMR1_OC1M_2|TIM_CCMR1_OC1M_1 );
    TIM2->CCR1 = 0;
    SET_BIT( TIM2->CCER, TIM_CCER_CC1E | TIM_CCER_CC1P); //TIM_CCER_CC1E
    SET_BIT( TIM2->CR1,  TIM_CR1_CEN );

    uint16_t pwmduty = 0;
    uint8_t dir = 0;
    while (1)
    {
      if(dir == 0)
      {
        pwmduty+=5;
        if(pwmduty >= 799)
        {
          pwmduty = 800;
          dir = 1;
        }
      }
      else
      {
        pwmduty-=5;
        if(pwmduty <= 4)
        {
          pwmduty = 0;
          dir = 0;
        }
      }
      
      TIM2->CCR1 = pwmduty;
			_delay_xxs(15);
    }
    
    return 0;
}

void Error_Handler(void)
{
  /* USER CODE BEGIN Error_Handler_Debug */
  /* User can add his own implementation to report the HAL error return state */

  /* USER CODE END Error_Handler_Debug */
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章