/*------------------------------------------------------------------------------------------------------------------------------------------- * delay.c - delay functions * * Copyright (c) 2014-2026 Frank Meyer - frank(at)uclock.de * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. *------------------------------------------------------------------------------------------------------------------------------------------- */ #include #include "delay.h" uint32_t delay_ticks_per_usec; void SysTick_Handler(void); // keep compiler happy /*------------------------------------------------------------------------------------------------------------------------------------------- * SysTick_Handler() - decrement delay_counter *------------------------------------------------------------------------------------------------------------------------------------------- */ void SysTick_Handler(void) { // SysTick ISR needed because SysTick is running for delay functionality } /*------------------------------------------------------------------------------------------------------------------------------------------- * delay_usec() - delay n microseconds (usec) *------------------------------------------------------------------------------------------------------------------------------------------- */ void delay_usec (uint32_t usec) { uint32_t t0 = SysTick->VAL; uint32_t ticks = (usec * delay_ticks_per_usec); while(1) { uint32_t dt = (t0 - SysTick->VAL) & 0x00FFFFFF; // note: SysTick counter is 24 bit if (dt > ticks) break; } } /*------------------------------------------------------------------------------------------------------------------------------------------- * delay_msec() - delay n milliseconds (msec) *------------------------------------------------------------------------------------------------------------------------------------------- */ void delay_msec (uint32_t msec) { while (msec--) { delay_usec (1000); } } /*------------------------------------------------------------------------------------------------------------------------------------------- * delay_msec() - delay n seconds (sec) *------------------------------------------------------------------------------------------------------------------------------------------- */ void delay_sec (uint32_t sec) { while (sec--) { delay_msec (1000); } } /*------------------------------------------------------------------------------------------------------------------------------------------- * delay_init() - init delay functions *------------------------------------------------------------------------------------------------------------------------------------------- */ void delay_init (void) { SysTick_Config (SysTick_LOAD_RELOAD_Msk); // use free running 24 bit timer delay_ticks_per_usec = SystemCoreClock / 1000000; // number of timer ticks for 1 usec }