Skip to content

Commit 3048433

Browse files
dhylandsdpgeorge
authored andcommitted
stmhal: Make stm.mem* support large integers.
With these you can now do things like: stm.mem32[0x20000000] = 0x80000000 and read 32-bit values. You can also read all the way to the end of memory using either stm.mem32[0xfffffffc] or stm.mem32[-4]. IRQs shouldn't use mem32 at all since they'd fail if the top 2 bits weren't equal, so IRQs should be using 16-bit I/O.
1 parent 61e85a8 commit 3048433

1 file changed

Lines changed: 10 additions & 4 deletions

File tree

stmhal/modstm.c

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,10 @@
3838
// from an object, we must clear the MSB.
3939

4040
STATIC uint32_t get_read_addr(mp_obj_t addr_o, uint align) {
41-
uint32_t addr = mp_obj_get_int(addr_o) & 0x7fffffff;
41+
uint32_t addr = mp_obj_get_int_truncated(addr_o);
42+
if (MP_OBJ_IS_SMALL_INT(addr_o)) {
43+
addr &= 0x7fffffff;
44+
}
4245
/*
4346
if (addr < 0x10000000) {
4447
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_ValueError, "cannot read from address %08x", addr));
@@ -51,7 +54,10 @@ STATIC uint32_t get_read_addr(mp_obj_t addr_o, uint align) {
5154
}
5255

5356
STATIC uint32_t get_write_addr(mp_obj_t addr_o, uint align) {
54-
uint32_t addr = mp_obj_get_int(addr_o) & 0x7fffffff;
57+
uint32_t addr = mp_obj_get_int_truncated(addr_o);
58+
if (MP_OBJ_IS_SMALL_INT(addr_o)) {
59+
addr &= 0x7fffffff;
60+
}
5561
if (addr < 0x10000000) {
5662
// Everything below 0x10000000 is either ROM or aliased to something higher, so we don't
5763
// lose anything by restricting writes to this area, and we gain some safety.
@@ -88,11 +94,11 @@ STATIC mp_obj_t stm_mem_subscr(mp_obj_t self_in, mp_obj_t index, mp_obj_t value)
8894
case 2: val = (*(uint16_t*)addr); break;
8995
default: val = (*(uint32_t*)addr); break;
9096
}
91-
return mp_obj_new_int(val);
97+
return mp_obj_new_int_from_uint(val);
9298
} else {
9399
// store
94100
uint32_t addr = get_write_addr(index, self->elem_size);
95-
uint32_t val = mp_obj_get_int(value);
101+
uint32_t val = mp_obj_get_int_truncated(value);
96102
switch (self->elem_size) {
97103
case 1: (*(uint8_t*)addr) = val; break;
98104
case 2: (*(uint16_t*)addr) = val; break;

0 commit comments

Comments
 (0)