一. 实验目的:
深入了解STM32定时器原理,掌握脉宽调制pwm生成方法。
二. 实验内容:
1. 使用STM32F103的 Tim2~Tim5其一定时器的某一个通道pin(与GPIOx管脚复用,见下图),连接一个LED,用定时器计数方式,控制LED以2s的频率周期性地亮-灭。
配置RCC
配置SYS
配置GPIO:
配置TIM2:
配置时钟:
在keil文件中的main.c中写入以下代码:
HAL_TIM_Base_Start_IT(&htim2);//主函数中启动TIM2
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)//主函数外写入中断函数
{
static unsigned char ledState = 0;
if (htim == (&htim2))
{
if (ledState == 0)
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_RESET);
else
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_SET);
ledState = !ledState;
}
}
实物图:
2. 接上,采用定时器PWM模式,让 LED 以呼吸灯方式渐亮渐灭,周期为1~2秒,自己调整占空比变化到一个满意效果;使用Keil虚拟示波器,观察 PWM输出波形。
接上配置相同RCC,SYS,时钟。
配置TIM3
查看引脚位置:
将生成keil中的main.c文件内容修改成以下代码:
uint16_t pwmVal=0; //在主函数中添加
HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1);
while (pwmVal< 500)//在主函数循环中添加
{
pwmVal++;
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, pwmVal);
// TIM3->CCR1 = pwmVal;
HAL_Delay(1);
}
while (pwmVal)
{
pwmVal--;
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, pwmVal);
// TIM3->CCR1 = pwmVal;
HAL_Delay(1);
}
HAL_Delay(200);
实物图:
波形图:
可以看到输出波形周期性变化
3.总结
学到了。