注意需要配置hal,不然tim句柄找不到
c
#ifndef __TIM_H__
#define __TIM_H__
#ifdef __cplusplus
extern "C" {
#endif
#include "main.h"
/* 外部变量声明 */
extern TIM_HandleTypeDef htim2;
/* PWM基础函数声明 */
void MX_TIM2_Init(void);
void HAL_TIM_MspPostInit(TIM_HandleTypeDef *htim);
/* PWM控制函数声明 */
void PWM_Start(void);
void PWM_Stop(void);
void PWM_Set_Pulse_Value(uint16_t pulse);
void PWM_Set_DutyCycle_Percent(float duty_percent);
uint16_t PWM_Get_Current_Pulse(void);
float PWM_Get_Current_DutyCycle_Percent(void);
#ifdef __cplusplus
}
#endif
#endif /* __TIM_H__ */
c
#include "tim.h"
#include "stdio.h"
TIM_HandleTypeDef htim2;
/* 您已有的初始化函数保持不变 */
void MX_TIM2_Init(void)
{
TIM_ClockConfigTypeDef sClockSourceConfig = {0};
TIM_MasterConfigTypeDef sMasterConfig = {0};
TIM_OC_InitTypeDef sConfigOC = {0};
/* TIM2基本配置 */
htim2.Instance = TIM2;
htim2.Init.Prescaler = 71; // 72MHz / (71+1) = 1MHz
htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
htim2.Init.Period = 999; // 1MHz / (999+1) = 1KHz PWM频率
htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
if (HAL_TIM_Base_Init(&htim2) != HAL_OK)
{
Error_Handler();
}
/* 时钟源配置 */
sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK)
{
Error_Handler();
}
/* PWM初始化 */
if (HAL_TIM_PWM_Init(&htim2) != HAL_OK)
{
Error_Handler();
}
/* 主从模式配置 */
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK)
{
Error_Handler();
}
/* PWM通道1配置 */
sConfigOC.OCMode = TIM_OCMODE_PWM1; // PWM模式1
sConfigOC.Pulse = 0; // 初始占空比为0
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
{
Error_Handler();
}
/* GPIO配置 */
HAL_TIM_MspPostInit(&htim2);
// 开启PWM
PWM_Start();
}
/* 您已有的MSP函数保持不变 */
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *tim_baseHandle)
{
if (tim_baseHandle->Instance == TIM2)
{
__HAL_RCC_TIM2_CLK_ENABLE();
}
}
void HAL_TIM_MspPostInit(TIM_HandleTypeDef *timHandle)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
if (timHandle->Instance == TIM2)
{
__HAL_RCC_GPIOA_CLK_ENABLE();
GPIO_InitStruct.Pin = GPIO_PIN_0;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
}
void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef *tim_baseHandle)
{
if (tim_baseHandle->Instance == TIM2)
{
__HAL_RCC_TIM2_CLK_DISABLE();
HAL_GPIO_DeInit(GPIOA, GPIO_PIN_0);
}
}
/* ========================================================================== */
/* PWM控制函数 */
void PWM_Start(void)
{
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);
}
void PWM_Stop(void)
{
HAL_TIM_PWM_Stop(&htim2, TIM_CHANNEL_1);
}
void PWM_Set_Pulse_Value(uint16_t pulse)
{
if (pulse > 999)
pulse = 999;
__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, pulse);
}
uint16_t PWM_Get_Current_Pulse(void)
{
return __HAL_TIM_GET_COMPARE(&htim2, TIM_CHANNEL_1);
}
/* ========================================================================== */
/* 补充的PWM控制函数 */
/**
* @brief 设置PWM占空比(百分比)
* @param duty_percent: 占空比百分比 0.0-100.0
*/
void PWM_Set_DutyCycle_Percent(float duty_percent)
{
if (duty_percent < 0)
duty_percent = 0;
if (duty_percent > 100)
duty_percent = 100;
uint16_t pulse = (uint16_t)(duty_percent * 999.0f / 100.0f);
printf("pulse:%d\r\n",pulse);
__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, pulse);
}
/**
* @brief 获取当前PWM占空比百分比
* @return 当前占空比百分比 0.0-100.0
*/
float PWM_Get_Current_DutyCycle_Percent(void)
{
uint16_t pulse = __HAL_TIM_GET_COMPARE(&htim2, TIM_CHANNEL_1);
return (float)pulse * 100.0f / 999.0f;
}