//-----------------------------------------------------------------------------
#include <stdio.h>
#include <inttypes.h>
//-----------------------------------------------------------------------------

#define __IO

static uint32_t Ticks;

/// Debug version of HAL_GetTick()
static uint32_t HAL_GetTick()
{
	return Ticks++;
}

//-----------------------------------------------------------------------------

#if 1

/// Original HAL_Delay() from CubeMX
void HAL_Delay(__IO uint32_t Delay)
{
  uint32_t timingdelay;
  
  timingdelay = HAL_GetTick() + Delay;
  while(HAL_GetTick() < timingdelay)
  {
  }
}

#else

/// Proposed HAL_Delay()
void HAL_Delay(__IO uint32_t Delay)
{
  uint32_t tt = HAL_GetTick();
  
  while((uint32_t)(HAL_GetTick() - tt) < Delay)
  {
  }
}

#endif

//-----------------------------------------------------------------------------

int main(int argv, char * argc[])
{
	uint32_t temp;
	
	Ticks = 0xFFFFFFE0;
	
	temp = Ticks;
	HAL_Delay(10);
	printf("%" PRIu32 "\n", (uint32_t)(Ticks - temp));
	
	temp = Ticks;
	HAL_Delay(10);
	printf("%" PRIu32 "\n", (uint32_t)(Ticks - temp));

	temp = Ticks;
	HAL_Delay(10);
	printf("%" PRIu32 "\n", (uint32_t)(Ticks - temp));

	temp = Ticks;
	HAL_Delay(10);
	printf("%" PRIu32 "\n", (uint32_t)(Ticks - temp));

	temp = Ticks;
	HAL_Delay(10);
	printf("%" PRIu32 "\n", (uint32_t)(Ticks - temp));

	temp = Ticks;
	HAL_Delay(10);
	printf("%" PRIu32 "\n", (uint32_t)(Ticks - temp));

	temp = Ticks;
	HAL_Delay(10);
	printf("%" PRIu32 "\n", (uint32_t)(Ticks - temp));

	temp = Ticks;
	HAL_Delay(10);
	printf("%" PRIu32 "\n", (uint32_t)(Ticks - temp));

	temp = Ticks;
	HAL_Delay(10);
	printf("%" PRIu32 "\n", (uint32_t)(Ticks - temp));

	return 0;
}

