I'm working on a project where I need to generate a pulse with a desired frequency, which can be adjusted through three different modes. The modes are as follows:

    Frequency remains the same.
    Frequency is divided by 2.
    Frequency is multiplied by 2.

The mode is selected using a switch(configured for external interrupt callback), and the pulse is generated using Timer 4(clock 48Mhz,prescalar 4800) in Output Compare mode with the "toggle on match" feature. The ARR (Auto-Reload Register) and CCR (Capture/Compare Register) values are set based on the output from a rotary encoder.

The pulse generation itself works as expected, but when switching between modes, the signal goes high for a fixed period of time (8 seconds) before returning to the expected pulse pattern.

Has anyone encountered a similar issue? What could be the possible reasons for this behavior, and how can I address it?. `	



while (1)
	{
		
		Rotary_Enc_Chk();

		if(rotChk == TRUE)
		{
			rotChk = FALSE;

			sprintf(txBuffer, "Speed: %d\n\r", speed);
			HAL_UART_Transmit(&huart1, (uint8_t*)txBuffer, strlen(txBuffer), 10);
			TM1637_DisplayDecimal(speed, 0);										
			if(speed > 0)
			{
				uint16_t freq = (10000 / (2 * xFactor * speed )) - 1;
				//uint16_t freq = speed;
				TIM14->ARR = freq;
				TIM14->CCR1 = freq;
				HAL_TIM_OC_Start(&htim14, TIM_CHANNEL_1);


			}
			else {
				sprintf(txBuffer, "Speed: %d\n\r", speed);
				HAL_UART_Transmit(&huart1, (uint8_t*)txBuffer, strlen(txBuffer), 10);
			}
		}

		if(modeChange == TRUE)
		{

			sprintf(txBuffer, "Mode: %d\n\r", speed);
			HAL_UART_Transmit(&huart1, (uint8_t*)txBuffer, strlen(txBuffer), 10);
			rotChk = TRUE;
			modeChange = FALSE;
			Mode_Check();
		}`







void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
	
	UNUSED(GPIO_Pin);

	if((GPIO_Pin == _2X_SEL_Pin) || (GPIO_Pin == X_2_SEL_Pin))
	{
		modeChange = TRUE;
	}


void Mode_Check(){
	if(HAL_GPIO_ReadPin(GPIOA, _2X_SEL_Pin) == GPIO_PIN_RESET)
	{
		currMode = FAST_2X;
		xFactor = 2;
		All_Led_Off();
		Red_Led_On();
	}
	else if(HAL_GPIO_ReadPin(GPIOA, X_2_SEL_Pin) == GPIO_PIN_RESET)
	{
		currMode = SLOW_X_2;
		xFactor = 0.5;
		All_Led_Off();
		Blue_Led_On();
	}
	else
	{
		currMode = MEDIUM_X;
		xFactor = 1;
		All_Led_Off();
		Green_Led_On();
	}
}