使能GPIOA,GPIOB的时钟,调用结构体初始化GPIO。
/**
* @brief 初始TIM1_Gpio
*/
static void HAL_TIM_PWM_GpioInit(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
/* GPIOA时钟使能 */
__HAL_RCC_GPIOA_CLK_ENABLE();
/* GPIOB时钟使能 */
__HAL_RCC_GPIOB_CLK_ENABLE();
/*初始化PB0/PA13为TIM1通道2*/
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF2_TIM1;
GPIO_InitStruct.Pin = GPIO_PIN_0;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF13_TIM1;
// /* A9-TIM1_CH2 */
GPIO_InitStruct.Pin = GPIO_PIN_13;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
然后使能TIM1时钟,初始化TIM1
static TIM_HandleTypeDef TimHandle;
static TIM_OC_InitTypeDef sPWMConfig;
static TIM_BreakDeadTimeConfigTypeDef sBreakConfig;
static void Timer1Init(uint32_t periodUs)
{
/* TIM1时钟使能 */
__HAL_RCC_TIM1_CLK_ENABLE();
HAL_TIM_PWM_GpioInit();
TimHandle.Instance = TIM1; /* 选择TIM1 */
TimHandle.Init.Period = periodUs - 1; /* 自动重装载值 */
TimHandle.Init.Prescaler = 1-1; /* 预分频为1000-1 */
TimHandle.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; /* 时钟不分频 */
TimHandle.Init.CounterMode = TIM_COUNTERMODE_UP; /* 向上计数 */
TimHandle.Init.RepetitionCounter = 1 - 1; /* 不重复计数 */
TimHandle.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; /* 自动重装载寄存器没有缓冲 */
/* PWM初始化 */
HAL_TIM_PWM_Init(&TimHandle);
sPWMConfig.OCMode = TIM_OCMODE_PWM1; /* 配置为PWM1 */
sPWMConfig.OCPolarity = TIM_OCPOLARITY_HIGH; /* 高电平有效 */
sPWMConfig.OCNPolarity = TIM_OCNPOLARITY_HIGH; /* 高电平有效 */
sPWMConfig.OCIdleState = TIM_OCIDLESTATE_SET; /* 输出空闲状态1(OC1输出) */
sPWMConfig.OCNIdleState = TIM_OCNIDLESTATE_RESET; /* 输出空闲状态1(OC1N输出) */
sPWMConfig.OCFastMode = TIM_OCFAST_DISABLE; /* 关闭快速使能 */
sPWMConfig.Pulse = periodUs/2; /* 通道1占空比 */
HAL_TIM_PWM_ConfigChannel(&TimHandle, &sPWMConfig, TIM_CHANNEL_2);
/* 刹车和死区相关配置 */
sBreakConfig.BreakState = TIM_BREAK_ENABLE; /* 使能刹车 */
sBreakConfig.DeadTime = 10; /* 死区时间 */
sBreakConfig.OffStateRunMode = TIM_OSSR_ENABLE; /* 运行模式下关闭状态:开启输出 */
sBreakConfig.OffStateIDLEMode = TIM_OSSI_ENABLE; /* 空闲模式下关闭状态:开启输出 */
sBreakConfig.LockLevel = TIM_LOCKLEVEL_OFF; /* 关闭锁定 */
sBreakConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH; /* 刹车有效极性:高电平 */
sBreakConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_ENABLE; /* 开启自动输出 */
/* 配置刹车和死区 */
HAL_TIMEx_ConfigBreakDeadTime(&TimHandle, &sBreakConfig);
/* 通道1输出PWM */
HAL_TIM_PWM_Start(&TimHandle, TIM_CHANNEL_2);
/* 通道1N输出PWM */
HAL_TIMEx_PWMN_Start(&TimHandle, TIM_CHANNEL_2);
}