348 lines
10 KiB
C
348 lines
10 KiB
C
/**
|
|
* @file timer.c
|
|
* @author jimingqing
|
|
* @date 2023-08-14
|
|
* @version 0.0.1
|
|
* @copyright XiazhiTech Copyright (c) 2023
|
|
*
|
|
* @brief
|
|
*/
|
|
|
|
/* Includes ------------------------------------------------------------------*/
|
|
#include "timer.h"
|
|
#include "board.h"
|
|
#include "stm32f4xx_ll_tim.h"
|
|
|
|
TIM_HandleTypeDef htim1;
|
|
TIM_HandleTypeDef htim3;
|
|
|
|
void HAL_TIM_MspPostInit(TIM_HandleTypeDef *htim);
|
|
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim_base);
|
|
void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef *htim_base);
|
|
|
|
|
|
/**
|
|
* @brief TIM1 Initialization Function
|
|
* @param None
|
|
* @retval None
|
|
*/
|
|
void MX_TIM1_Init(void)
|
|
{
|
|
TIM_SlaveConfigTypeDef sSlaveConfig = {0};
|
|
TIM_MasterConfigTypeDef sMasterConfig = {0};
|
|
TIM_OC_InitTypeDef sConfigOC = {0};
|
|
TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig = {0};
|
|
|
|
/**
|
|
* 定时器主频84M 不分频
|
|
*/
|
|
htim1.Instance = TIM1;
|
|
htim1.Init.Prescaler = 0;
|
|
htim1.Init.CounterMode = TIM_COUNTERMODE_CENTERALIGNED1;
|
|
htim1.Init.Period = (84 * 1000000 / 16000);
|
|
htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV2;
|
|
htim1.Init.RepetitionCounter = 1;
|
|
htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
|
|
if (HAL_TIM_Base_Init(&htim1) != HAL_OK)
|
|
{
|
|
Error_Handler();
|
|
}
|
|
if (HAL_TIM_PWM_Init(&htim1) != HAL_OK)
|
|
{
|
|
Error_Handler();
|
|
}
|
|
// sSlaveConfig.SlaveMode = TIM_SLAVEMODE_TRIGGER;
|
|
// sSlaveConfig.InputTrigger = TIM_TS_ITR1;
|
|
// if (HAL_TIM_SlaveConfigSynchro(&htim1, &sSlaveConfig) != HAL_OK)
|
|
// {
|
|
// Error_Handler();
|
|
// }
|
|
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
|
|
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
|
|
if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK)
|
|
{
|
|
Error_Handler();
|
|
}
|
|
sConfigOC.OCMode = TIM_OCMODE_PWM1;
|
|
sConfigOC.Pulse = 0;
|
|
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
|
|
sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH;
|
|
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
|
|
sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;
|
|
sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET;
|
|
if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
|
|
{
|
|
Error_Handler();
|
|
}
|
|
if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_2) != HAL_OK)
|
|
{
|
|
Error_Handler();
|
|
}
|
|
if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_3) != HAL_OK)
|
|
{
|
|
Error_Handler();
|
|
}
|
|
sConfigOC.OCMode = TIM_OCMODE_PWM2;
|
|
sConfigOC.Pulse = ((84 * 1000000 / 16000) - 1);
|
|
if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_4) != HAL_OK)
|
|
{
|
|
Error_Handler();
|
|
}
|
|
sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_ENABLE;
|
|
sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_ENABLE;
|
|
sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_1;
|
|
sBreakDeadTimeConfig.DeadTime = 100;
|
|
sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE;
|
|
sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_LOW;
|
|
sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE;
|
|
if (HAL_TIMEx_ConfigBreakDeadTime(&htim1, &sBreakDeadTimeConfig) != HAL_OK)
|
|
{
|
|
Error_Handler();
|
|
}
|
|
// if (HAL_TIM_Base_Init(&htim1) != HAL_OK)
|
|
// {
|
|
// Error_Handler();
|
|
// }
|
|
HAL_TIM_MspPostInit(&htim1);
|
|
}
|
|
|
|
/**
|
|
* @brief TIM3 Initialization Function
|
|
* @param None
|
|
* @retval None
|
|
*/
|
|
void MX_TIM3_Init(void)
|
|
{
|
|
|
|
TIM_ClockConfigTypeDef sClockSourceConfig = {0};
|
|
TIM_HallSensor_InitTypeDef sConfig = {0};
|
|
TIM_MasterConfigTypeDef sMasterConfig = {0};
|
|
|
|
htim3.Instance = TIM3;
|
|
htim3.Init.Prescaler = 0;
|
|
htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
|
|
htim3.Init.Period = 65535;
|
|
htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
|
|
htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
|
|
if (HAL_TIM_Base_Init(&htim3) != HAL_OK)
|
|
{
|
|
Error_Handler();
|
|
}
|
|
sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
|
|
if (HAL_TIM_ConfigClockSource(&htim3, &sClockSourceConfig) != HAL_OK)
|
|
{
|
|
Error_Handler();
|
|
}
|
|
sConfig.IC1Polarity = TIM_ICPOLARITY_RISING;
|
|
sConfig.IC1Prescaler = TIM_ICPSC_DIV1;
|
|
sConfig.IC1Filter = 11;
|
|
sConfig.Commutation_Delay = 0;
|
|
if (HAL_TIMEx_HallSensor_Init(&htim3, &sConfig) != HAL_OK)
|
|
{
|
|
Error_Handler();
|
|
}
|
|
sMasterConfig.MasterOutputTrigger = TIM_TRGO_OC2REF;
|
|
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
|
|
if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK)
|
|
{
|
|
Error_Handler();
|
|
}
|
|
|
|
/* Set IC filter for Channel 1 (ICF1) */
|
|
LL_TIM_IC_SetFilter(TIM3, LL_TIM_CHANNEL_CH1, (uint32_t)(11) << 20);
|
|
|
|
/* Force the TIMx prescaler with immediate access (gen update event)
|
|
*/
|
|
LL_TIM_SetPrescaler(TIM3, 65535);
|
|
LL_TIM_GenerateEvent_UPDATE(TIM3);
|
|
|
|
LL_TIM_SetUpdateSource(TIM3, LL_TIM_UPDATESOURCE_COUNTER);
|
|
|
|
LL_TIM_EnableIT_CC1(TIM3);
|
|
LL_TIM_EnableIT_UPDATE(TIM3);
|
|
LL_TIM_SetCounter(TIM3, 0);
|
|
|
|
LL_TIM_CC_EnableChannel(TIM3, LL_TIM_CHANNEL_CH1);
|
|
LL_TIM_EnableCounter(TIM3);
|
|
}
|
|
|
|
void HAL_TIM_MspPostInit(TIM_HandleTypeDef *htim)
|
|
{
|
|
GPIO_InitTypeDef GPIO_InitStruct = {0};
|
|
if (htim->Instance == TIM1)
|
|
{
|
|
/* USER CODE BEGIN TIM1_MspPostInit 0 */
|
|
|
|
/* USER CODE END TIM1_MspPostInit 0 */
|
|
|
|
__HAL_RCC_GPIOB_CLK_ENABLE();
|
|
__HAL_RCC_GPIOA_CLK_ENABLE();
|
|
/**TIM1 GPIO Configuration
|
|
PB13 ------> TIM1_CH1N
|
|
PB14 ------> TIM1_CH2N
|
|
PB15 ------> TIM1_CH3N
|
|
PA8 ------> TIM1_CH1
|
|
PA9 ------> TIM1_CH2
|
|
PA10 ------> TIM1_CH3
|
|
*/
|
|
GPIO_InitStruct.Pin = GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15;
|
|
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
|
|
GPIO_InitStruct.Pull = GPIO_NOPULL;
|
|
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
|
|
GPIO_InitStruct.Alternate = GPIO_AF1_TIM1;
|
|
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
|
|
|
|
GPIO_InitStruct.Pin = GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_10;
|
|
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
|
|
GPIO_InitStruct.Pull = GPIO_NOPULL;
|
|
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
|
|
GPIO_InitStruct.Alternate = GPIO_AF1_TIM1;
|
|
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
|
|
|
|
/* USER CODE BEGIN TIM1_MspPostInit 1 */
|
|
|
|
/* USER CODE END TIM1_MspPostInit 1 */
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @brief TIM_Base MSP Initialization
|
|
* This function configures the hardware resources used in this example
|
|
* @param htim_base: TIM_Base handle pointer
|
|
* @retval None
|
|
*/
|
|
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim_base)
|
|
{
|
|
GPIO_InitTypeDef GPIO_InitStruct = {0};
|
|
if (htim_base->Instance == TIM1)
|
|
{
|
|
// /* Peripheral clock enable */
|
|
__HAL_RCC_TIM1_CLK_ENABLE();
|
|
// __HAL_RCC_GPIOA_CLK_ENABLE();
|
|
// __HAL_RCC_GPIOB_CLK_ENABLE();
|
|
|
|
// /**TIM1 GPIO Configuration
|
|
// PA10 ------> TIM1_CH3
|
|
// PA9 ------> TIM1_CH2
|
|
// PA8 ------> TIM1_CH1
|
|
// PB13 ------> TIM1_CH1N
|
|
// PB14 ------> TIM1_CH2N
|
|
// PB15 ------> TIM1_CH3N
|
|
// */
|
|
// GPIO_InitStruct.Pin = GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_10;
|
|
// GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
|
|
// GPIO_InitStruct.Pull = GPIO_PULLDOWN;
|
|
// GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
|
|
// GPIO_InitStruct.Alternate = GPIO_AF1_TIM1;
|
|
// HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
|
|
|
|
// GPIO_InitStruct.Pin = GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15;
|
|
// GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
|
|
// GPIO_InitStruct.Pull = GPIO_PULLDOWN;
|
|
// GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
|
|
// GPIO_InitStruct.Alternate = GPIO_AF1_TIM1;
|
|
// HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
|
|
}
|
|
else if (htim_base->Instance == TIM3)
|
|
{
|
|
/* Peripheral clock enable */
|
|
__HAL_RCC_TIM3_CLK_ENABLE();
|
|
__HAL_RCC_GPIOC_CLK_ENABLE();
|
|
/**TIM3 GPIO Configuration
|
|
PC8 ------> TIM3_CH3
|
|
PC7 ------> TIM3_CH2
|
|
PC6 ------> TIM3_CH1
|
|
*/
|
|
GPIO_InitStruct.Pin = GPIO_PIN_6 | GPIO_PIN_7 | GPIO_PIN_8;
|
|
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
|
|
GPIO_InitStruct.Pull = GPIO_NOPULL;
|
|
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
|
|
GPIO_InitStruct.Alternate = GPIO_AF2_TIM3;
|
|
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @brief TIM_Base MSP De-Initialization
|
|
* This function freeze the hardware resources used in this example
|
|
* @param htim_base: TIM_Base handle pointer
|
|
* @retval None
|
|
*/
|
|
void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef *htim_base)
|
|
{
|
|
if (htim_base->Instance == TIM1)
|
|
{
|
|
/* Peripheral clock disable */
|
|
__HAL_RCC_TIM1_CLK_DISABLE();
|
|
|
|
/* TIM1 interrupt DeInit */
|
|
HAL_NVIC_DisableIRQ(TIM1_BRK_TIM9_IRQn);
|
|
HAL_NVIC_DisableIRQ(TIM1_UP_TIM10_IRQn);
|
|
}
|
|
else if (htim_base->Instance == TIM3)
|
|
{
|
|
|
|
/* Peripheral clock disable */
|
|
__HAL_RCC_TIM3_CLK_DISABLE();
|
|
|
|
/**TIM3 GPIO Configuration
|
|
PC8 ------> TIM3_CH3
|
|
PC7 ------> TIM3_CH2
|
|
PC6 ------> TIM3_CH1
|
|
*/
|
|
HAL_GPIO_DeInit(GPIOC, GPIO_PIN_6 | GPIO_PIN_7 | GPIO_PIN_8);
|
|
|
|
/* TIM3 interrupt DeInit */
|
|
HAL_NVIC_DisableIRQ(TIM3_IRQn);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @brief This function handles first motor TIMx Update interrupt request.
|
|
* @param None
|
|
* @retval None
|
|
*/
|
|
void TIM1_UP_TIM10_IRQHandler(void)
|
|
{
|
|
// LL_TIM_ClearFlag_UPDATE(PWM_Handle_M1.pParams_str->TIMx);
|
|
// R3_2_TIMx_UP_IRQHandler(&PWM_Handle_M1);
|
|
}
|
|
|
|
/**
|
|
* @brief This function handles first motor BRK interrupt.
|
|
* @param None
|
|
* @retval None
|
|
*/
|
|
void TIM1_BRK_TIM9_IRQHandler(void)
|
|
{
|
|
// if (LL_TIM_IsActiveFlag_BRK(PWM_Handle_M1.pParams_str->TIMx))
|
|
// {
|
|
// LL_TIM_ClearFlag_BRK(PWM_Handle_M1.pParams_str->TIMx);
|
|
// R3_2_BRK_IRQHandler(&PWM_Handle_M1);
|
|
// }
|
|
// /* Systick is not executed due low priority so is necessary to call MC_Scheduler here.*/
|
|
// MC_Scheduler();
|
|
}
|
|
|
|
/**
|
|
* @brief This function handles TIMx global interrupt request for M1 Speed Sensor.
|
|
* @param None
|
|
* @retval None
|
|
*/
|
|
void TIM3_IRQHandler(void)
|
|
{
|
|
/* HALL Timer Update IT always enabled, no need to check enable UPDATE state */
|
|
if (LL_TIM_IsActiveFlag_UPDATE(TIM3))
|
|
{
|
|
LL_TIM_ClearFlag_UPDATE(TIM3);
|
|
// HALL_TIMx_UP_IRQHandler(&HALL_M1);
|
|
}
|
|
|
|
/* HALL Timer CC1 IT always enabled, no need to check enable CC1 state */
|
|
if (LL_TIM_IsActiveFlag_CC1(TIM3))
|
|
{
|
|
LL_TIM_ClearFlag_CC1(TIM3);
|
|
// HALL_TIMx_CC_IRQHandler(&HALL_M1);
|
|
}
|
|
}
|