Skip to main content
Explorer II
July 28, 2025
Question

COMP connects to TIM

  • July 28, 2025
  • 1 reply
  • 262 views

I am using a STM32H723ZGT6.

I am trying to Trigger an Input Capture on TIM1 Channel 1 by connecting to the output of the Comparator internally,but cannot get the TIM1 Configuration to fire the Input Capture Callback.

I've turned on the input capture interrupt function and comparator.

HAL_COMP_Start(&hcomp1);
  __HAL_TIM_SET_PRESCALER(&htim1, 275-1);
  HAL_TIM_IC_Start_IT(&htim1, TIM_CHANNEL_1);
  HAL_TIM_IC_Start_IT(&htim1, TIM_CHANNEL_2);

The generated Config Code for the Comparator and the Timer are as follows.

/* COMP1 init function */
void MX_COMP1_Init(void)
{

 /* USER CODE BEGIN COMP1_Init 0 */

 /* USER CODE END COMP1_Init 0 */

 /* USER CODE BEGIN COMP1_Init 1 */

 /* USER CODE END COMP1_Init 1 */
 hcomp1.Instance = COMP1;
 hcomp1.Init.InvertingInput = COMP_INPUT_MINUS_1_2VREFINT;
 hcomp1.Init.NonInvertingInput = COMP_INPUT_PLUS_IO2;
 hcomp1.Init.OutputPol = COMP_OUTPUTPOL_NONINVERTED;
 hcomp1.Init.Hysteresis = COMP_HYSTERESIS_NONE;
 hcomp1.Init.BlankingSrce = COMP_BLANKINGSRC_NONE;
 hcomp1.Init.Mode = COMP_POWERMODE_HIGHSPEED;
 hcomp1.Init.WindowMode = COMP_WINDOWMODE_DISABLE;
 hcomp1.Init.TriggerMode = COMP_TRIGGERMODE_IT_RISING;
 if (HAL_COMP_Init(&hcomp1) != HAL_OK)
 {
 Error_Handler();
 }
 /* USER CODE BEGIN COMP1_Init 2 */

 /* USER CODE END COMP1_Init 2 */

}

void HAL_COMP_MspInit(COMP_HandleTypeDef* compHandle)
{

 GPIO_InitTypeDef GPIO_InitStruct = {0};
 if(compHandle->Instance==COMP1)
 {
 /* USER CODE BEGIN COMP1_MspInit 0 */

 /* USER CODE END COMP1_MspInit 0 */
 /* COMP1 clock enable */
 __HAL_RCC_COMP12_CLK_ENABLE();

 __HAL_RCC_GPIOB_CLK_ENABLE();
 /**COMP1 GPIO Configuration
 PB2 ------> COMP1_INP
 */
 GPIO_InitStruct.Pin = GPIO_PIN_2;
 GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
 GPIO_InitStruct.Pull = GPIO_NOPULL;
 HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

 /* COMP1 interrupt Init */
 HAL_NVIC_SetPriority(COMP_IRQn, 0, 0);
 HAL_NVIC_EnableIRQ(COMP_IRQn);
 /* USER CODE BEGIN COMP1_MspInit 1 */

 /* USER CODE END COMP1_MspInit 1 */
 }
}

void HAL_COMP_MspDeInit(COMP_HandleTypeDef* compHandle)
{

 if(compHandle->Instance==COMP1)
 {
 /* USER CODE BEGIN COMP1_MspDeInit 0 */

 /* USER CODE END COMP1_MspDeInit 0 */
 /* Peripheral clock disable */
 __HAL_RCC_COMP12_CLK_DISABLE();

 /**COMP1 GPIO Configuration
 PB2 ------> COMP1_INP
 */
 HAL_GPIO_DeInit(GPIOB, GPIO_PIN_2);

 /* COMP1 interrupt Deinit */
 HAL_NVIC_DisableIRQ(COMP_IRQn);
 /* USER CODE BEGIN COMP1_MspDeInit 1 */

 /* USER CODE END COMP1_MspDeInit 1 */
 }
}


/* TIM1 init function */
void MX_TIM1_Init(void)
{

 /* USER CODE BEGIN TIM1_Init 0 */

 /* USER CODE END TIM1_Init 0 */

 TIM_ClockConfigTypeDef sClockSourceConfig = {0};
 TIM_MasterConfigTypeDef sMasterConfig = {0};
 TIM_IC_InitTypeDef sConfigIC = {0};

 /* USER CODE BEGIN TIM1_Init 1 */

 /* USER CODE END TIM1_Init 1 */
 htim1.Instance = TIM1;
 htim1.Init.Prescaler = 25-1;
 htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
 htim1.Init.Period = 65535;
 htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
 htim1.Init.RepetitionCounter = 0;
 htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
 if (HAL_TIM_Base_Init(&htim1) != HAL_OK)
 {
 Error_Handler();
 }
 sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
 if (HAL_TIM_ConfigClockSource(&htim1, &sClockSourceConfig) != HAL_OK)
 {
 Error_Handler();
 }
 if (HAL_TIM_IC_Init(&htim1) != HAL_OK)
 {
 Error_Handler();
 }
 sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
 sMasterConfig.MasterOutputTrigger2 = TIM_TRGO2_RESET;
 sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
 if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK)
 {
 Error_Handler();
 }
 sConfigIC.ICPolarity = TIM_INPUTCHANNELPOLARITY_RISING;
 sConfigIC.ICSelection = TIM_ICSELECTION_DIRECTTI;
 sConfigIC.ICPrescaler = TIM_ICPSC_DIV1;
 sConfigIC.ICFilter = 0;
 if (HAL_TIM_IC_ConfigChannel(&htim1, &sConfigIC, TIM_CHANNEL_1) != HAL_OK)
 {
 Error_Handler();
 }
 if (HAL_TIMEx_TISelection(&htim1, TIM_TIM1_TI1_COMP1, TIM_CHANNEL_1) != HAL_OK)
 {
 Error_Handler();
 }
 sConfigIC.ICPolarity = TIM_INPUTCHANNELPOLARITY_FALLING;
 sConfigIC.ICSelection = TIM_ICSELECTION_INDIRECTTI;
 if (HAL_TIM_IC_ConfigChannel(&htim1, &sConfigIC, TIM_CHANNEL_2) != HAL_OK)
 {
 Error_Handler();
 }
 /* USER CODE BEGIN TIM1_Init 2 */

 /* USER CODE END TIM1_Init 2 */

}

 

    This topic has been closed for replies.

    1 reply

    ST Employee
    July 31, 2025

    Hello @smile

    You have to check that the comparator output is active and generating the expected signal without the timer's input capture, have you been able to to check that first?