Bitfields can use byte acces, which the bus doesn't permit. When that happens, the bus adds extra bytes to form a word, modifying fields that shouldn't be. Bitfields can be kept for debug and read, but writes must be done though masks
16 lines
555 B
C
16 lines
555 B
C
|
|
#define reg_def(pos, size) pos, (((0x1 << size) - 1) << pos)
|
|
|
|
#define reg_set(reg, field) _reg_set(reg, field)
|
|
#define _reg_set(reg, pos, mask) do { reg.word |= mask; } while (false)
|
|
|
|
#define reg_reset(reg, field) _reg_reset(reg, field)
|
|
#define _reg_reset(reg, pos, mask) do { reg.word &= ~mask; } while (false)
|
|
|
|
#define reg_write(reg, field, value) _reg_write(reg, field, value)
|
|
#define _reg_write(reg, pos, mask, value) \
|
|
do { \
|
|
reg.word |= value << pos; \
|
|
} while (false) \
|
|
|