I am writing my own header file for STM32F4. I want to access registers like this: GPIOB_device.GPIOB_MODER.B.MODER0
for bits and GPIOB_device.GPIOB_MODER.R
for whole register.
struct GPIOB_tag {
union {
uint32_t R:32; // 0x40020400 (32 bit)
struct {
uint32_t MODER15:2;
uint32_t MODER14:2;
uint32_t MODER13:2;
uint32_t MODER12:2;
uint32_t MODER11:2;
uint32_t MODER10:2;
uint32_t MODER9:2;
uint32_t MODER8:2;
uint32_t MODER7:2;
uint32_t MODER6:2;
uint32_t MODER5:2;
uint32_t MODER4:2;
uint32_t MODER3:2;
uint32_t MODER2:2;
uint32_t MODER1:2;
uint32_t MODER0:2;
} B;
} GPIOB_MODER;
};
#define GPIOB_device (*(volatile struct GPIOB_tag *)0x40020400)
STM32F4 manual states that MODER0 has offset 0, MODER1 has offset 2, MODER2 has offset 4 etc. like in the picture below:
If I try the following code:
GPIOB_device.GPIOB_MODER.R = 0xFFFF0000;
32 bits at address 0x40020400 look like this:
00000000 00000000 11111111 11111111
Why does that happen? Why are the bytes inverted?
Furthermore, if I try:
GPIOB_device.GPIOB_MODER.B.MODER0 = 0b10;
the register looks like this:
00000000 00000000 11111111 10111111
but it should look like this:
10000000 00000000 11111111 11111111
What am I doing wrong?