// 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
}