/** * @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); } }