AnsweredAssumed Answered

Systick timing unexpected.

Question asked by chen.stanley on Apr 26, 2016
Latest reply on Apr 27, 2016 by chen.stanley

Hi all,

I am working with STM32F411CE.
I know that if I use below code will occurred every 1 ms, but it occurred every 0.5ms in my code.

HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);    // HAL_RCC_GetHCLKFreq = 96000000;

I have searched the keyword "systick_config" and others, but I still could not resolve it.
Please give some me advise to debug.

I know it will depend on the Clock configuration. I post my configuration as below.

My Code generated by STM32CubeMX.
/** System Clock Configuration
*/
void SystemClock_Config(void)
{

  RCC_OscInitTypeDef RCC_OscInitStruct;
  RCC_ClkInitTypeDef RCC_ClkInitStruct;

  __PWR_CLK_ENABLE();

  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);

  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.HSICalibrationValue = 16;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
  RCC_OscInitStruct.PLL.PLLM = 8;
  RCC_OscInitStruct.PLL.PLLN = 192;
  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV4;
  RCC_OscInitStruct.PLL.PLLQ = 8;
  HAL_RCC_OscConfig(&RCC_OscInitStruct);

  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1
                              |RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;
  HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_3);

  HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);
  //HAL_SYSTICK_Config(SystemCoreClock/1000);    //Same result

  HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);

  /* SysTick_IRQn interrupt configuration */
  HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
}

  /*---------------------------------------------------------------------------*/
  void SysTick_Handler(void) {
      HAL_IncTick();
      HAL_SYSTICK_IRQHandler();
      count++;
  }

  __weak void HAL_IncTick(void)
{
  uwTick++;
}
__weak uint32_t HAL_GetTick(void)
{
  return uwTick;
}

/* Main while loop */
 uint32_t        tickupdate;
while(1)
{
         if(HAL_GetTick() > tickupdate)
 {
  tickupdate = HAL_GetTick() + 10000;    // 10000 ms = 10 sec
  printf("* tick every 10sec : %d \r\n", _ticktupdate); 
 }
}

Actual Result:
I saw the message print every 5 sec. (Wrong)

Expected Result:
It should be print the message every 10 sec.

Please help to give me some suggestions.
Thanks All.

Outcomes