How about a C++-ish way?
namespace GPIO {
static volatile uint32_t &MAP0_MODER = *reinterpret_cast<uint32_t*>(0x4000);
static volatile uint32_t &MAP0_OTYPER = *reinterpret_cast<uint32_t*>(0x4004);
}
int main() {
GPIO::MAP0_MODER = 42;
}
You get autocompletion because of the GPIO
namespace, and there is no need for dummy padding. Even, it is more clear what’s going on, as you can see the address of each register, you don’t have to rely on the compiler’s padding behavior at all.