diff options
| author | Dan Halbert <halbert@halwitz.org> | 2018-06-29 16:01:46 -0400 |
|---|---|---|
| committer | Dan Halbert <halbert@halwitz.org> | 2018-06-29 16:01:46 -0400 |
| commit | 2a0b8576439b0cfefff909135dba424a2a179275 (patch) | |
| tree | 65af38bd381fbf571692540cf5814812d7de77ca /ports | |
| parent | b4fd77bb7c041d2855dba826f380ce66944c23d4 (diff) | |
implement mp_hal_delay_us() to not need interrupts, and use it
Diffstat (limited to 'ports')
| -rw-r--r-- | ports/atmel-samd/mphalport.c | 9 | ||||
| -rw-r--r-- | ports/atmel-samd/mphalport.h | 2 | ||||
| -rw-r--r-- | ports/esp8266/Makefile | 1 | ||||
| -rw-r--r-- | ports/nrf/common-hal/microcontroller/__init__.c | 3 | ||||
| -rw-r--r-- | ports/nrf/mphalport.c | 14 | ||||
| -rw-r--r-- | ports/nrf/mphalport.h | 2 |
6 files changed, 5 insertions, 26 deletions
diff --git a/ports/atmel-samd/mphalport.c b/ports/atmel-samd/mphalport.c index 7bb423a3e..a4eca1c74 100644 --- a/ports/atmel-samd/mphalport.c +++ b/ports/atmel-samd/mphalport.c @@ -99,10 +99,7 @@ void mp_hal_delay_ms(mp_uint_t delay) { } } -void mp_hal_delay_us(mp_uint_t delay) { - tick_delay(delay); -} - +// Use mp_hal_delay_us() for timing of less than 1ms. // Do a simple timing loop to wait for a certain number of microseconds. // Can be used when interrupts are disabled, which makes tick_delay() unreliable. // @@ -115,8 +112,8 @@ void mp_hal_delay_us(mp_uint_t delay) { #define DELAY_LOOP_ITERATIONS_PER_US ( (30U*120000000U) / common_hal_mcu_processor_get_frequency()) #endif -void mp_hal_delay_us_loop(uint32_t us) { - for (uint32_t i = us*DELAY_LOOP_ITERATIONS_PER_US; i > 0; i--) { +void mp_hal_delay_us(mp_uint_t delay) { + for (uint32_t i = delay*DELAY_LOOP_ITERATIONS_PER_US; i > 0; i--) { asm volatile("nop"); } } diff --git a/ports/atmel-samd/mphalport.h b/ports/atmel-samd/mphalport.h index 31d34c8c3..3bc824d4e 100644 --- a/ports/atmel-samd/mphalport.h +++ b/ports/atmel-samd/mphalport.h @@ -50,6 +50,4 @@ void mp_hal_set_interrupt_char(int c); void mp_hal_disable_all_interrupts(void); void mp_hal_enable_all_interrupts(void); -void mp_hal_delay_us_loop(uint32_t us); - #endif // MICROPY_INCLUDED_ATMEL_SAMD_MPHALPORT_H diff --git a/ports/esp8266/Makefile b/ports/esp8266/Makefile index 02b75eadd..8fabd3412 100644 --- a/ports/esp8266/Makefile +++ b/ports/esp8266/Makefile @@ -92,7 +92,6 @@ SRC_C = \ machine_hspi.c \ modesp.c \ modnetwork.c \ - mphalport.c \ ets_alt_task.c \ fatfs_port.c \ posix_helpers.c \ diff --git a/ports/nrf/common-hal/microcontroller/__init__.c b/ports/nrf/common-hal/microcontroller/__init__.c index e26acff1b..4399e7708 100644 --- a/ports/nrf/common-hal/microcontroller/__init__.c +++ b/ports/nrf/common-hal/microcontroller/__init__.c @@ -33,6 +33,8 @@ #include "shared-bindings/microcontroller/Processor.h" // TODO porting common_hal_mcu +// This routine should work even when interrupts are disabled. Used by OneWire +// for precise timing. void common_hal_mcu_delay_us(uint32_t delay) { // os_delay_us(delay); } @@ -58,4 +60,3 @@ const mcu_processor_obj_t common_hal_mcu_processor_obj = { .type = &mcu_processor_type, }, }; - diff --git a/ports/nrf/mphalport.c b/ports/nrf/mphalport.c index 014d410ec..d0447f06c 100644 --- a/ports/nrf/mphalport.c +++ b/ports/nrf/mphalport.c @@ -85,17 +85,3 @@ void mp_hal_stdout_tx_strn_cooked(const char *str, mp_uint_t len) { void mp_hal_stdout_tx_str(const char *str) { mp_hal_stdout_tx_strn(str, strlen(str)); } - -// Do a simple timing loop to wait for a certain number of microseconds. -// Can be used when interrupts are disabled, which makes tick_delay() unreliable. -// -// Testing done at 48 MHz on SAMD21 and 120 MHz on SAMD51 (cache on). -// TODO: Test on NRF. For now, use SAMD51 calibration, even though nRF52 runs slower. -// Fraction should compensate. -#define DELAY_LOOP_ITERATIONS_PER_US ( (30U*120000000U) / common_hal_mcu_processor_get_frequency()) - -void mp_hal_delay_us_loop(uint32_t us) { - for (uint32_t i = us*DELAY_LOOP_ITERATIONS_PER_US; i > 0; i--) { - asm volatile("nop"); - } -} diff --git a/ports/nrf/mphalport.h b/ports/nrf/mphalport.h index 79e1d2d58..a87247737 100644 --- a/ports/nrf/mphalport.h +++ b/ports/nrf/mphalport.h @@ -52,7 +52,6 @@ static inline uint32_t hal_tick_fake(void) { extern const unsigned char mp_hal_status_to_errno_table[4]; - NORETURN void mp_hal_raise(HAL_StatusTypeDef status); void mp_hal_set_interrupt_char(int c); // -1 to disable @@ -70,7 +69,6 @@ bool mp_hal_stdin_any(void); #define mp_hal_pin_od_high(p) mp_hal_pin_high(p) #define mp_hal_pin_open_drain(p) hal_gpio_cfg_pin(p->port, p->pin, HAL_GPIO_MODE_INPUT, HAL_GPIO_PULL_DISABLED) -void mp_hal_delay_us_loop(uint32_t us); // TODO: empty implementation for now. Used by machine_spi.c:69 #define mp_hal_delay_us_fast(p) |
