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