12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091 |
- #include "hal_pwm.h"
- #include "stm32f4xx_tim.h"
- void pwm_init(pwm_content_t *pwm_content)
- {
- RCC_APB1PeriphClockCmd(pwm_content->pwm_timer_rcu, ENABLE);
- RCC_AHB1PeriphClockCmd(pwm_content->pwm_gpio_rcu, ENABLE);
- // GPIO初始化
- GPIO_PinAFConfig(pwm_content->pwm_gpio_port, pwm_content->pwm_gpio_af, pwm_content->pwm_time_af);
- GPIO_InitTypeDef GPIO_InitStructure;
- GPIO_InitStructure.GPIO_Pin = pwm_content->pwm_gpio_pin;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
- GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
- GPIO_Init(pwm_content->pwm_gpio_port, &GPIO_InitStructure);
- // 定时器初始化
- TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
- TIM_TimeBaseStructure.TIM_Period = pwm_content->pwm_period; // 定时时间的配置,也就是配置重载值,而重载值会传递给计数值
- TIM_TimeBaseStructure.TIM_Prescaler = pwm_content->pwm_prescaler; // 配置分频值,确定定时器的时钟频率
- TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
- TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
- TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; // 向上计数,0->TIM_Period就会触发中断请求
- TIM_TimeBaseInit(pwm_content->pwm_timer, &TIM_TimeBaseStructure);
- // PWM初始化
- TIM_OCInitTypeDef TIM_OCInitStructure;
- TIM_OCInitStructure.TIM_OCMode = pwm_content->pwm_timer_ch;
- TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; // 输出状态使能
- TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable;
- TIM_OCInitStructure.TIM_Pulse = pwm_content->pwm_pulse;
- TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; // 有效状态为高电平
- TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;
- TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;
- TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;
- TIM_OC1Init(pwm_content->pwm_timer, &TIM_OCInitStructure);
- // PWM设置
- TIM_OC1PreloadConfig(pwm_content->pwm_timer, TIM_OCPreload_Enable);
- // 自动重装
- TIM_ARRPreloadConfig(pwm_content->pwm_timer, ENABLE);
- // 使能定时器
- TIM_Cmd(pwm_content->pwm_timer, ENABLE);
- }
- void pwm_mode(pwm_content_t *pwm_content, uint8_t status)
- {
- if (1 == status)
- {
- if (pwm_content->pwm_status == 0)
- {
- TIM_Cmd(pwm_content->pwm_timer, ENABLE);
- pwm_content->pwm_status = 1;
- }
- }
- if (0 == status)
- {
- if (pwm_content->pwm_status == 1)
- {
- TIM_Cmd(pwm_content->pwm_timer, DISABLE);
- GPIO_InitTypeDef GPIO_InitStructure;
- GPIO_InitStructure.GPIO_Pin = pwm_content->pwm_gpio_pin;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
- GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
- GPIO_Init(pwm_content->pwm_gpio_port, &GPIO_InitStructure);
- // GPIO_ResetBits(pwm_content->pwm_gpio_port, pwm_content->pwm_gpio_pin);
- pwm_content->pwm_status = 0;
- }
- }
- }
- pwm_content_t pwm_timer3_content = {
- .pwm_gpio_port = GPIOF,
- .pwm_gpio_pin = GPIO_Pin_9,
- .pwm_gpio_rcu = RCC_AHB1Periph_GPIOF,
- .pwm_gpio_af = GPIO_PinSource9,
- .pwm_time_af = GPIO_AF_TIM14,
- .pwm_timer_rcu = RCC_APB1Periph_TIM14,
- .pwm_timer = TIM14,
- .pwm_timer_ch = TIM_OCMode_PWM1,
- .pwm_prescaler = 84 - 1,
- .pwm_period = 500 - 1,
- .pwm_pulse = 50,
- .pwm_status = 0,
- };
|