diff options
author | Damien George <damien.p.george@gmail.com> | 2014-04-18 22:38:09 +0100 |
---|---|---|
committer | Damien George <damien.p.george@gmail.com> | 2014-04-18 22:38:09 +0100 |
commit | c66d86c5ce068e860ceb550ad75bf4da5211276b (patch) | |
tree | 2292f0d3cba5886550a7d989aae926664319ae62 /stmhal/modstm.c | |
parent | 738bdeb73a6ef802ed0c39fb88a733a1ad04d9a1 (diff) | |
download | micropython-c66d86c5ce068e860ceb550ad75bf4da5211276b.tar.gz micropython-c66d86c5ce068e860ceb550ad75bf4da5211276b.zip |
stmhal: Big cleanup; merge gpio into Pin; make names consistent.
This is an attempt to clean up the Micro Python API on the pyboard.
Gpio functionality is now in the Pin object, which seems more natural.
Constants for MODE and PULL are now in pyb.Pin. Names of some
classes have been adjusted to conform to CamelCase. Other
miscellaneous changes and clean up here and there.
Diffstat (limited to 'stmhal/modstm.c')
-rw-r--r-- | stmhal/modstm.c | 106 |
1 files changed, 55 insertions, 51 deletions
diff --git a/stmhal/modstm.c b/stmhal/modstm.c index 5e72a75bb2..9134063428 100644 --- a/stmhal/modstm.c +++ b/stmhal/modstm.c @@ -1,7 +1,7 @@ #include <stdio.h> #include <stdint.h> -#include <stm32f4xx_hal.h> +#include "stm32f4xx_hal.h" #include "nlr.h" #include "misc.h" @@ -10,11 +10,17 @@ #include "obj.h" #include "modstm.h" +// To use compile-time constants we are restricted to 31-bit numbers (a small int, +// so it fits in a Micro Python object pointer). Thus, when extracting a constant +// from an object, we must clear the MSB. + STATIC uint32_t get_read_addr(mp_obj_t addr_o, uint align) { uint32_t addr = mp_obj_get_int(addr_o) & 0x7fffffff; + /* if (addr < 0x10000000) { nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_ValueError, "cannot read from address %08x", addr)); } + */ if ((addr & (align - 1)) != 0) { nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_ValueError, "address %08x is not aligned to %d bytes", addr, align)); } @@ -24,6 +30,8 @@ STATIC uint32_t get_read_addr(mp_obj_t addr_o, uint align) { STATIC uint32_t get_write_addr(mp_obj_t addr_o, uint align) { uint32_t addr = mp_obj_get_int(addr_o) & 0x7fffffff; if (addr < 0x10000000) { + // Everything below 0x10000000 is either ROM or aliased to something higher, so we don't + // lose anything by restricting writes to this area, and we gain some safety. nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_ValueError, "cannot write to address %08x", addr)); } if ((addr & (align - 1)) != 0) { @@ -32,66 +40,62 @@ STATIC uint32_t get_write_addr(mp_obj_t addr_o, uint align) { return addr; } -STATIC mp_obj_t stm_read8(mp_obj_t addr) { - uint32_t a = get_read_addr(addr, 1); - uint32_t v = *(uint8_t*)a; - return mp_obj_new_int(v); -} - -STATIC MP_DEFINE_CONST_FUN_OBJ_1(stm_read8_obj, stm_read8); - -STATIC mp_obj_t stm_read16(mp_obj_t addr) { - uint32_t a = get_read_addr(addr, 2); - uint32_t v = *(uint16_t*)a; - return mp_obj_new_int(v); -} - -STATIC MP_DEFINE_CONST_FUN_OBJ_1(stm_read16_obj, stm_read16); - -STATIC mp_obj_t stm_read32(mp_obj_t addr) { - uint32_t a = get_read_addr(addr, 4); - uint32_t v = *(uint32_t*)a; - return mp_obj_new_int(v); -} - -STATIC MP_DEFINE_CONST_FUN_OBJ_1(stm_read32_obj, stm_read32); +typedef struct _stm_mem_obj_t { + mp_obj_base_t base; + uint32_t elem_size; // in bytes +} stm_mem_obj_t; -STATIC mp_obj_t stm_write8(mp_obj_t addr, mp_obj_t val) { - uint32_t a = get_write_addr(addr, 1); - uint32_t v = mp_obj_get_int(val); - *(uint8_t*)a = v; - return mp_const_none; +STATIC void stm_mem_print(void (*print)(void *env, const char *fmt, ...), void *env, mp_obj_t self_in, mp_print_kind_t kind) { + stm_mem_obj_t *self = self_in; + print(env, "<%u-bit memory>", 8 * self->elem_size); } -STATIC MP_DEFINE_CONST_FUN_OBJ_2(stm_write8_obj, stm_write8); - -STATIC mp_obj_t stm_write16(mp_obj_t addr, mp_obj_t val) { - uint32_t a = get_write_addr(addr, 2); - uint32_t v = mp_obj_get_int(val); - *(uint16_t*)a = v; - return mp_const_none; +STATIC mp_obj_t stm_mem_subscr(mp_obj_t self_in, mp_obj_t index, mp_obj_t value) { + // TODO support slice index to read/write multiple values at once + stm_mem_obj_t *self = self_in; + if (value == MP_OBJ_NULL) { + // delete + return MP_OBJ_NOT_SUPPORTED; + } else if (value == MP_OBJ_SENTINEL) { + // load + uint32_t addr = get_read_addr(index, self->elem_size); + uint32_t val; + switch (self->elem_size) { + case 1: val = (*(uint8_t*)addr); break; + case 2: val = (*(uint16_t*)addr); break; + default: val = (*(uint32_t*)addr); break; + } + return mp_obj_new_int(val); + } else { + // store + uint32_t addr = get_write_addr(index, self->elem_size); + uint32_t val = mp_obj_get_int(value); + switch (self->elem_size) { + case 1: (*(uint8_t*)addr) = val; break; + case 2: (*(uint16_t*)addr) = val; break; + default: (*(uint32_t*)addr) = val; break; + } + return mp_const_none; + } } -STATIC MP_DEFINE_CONST_FUN_OBJ_2(stm_write16_obj, stm_write16); - -STATIC mp_obj_t stm_write32(mp_obj_t addr, mp_obj_t val) { - uint32_t a = get_write_addr(addr, 4); - uint32_t v = mp_obj_get_int(val); - *(uint32_t*)a = v; - return mp_const_none; -} +STATIC const mp_obj_type_t stm_mem_type = { + { &mp_type_type }, + .name = MP_QSTR_mem, + .print = stm_mem_print, + .subscr = stm_mem_subscr, +}; -STATIC MP_DEFINE_CONST_FUN_OBJ_2(stm_write32_obj, stm_write32); +STATIC const stm_mem_obj_t stm_mem8_obj = {{&stm_mem_type}, 1}; +STATIC const stm_mem_obj_t stm_mem16_obj = {{&stm_mem_type}, 2}; +STATIC const stm_mem_obj_t stm_mem32_obj = {{&stm_mem_type}, 4}; STATIC const mp_map_elem_t stm_module_globals_table[] = { { MP_OBJ_NEW_QSTR(MP_QSTR___name__), MP_OBJ_NEW_QSTR(MP_QSTR_stm) }, - { MP_OBJ_NEW_QSTR(MP_QSTR_read8), (mp_obj_t)&stm_read8_obj }, - { MP_OBJ_NEW_QSTR(MP_QSTR_read16), (mp_obj_t)&stm_read16_obj }, - { MP_OBJ_NEW_QSTR(MP_QSTR_read32), (mp_obj_t)&stm_read32_obj }, - { MP_OBJ_NEW_QSTR(MP_QSTR_write8), (mp_obj_t)&stm_write8_obj }, - { MP_OBJ_NEW_QSTR(MP_QSTR_write16), (mp_obj_t)&stm_write16_obj }, - { MP_OBJ_NEW_QSTR(MP_QSTR_write32), (mp_obj_t)&stm_write32_obj }, + { MP_OBJ_NEW_QSTR(MP_QSTR_mem8), (mp_obj_t)&stm_mem8_obj }, + { MP_OBJ_NEW_QSTR(MP_QSTR_mem16), (mp_obj_t)&stm_mem16_obj }, + { MP_OBJ_NEW_QSTR(MP_QSTR_mem32), (mp_obj_t)&stm_mem32_obj }, { MP_OBJ_NEW_QSTR(MP_QSTR_GPIOA), MP_OBJ_NEW_SMALL_INT(GPIOA_BASE) }, { MP_OBJ_NEW_QSTR(MP_QSTR_GPIOB), MP_OBJ_NEW_SMALL_INT(GPIOB_BASE) }, |