// approximate us delay
void _delay_us(uint32_t Delay){
 __IO uint32_t  tmp = SysTick->CTRL;  // Clear the COUNTFLAG first
 ((void)tmp);
 // init systick to us delays ...
 SysTick->LOAD  = (SystemCoreClock/1000000)-1; // 1us time
 SysTick->VAL   = 0UL;
 SysTick->CTRL  = SysTick_CTRL_ENABLE_Msk | SysTick_CTRL_CLKSOURCE_Msk;

 if(Delay < 0xffffff){Delay++;} // Add a period to guaranty minimum wait
 while (Delay){
  if((SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk) != 0U){Delay--;}
 }
}

// approximate ms delay
void _delay_ms(uint32_t Delay){
 __IO uint32_t  tmp = SysTick->CTRL;  // Clear the COUNTFLAG first
 ((void)tmp);

 // init systick to us delays ...
 SysTick->LOAD  = (SystemCoreClock/1000)-1; // 1us time
 SysTick->VAL   = 0UL;
 SysTick->CTRL  = SysTick_CTRL_ENABLE_Msk | SysTick_CTRL_CLKSOURCE_Msk;

 if(Delay < 0xffffff){Delay++;} // Add a period to guaranty minimum wait
 while (Delay){
  if((SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk) != 0U){Delay--;}
 }
}

// periodic interrupt
uint8_t SysTick_irq_init(uint8_t freq){
 uint32_t ticks;
 ticks=((SystemCoreClock>>3)/freq)-1; // reduced frequency /8
 if ((ticks - 1UL) > 0xFFFFFFUL){return 1;}
 SysTick->LOAD  = ticks;
 NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL);
 SysTick->VAL   = 0UL;
 SysTick->CTRL  = SysTick_CTRL_TICKINT_Msk | SysTick_CTRL_ENABLE_Msk;
 return 0;
}

void SysTick_Handler(void){
 // do something
}