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