summaryrefslogtreecommitdiff
path: root/ports/stm/common-hal
diff options
context:
space:
mode:
authorScott Shawcroft <scott@tannewt.org>2020-03-20 12:58:34 -0700
committerScott Shawcroft <scott@tannewt.org>2020-03-20 12:58:34 -0700
commit2623022c846698d8a6b9cfab8617aa569c5aef2f (patch)
tree1caf31eda829fb1c8c22b91650642919598ff9bf /ports/stm/common-hal
parent6db11cf68ba2d5e17c6267f36f516bc0abce4643 (diff)
Initial work for STM32. Need to fix us delay and PulseIn still.
Diffstat (limited to 'ports/stm/common-hal')
-rw-r--r--ports/stm/common-hal/busio/UART.c1
-rw-r--r--ports/stm/common-hal/displayio/ParallelBus.c2
-rw-r--r--ports/stm/common-hal/microcontroller/__init__.c24
-rw-r--r--ports/stm/common-hal/neopixel_write/__init__.c25
-rw-r--r--ports/stm/common-hal/pulseio/PulseIn.c10
-rw-r--r--ports/stm/common-hal/pulseio/PulseOut.c5
6 files changed, 16 insertions, 51 deletions
diff --git a/ports/stm/common-hal/busio/UART.c b/ports/stm/common-hal/busio/UART.c
index 0b434fd02..e32fa5635 100644
--- a/ports/stm/common-hal/busio/UART.c
+++ b/ports/stm/common-hal/busio/UART.c
@@ -35,7 +35,6 @@
#include "py/stream.h"
#include "supervisor/shared/translate.h"
-#include "tick.h"
#include "stm32f4xx_hal.h"
#define ALL_UARTS 0xFFFF
diff --git a/ports/stm/common-hal/displayio/ParallelBus.c b/ports/stm/common-hal/displayio/ParallelBus.c
index 1b808ec02..314b72ff7 100644
--- a/ports/stm/common-hal/displayio/ParallelBus.c
+++ b/ports/stm/common-hal/displayio/ParallelBus.c
@@ -33,8 +33,6 @@
#include "shared-bindings/digitalio/DigitalInOut.h"
#include "shared-bindings/microcontroller/__init__.h"
-#include "tick.h"
-
void common_hal_displayio_parallelbus_construct(displayio_parallelbus_obj_t* self,
const mcu_pin_obj_t* data0, const mcu_pin_obj_t* command, const mcu_pin_obj_t* chip_select,
const mcu_pin_obj_t* write, const mcu_pin_obj_t* read, const mcu_pin_obj_t* reset) {
diff --git a/ports/stm/common-hal/microcontroller/__init__.c b/ports/stm/common-hal/microcontroller/__init__.c
index 0c680eb05..b20f49e59 100644
--- a/ports/stm/common-hal/microcontroller/__init__.c
+++ b/ports/stm/common-hal/microcontroller/__init__.c
@@ -41,31 +41,9 @@
#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 = supervisor_ticks_ms32();
- sys_cycles = SysTick->VAL; //counts backwards
- } while (micros != supervisor_ticks_ms32()); //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) {
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;) {
- }
}
}
@@ -171,7 +149,7 @@ STATIC const mp_rom_map_elem_t mcu_pin_globals_table[] = {
{ MP_ROM_QSTR(MP_QSTR_PB10), MP_ROM_PTR(&pin_PB10) },
#if MCU_PACKAGE == 144 || defined STM32F405xx
{ MP_ROM_QSTR(MP_QSTR_PB11), MP_ROM_PTR(&pin_PB11) },
-#endif
+#endif
{ MP_ROM_QSTR(MP_QSTR_PB12), MP_ROM_PTR(&pin_PB12) },
{ MP_ROM_QSTR(MP_QSTR_PB13), MP_ROM_PTR(&pin_PB13) },
{ MP_ROM_QSTR(MP_QSTR_PB14), MP_ROM_PTR(&pin_PB14) },
diff --git a/ports/stm/common-hal/neopixel_write/__init__.c b/ports/stm/common-hal/neopixel_write/__init__.c
index 6740a0d34..c8852403b 100644
--- a/ports/stm/common-hal/neopixel_write/__init__.c
+++ b/ports/stm/common-hal/neopixel_write/__init__.c
@@ -24,18 +24,17 @@
* THE SOFTWARE.
*/
-#include "py/mphal.h"
#include "shared-bindings/neopixel_write/__init__.h"
-#include "tick.h"
#include "py/mperrno.h"
+#include "py/mphal.h"
#include "py/runtime.h"
#include "common-hal/microcontroller/Pin.h"
#include "stm32f4xx_hal.h"
#include "stm32f4xx_ll_gpio.h"
+#include "supervisor/port.h"
-uint64_t next_start_tick_ms = 0;
-uint32_t next_start_tick_us = 1000;
+uint64_t next_start_raw_ticks = 0;
//sysclock divisors
#define MAGIC_800_INT 900000 // ~1.11 us -> 1.2 field
@@ -45,7 +44,7 @@ uint32_t next_start_tick_us = 1000;
#pragma GCC push_options
#pragma GCC optimize ("Os")
-void common_hal_neopixel_write (const digitalio_digitalinout_obj_t* digitalinout, uint8_t *pixels,
+void common_hal_neopixel_write (const digitalio_digitalinout_obj_t* digitalinout, uint8_t *pixels,
uint32_t numBytes) {
uint8_t *p = pixels, *end = p + numBytes, pix = *p++, mask = 0x80;
uint32_t start = 0;
@@ -59,9 +58,9 @@ void common_hal_neopixel_write (const digitalio_digitalinout_obj_t* digitalinout
uint32_t t0 = (sys_freq/MAGIC_800_T0H);
uint32_t t1 = (sys_freq/MAGIC_800_T1H);
- // This must be called while interrupts are on in case we're waiting for a
- // future ms tick.
- wait_until(next_start_tick_ms, next_start_tick_us);
+ // Wait to make sure we don't append onto the last transmission. This should only be a tick or
+ // two.
+ while (port_get_raw_ticks(NULL) < next_start_raw_ticks) {}
GPIO_TypeDef * p_port = pin_port(digitalinout->pin->port);
uint32_t p_mask = pin_mask(digitalinout->pin->number);
@@ -90,13 +89,7 @@ void common_hal_neopixel_write (const digitalio_digitalinout_obj_t* digitalinout
__enable_irq();
// Update the next start.
- current_tick(&next_start_tick_ms, &next_start_tick_us);
- if (next_start_tick_us < 100) {
- next_start_tick_ms += 1;
- next_start_tick_us = 100 - next_start_tick_us;
- } else {
- next_start_tick_us -= 100;
- }
+ next_start_raw_ticks = port_get_raw_ticks(NULL) + 4;
}
-#pragma GCC pop_options \ No newline at end of file
+#pragma GCC pop_options
diff --git a/ports/stm/common-hal/pulseio/PulseIn.c b/ports/stm/common-hal/pulseio/PulseIn.c
index 8428a2278..371ac42ed 100644
--- a/ports/stm/common-hal/pulseio/PulseIn.c
+++ b/ports/stm/common-hal/pulseio/PulseIn.c
@@ -32,7 +32,6 @@
#include "py/runtime.h"
#include "shared-bindings/microcontroller/__init__.h"
#include "shared-bindings/pulseio/PulseIn.h"
-#include "tick.h"
#include "stm32f4xx_hal.h"
@@ -47,9 +46,8 @@ static void pulsein_handler(uint8_t num) {
EXTI->PR = 1 << num;
// Grab the current time first.
- uint32_t current_us;
- uint64_t current_ms;
- current_tick(&current_ms, &current_us);
+ uint32_t current_us = 0;
+ uint64_t current_ms = 0;
// current_tick gives us the remaining us until the next tick but we want the number since the last ms.
current_us = 1000 - current_us;
@@ -116,10 +114,10 @@ void common_hal_pulseio_pulsein_construct(pulseio_pulsein_obj_t* self, const mcu
// Allocate pulse buffer
self->buffer = (uint16_t *) m_malloc(maxlen * sizeof(uint16_t), false);
if (self->buffer == NULL) {
- mp_raise_msg_varg(&mp_type_MemoryError, translate("Failed to allocate RX buffer of %d bytes"),
+ mp_raise_msg_varg(&mp_type_MemoryError, translate("Failed to allocate RX buffer of %d bytes"),
maxlen * sizeof(uint16_t));
}
-
+
// Set internal variables
self->pin = pin;
self->maxlen = maxlen;
diff --git a/ports/stm/common-hal/pulseio/PulseOut.c b/ports/stm/common-hal/pulseio/PulseOut.c
index d82525ea1..137ddaf9d 100644
--- a/ports/stm/common-hal/pulseio/PulseOut.c
+++ b/ports/stm/common-hal/pulseio/PulseOut.c
@@ -37,7 +37,6 @@
#include "stm32f4xx_hal.h"
#include "common-hal/microcontroller/Pin.h"
-#include "tick.h"
// A single timer is shared amongst all PulseOut objects under the assumption that
// the code is single threaded.
@@ -60,7 +59,7 @@ STATIC void turn_off(pulseio_pulseout_obj_t *pulseout) {
// Turn off PWM
HAL_TIM_PWM_Stop(&(pulseout->pwmout->handle), pulseout->pwmout->channel);
// Make sure pin is low.
- HAL_GPIO_WritePin(pin_port(pulseout->pwmout->tim->pin->port),
+ HAL_GPIO_WritePin(pin_port(pulseout->pwmout->tim->pin->port),
pin_mask(pulseout->pwmout->tim->pin->number), 0);
}
@@ -196,7 +195,7 @@ void common_hal_pulseio_pulseout_send(pulseio_pulseout_obj_t* self, uint16_t* pu
// mp_raise_RuntimeError(translate("Error: Send Timeout"));
// }
}
- //turn off timer counter.
+ //turn off timer counter.
t7_handle.Instance->CR1 &= ~TIM_CR1_CEN;
}