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 */
}



猜你喜欢

转载自blog.csdn.net/kimiyang123/article/details/106536491