Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/ClusterM/flipperzero-firmware.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/targets/f7/furi_hal/furi_hal_delay.c')
-rw-r--r--firmware/targets/f7/furi_hal/furi_hal_delay.c36
1 files changed, 36 insertions, 0 deletions
diff --git a/firmware/targets/f7/furi_hal/furi_hal_delay.c b/firmware/targets/f7/furi_hal/furi_hal_delay.c
new file mode 100644
index 00000000..60c9b1c4
--- /dev/null
+++ b/firmware/targets/f7/furi_hal/furi_hal_delay.c
@@ -0,0 +1,36 @@
+#include "furi_hal_delay.h"
+
+#include <furi.h>
+#include <cmsis_os2.h>
+
+#define TAG "FuriHalDelay"
+
+static uint32_t clk_per_microsecond;
+
+void furi_hal_delay_init(void) {
+ CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;
+ DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk;
+ DWT->CYCCNT = 0U;
+ clk_per_microsecond = SystemCoreClock / 1000000.0f;
+ FURI_LOG_I(TAG, "Init OK");
+}
+
+void delay_us(float microseconds) {
+ uint32_t start = DWT->CYCCNT;
+ uint32_t time_ticks = microseconds * clk_per_microsecond;
+ while((DWT->CYCCNT - start) < time_ticks) {
+ };
+}
+
+// cannot be used in ISR
+// TODO add delay_ISR variant
+void delay(float milliseconds) {
+ uint32_t ticks = milliseconds / (1000.0f / osKernelGetTickFreq());
+ osStatus_t result = osDelay(ticks);
+ (void)result;
+ furi_assert(result == osOK);
+}
+
+uint32_t millis(void) {
+ return HAL_GetTick();
+}