summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Halbert <halbert@adafruit.com>2019-11-12 18:03:55 -0500
committerGitHub <noreply@github.com>2019-11-12 18:03:55 -0500
commit166518fc9b9f6587da5620c032822e7fc9fbddc4 (patch)
tree8cd208bae8723bae50c3a1eab639a9df26b1873c
parent356aa2ea28d29d758809f7a5d845b048e13aa16d (diff)
parentc38086fc4a14bc4d93d63ffe35451efdf95a0ed2 (diff)
Merge pull request #2272 from hierophect/stm32-microcontroller-fillout
STM32: add us delay
-rw-r--r--ports/stm32f4/common-hal/microcontroller/__init__.c53
-rw-r--r--ports/stm32f4/mphalport.h2
2 files changed, 46 insertions, 9 deletions
diff --git a/ports/stm32f4/common-hal/microcontroller/__init__.c b/ports/stm32f4/common-hal/microcontroller/__init__.c
index 4a6fdc388..c7493a4d6 100644
--- a/ports/stm32f4/common-hal/microcontroller/__init__.c
+++ b/ports/stm32f4/common-hal/microcontroller/__init__.c
@@ -39,17 +39,56 @@
#include "supervisor/filesystem.h"
#include "supervisor/shared/safe_mode.h"
-// This routine should work even when interrupts are disabled. Used by OneWire
-// for precise timing.
+#include "stm32f4xx_hal.h"
+
+//tested divisor value for busy loop in us delay
+#define LOOP_TICKS 12
+
+STATIC uint32_t get_us(void) {
+ uint32_t ticks_per_us = HAL_RCC_GetSysClockFreq()/1000000;
+ uint32_t micros, sys_cycles;
+ do {
+ micros = ticks_ms;
+ sys_cycles = SysTick->VAL; //counts backwards
+ } while (micros != ticks_ms); //try again if ticks_ms rolled over
+ return (micros * 1000) + (ticks_per_us * 1000 - sys_cycles) / ticks_per_us;
+}
+
void common_hal_mcu_delay_us(uint32_t delay) {
- //TODO: implement equivalent of mp_hal_delay_us(delay);
- //this is fairly annoying in the STM32 HAL
+ if (__get_PRIMASK() == 0x00000000) {
+ //by default use ticks_ms
+ uint32_t start = get_us();
+ while (get_us()-start < delay) {
+ __asm__ __volatile__("nop");
+ }
+ } else {
+ //when SysTick is disabled, approximate with busy loop
+ const uint32_t ucount = HAL_RCC_GetSysClockFreq() / 1000000 * delay / LOOP_TICKS;
+ for (uint32_t count = 0; ++count <= ucount;) {
+ }
+ }
}
-void common_hal_mcu_disable_interrupts() {
+volatile uint32_t nesting_count = 0;
+
+void common_hal_mcu_disable_interrupts(void) {
+ __disable_irq();
+ __DMB();
+ nesting_count++;
}
-void common_hal_mcu_enable_interrupts() {
+void common_hal_mcu_enable_interrupts(void) {
+ if (nesting_count == 0) {
+ // This is very very bad because it means there was mismatched disable/enables so we
+ // "HardFault".
+ asm("bkpt");
+ }
+ nesting_count--;
+ if (nesting_count > 0) {
+ return;
+ }
+ __DMB();
+ __enable_irq();
}
void common_hal_mcu_on_next_reset(mcu_runmode_t runmode) {
@@ -58,7 +97,7 @@ void common_hal_mcu_on_next_reset(mcu_runmode_t runmode) {
}
void common_hal_mcu_reset(void) {
- filesystem_flush();
+ filesystem_flush(); //TODO: implement as part of flash improvements
NVIC_SystemReset();
}
diff --git a/ports/stm32f4/mphalport.h b/ports/stm32f4/mphalport.h
index 131f2751d..d184138f7 100644
--- a/ports/stm32f4/mphalport.h
+++ b/ports/stm32f4/mphalport.h
@@ -33,8 +33,6 @@
#include "lib/utils/interrupt_char.h"
#include "py/mpconfig.h"
-//extern nrfx_uarte_t serial_instance;
-
extern volatile uint64_t ticks_ms;
#define mp_hal_ticks_ms() ((mp_uint_t) ticks_ms)