1、定时器输出PWM波配置流程
2、呼吸灯
使用定时器 4 通道 3 生成 PWM 波控制 LED1 ,实现呼吸灯效果。
频率:2kHz
,
PSC=71
,
ARR=499
3、项目代码
pwm.c
#include "pwm.h"
TIM_HandleTypeDef pwm_handle = {0};
// init函数
void pwm_init(uint16_t arr, uint16_t psc)
{
TIM_OC_InitTypeDef pwm_config = {0};
pwm_handle.Instance = TIM4;
pwm_handle.Init.Prescaler = psc;
pwm_handle.Init.Period = arr;
pwm_handle.Init.CounterMode = TIM_COUNTERMODE_UP;
HAL_TIM_PWM_Init(&pwm_handle);
pwm_config.OCMode = TIM_OCMODE_PWM1;
pwm_config.Pulse = arr/2;
pwm_config.OCPolarity = TIM_OCPOLARITY_LOW;
HAL_TIM_PWM_ConfigChannel(&pwm_handle, &pwm_config, TIM_CHANNEL_3);
HAL_TIM_PWM_Start(&pwm_handle, TIM_CHANNEL_3);
}
//msp函数
void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim)
{
if(htim->Instance == TIM4)
{
GPIO_InitTypeDef gpio_initstruct;
//打开时钟
__HAL_RCC_GPIOB_CLK_ENABLE(); // 使能GPIOB时钟
__HAL_RCC_TIM4_CLK_ENABLE();
//调用GPIO初始化函数
gpio_initstruct.Pin = GPIO_PIN_8; // 两个LED对应的引脚
gpio_initstruct.Mode = GPIO_MODE_AF_PP; // 推挽输出
gpio_initstruct.Pull = GPIO_PULLUP; // 上拉
gpio_initstruct.Speed = GPIO_SPEED_FREQ_HIGH; // 高速
HAL_GPIO_Init(GPIOB, &gpio_initstruct);
}
}
//修改CCR值的函数
void pwm_compare_set(uint16_t val)
{
__HAL_TIM_SET_COMPARE(&pwm_handle, TIM_CHANNEL_3, val);
}
pwm.h
#ifndef __PWM_H__
#define __PWM_H__
#include "sys.h"
void pwm_init(uint16_t arr, uint16_t psc);
void pwm_compare_set(uint16_t val);
#endif
main.c
#include "sys.h"
#include "delay.h"
#include "led.h"
#include "pwm.h"
int main(void)
{
HAL_Init(); /* 初始化HAL库 */
stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */
led_init(); /* 初始化LED灯 */
pwm_init(500 - 1, 72 - 1);
uint16_t i = 0;
while(1)
{
for(i = 0; i < 300; i++)
{
pwm_compare_set(i);
delay_ms(10);
}
for(i = 0; i < 300; i++)
{
pwm_compare_set(300 - i);
delay_ms(10);
}
// led1_on();
// led2_off();
// delay_ms(500);
// led1_off();
// led2_on();
// delay_ms(500);
}
}
led的代码此前的文章有不再赘述