/** * @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; /** * @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 = ((DEAD_TIME_COUNTS) / 2); 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(); } } /** * @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(); } } /** * @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); } }