STM32H750XB_RT-THREAD/31-TIM—高级定时器/TIM—高级定时器互补输出/User/tim/bsp_advance_tim.c

149 lines
4.8 KiB
C
Raw Permalink Normal View History

2025-07-21 06:34:29 +00:00
/**
******************************************************************************
* @file bsp_basic_tim.c
* @author STMicroelectronics
* @version V1.0
* @date 2015-xx-xx
* @brief <EFBFBD>߼<EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
******************************************************************************
* @attention
*
* ʵ<EFBFBD><EFBFBD>ƽ̨:<EFBFBD><EFBFBD><EFBFBD><EFBFBD> STM32 H750 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD>̳ :http://www.firebbs.cn
* <EFBFBD>Ա<EFBFBD> :https://fire-stm32.taobao.com
*
******************************************************************************
*/
#include "./tim/bsp_advance_tim.h"
#include "./led/bsp_led.h"
TIM_HandleTypeDef TIM_Handle;
TIM_OC_InitTypeDef sConfig;
TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig;
__IO uint16_t ChannelPulse = 4999;
/**
* @brief <EFBFBD>߼<EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD> TIMx,x=[1,8]ͨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ų<EFBFBD>ʼ<EFBFBD><EFBFBD>
* @param <EFBFBD><EFBFBD>
* @retval <EFBFBD><EFBFBD>
*/
static void TIMx_GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
ADVANCE_TIM_CHx_CLK();
ADVANCE_TIM_CHxN_CLK();
ADVANCE_TIM_BKIN_CLK();
GPIO_InitStruct.Pin = ADVANCE_TIM_CHx_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH ;
GPIO_InitStruct.Alternate = GPIO_AF3_TIM8;
HAL_GPIO_Init(ADVANCE_TIM_CHx_PORT, &GPIO_InitStruct);
GPIO_InitStruct.Pin = ADVANCE_TIM_CHxN_PIN;
HAL_GPIO_Init(ADVANCE_TIM_CHxN_PORT, &GPIO_InitStruct);
GPIO_InitStruct.Pin = ADVANCE_TIM_BKIN_PIN;
HAL_GPIO_Init(ADVANCE_TIM_BKIN_PORT, &GPIO_InitStruct);
}
/*
* ע<EFBFBD>TIM_TimeBaseInitTypeDef<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>5<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ա<EFBFBD><EFBFBD>TIM6<EFBFBD><EFBFBD>TIM7<EFBFBD>ļĴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD><EFBFBD>
* TIM_Prescaler<EFBFBD><EFBFBD>TIM_Period<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD>TIM6<EFBFBD><EFBFBD>TIM7<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>ֻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ա<EFBFBD><EFBFBD><EFBFBD>ɣ<EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ա<EFBFBD><EFBFBD>ͨ<EFBFBD>ö<EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD>͸߼<EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
*-----------------------------------------------------------------------------
* TIM_Prescaler <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* TIM_CounterMode TIMx,x[6,7]û<EFBFBD>У<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* TIM_Period <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* TIM_ClockDivision TIMx,x[6,7]û<EFBFBD>У<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>)
* TIM_RepetitionCounter TIMx,x[1,8]<EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<EFBFBD>߼<EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>)
*-----------------------------------------------------------------------------
*/
/**
* @brief <EFBFBD>߼<EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD> TIMx,x=[1,8]<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param <EFBFBD><EFBFBD>
* @retval <EFBFBD><EFBFBD>
*/
static void TIMx_Configuration(void)
{
//ʹ<><CAB9>TIMx<4D><78>ʱ<EFBFBD><CAB1>
ADVANCE_TIM_CLK_ENABLE();
//TIMx<4D><78><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ
TIM_Handle.Instance = ADVANCE_TIM;
//<2F><><EFBFBD><EFBFBD>ģʽΪ<CABD><CEAA><EFBFBD>ϼ<EFBFBD><CFBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
TIM_Handle.Init.CounterMode = TIM_COUNTERMODE_UP;
/* <20>ۼ<EFBFBD> TIM_Period<6F><64><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>»<EFBFBD><C2BB><EFBFBD><EFBFBD>ж<EFBFBD>*/
//<2F><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>0<EFBFBD><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD>9999<39><39><EFBFBD><EFBFBD>Ϊ10000<30>Σ<EFBFBD>Ϊһ<CEAA><D2BB><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>
TIM_Handle.Init.Period = 10000 - 1;
//ʱ<>Ӳ<EFBFBD><D3B2><EFBFBD>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>TIM_CLKʱ<4B>Ӽ<EFBFBD>1<EFBFBD><31>
TIM_Handle.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
//<2F><>ʱ<EFBFBD><CAB1>ʱ<EFBFBD><CAB1>ԴTIMxCLK = 2 * PCLK1
// PCLK1 = HCLK / 4
// => TIMxCLK=HCLK/2=SystemCoreClock/2=240MHz
// <20><EFBFBD><E8B6A8>ʱ<EFBFBD><CAB1>Ƶ<EFBFBD><C6B5>Ϊ=TIMxCLK/(TIM_Prescaler+1)=1000000Hz
TIM_Handle.Init.Prescaler = 240 - 1;
// <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>TIM
HAL_TIM_PWM_Init(&TIM_Handle);
/* <20><><EFBFBD><EFBFBD>TIMΪ<4D><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ */
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>PWM1ģʽ
//<2F><><EFBFBD><EFBFBD>ֵCNTС<54>ڱȽ<DAB1>ֵCCR<43><52>sConfig.Pulse<73><65><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8><78><CEAA>Ч<EFBFBD><D0A7>ƽ
//<2F><><EFBFBD><EFBFBD>ֵCNT<4E><54><EFBFBD>ڱȽ<DAB1>ֵCCR<43><52>sConfig.Pulse<73><65><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8><78><CEAA>Ч<EFBFBD><D0A7>ƽ
sConfig.OCMode = TIM_OCMODE_PWM1;
//CHx<48><78><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7>ƽΪ<C6BD>ߵ<EFBFBD>ƽ
sConfig.OCPolarity = TIM_OCNPOLARITY_LOW;
//CHx<48>ڿ<EFBFBD><DABF><EFBFBD>״̬<D7B4><CCAC>Ϊ<EFBFBD>͵<EFBFBD>ƽ
sConfig.OCIdleState = TIM_OCNIDLESTATE_SET;
//CHxN<78>ڿ<EFBFBD><DABF><EFBFBD>״̬<D7B4><CCAC>Ϊ<EFBFBD>ߵ<EFBFBD>ƽ(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>CHx<48>෴)
sConfig.OCNIdleState = TIM_OCIDLESTATE_RESET;
//CHxN<78><4E><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7>ƽΪ<C6BD>ߵ<EFBFBD>ƽ
sConfig.OCNPolarity = TIM_OCNPOLARITY_HIGH;
//<2F>Ƚ<EFBFBD><C8BD><EFBFBD>CCR<43><52>ֵ
sConfig.Pulse = ChannelPulse;
//<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƚ<EFBFBD>ͨ<EFBFBD><CDA8>
HAL_TIM_PWM_ConfigChannel(&TIM_Handle, &sConfig, ADVANCE_TIM_CH);
//ʹ<><CAB9><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_ENABLE;
//<2F><>·<EFBFBD><C2B7><EFBFBD><EFBFBD>ԣ<EFBFBD><D4A3>͵<EFBFBD>ƽ<EFBFBD><C6BD>Ч
sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_LOW;
//ʹ<>ܶ<EFBFBD>·<EFBFBD><C2B7><EFBFBD><EFBFBD>
sBreakDeadTimeConfig.BreakState = TIM_BREAK_ENABLE;
//<2F><><EFBFBD><EFBFBD>ʱ<EFBFBD>䣺11*Fdts
sBreakDeadTimeConfig.DeadTime = 11;
//<2F>ԼĴ<D4BC><C4B4><EFBFBD><EFBFBD>ṩд<E1B9A9><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Խ<EFBFBD>ߣ<EFBFBD><DFA3>ɲ<EFBFBD><C9B2><EFBFBD><EFBFBD>ļĴ<C4BC><C4B4><EFBFBD>λԽ<CEBB><D4BD>
sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_1;
//<2F><><EFBFBD><EFBFBD>ģʽ<C4A3>µĶ<C2B5>·״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_ENABLE;
//<2F><><EFBFBD><EFBFBD>ģʽ<C4A3>µĶ<C2B5>·״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_ENABLE;
//<2F><><EFBFBD><EFBFBD>TIMΪ<4D><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>·<EFBFBD><C2B7><EFBFBD><EFBFBD>
HAL_TIMEx_ConfigBreakDeadTime(&TIM_Handle, &sBreakDeadTimeConfig);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>CHxʹ<78><CAB9>
HAL_TIM_PWM_Start(&TIM_Handle, ADVANCE_TIM_CH);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>CHxNʹ<4E><CAB9>
HAL_TIMEx_PWMN_Start(&TIM_Handle, ADVANCE_TIM_CH);
}
/**
* @brief <EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>1ms<EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
* @param <EFBFBD><EFBFBD>
* @retval <EFBFBD><EFBFBD>
*/
void TIM_Advance_Init(void)
{
//TIMͨ<4D><CDA8><EFBFBD><EFBFBD><EFBFBD>ų<EFBFBD>ʼ<EFBFBD><CABC>
TIMx_GPIO_Configuration();
//TIM<49><4D><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>
TIMx_Configuration();
}
/*********************************************END OF FILE**********************/