Я следую руководству, приведенному на micromouseonline. com/2010/07/14/бит-banding-in-the-stm32. Я использую IAR EWARM
и Cortex M3
. Все работает нормально, но я не могу установить бит в заданном адресе. Im используя STM32L151xD
и IAR EWARM
компилятор.cortex m3, stm32L1XX бит-диапазон
Это, как они определяют функции
#define RAM_BASE 0x20000000
#define RAM_BB_BASE 0x22000000
#define Var_ResetBit_BB(VarAddr, BitNumber) (*(vu32 *) (RAM_BB_BASE | ((VarAddr - RAM_BASE) << 5) | ((BitNumber) << 2)) = 0)
#define Var_SetBit_BB(VarAddr, BitNumber) (*(vu32 *) (RAM_BB_BASE | ((VarAddr - RAM_BASE) << 5) | ((BitNumber) << 2)) = 1)
#define Var_GetBit_BB(VarAddr, BitNumber) (*(vu32 *) (RAM_BB_BASE | ((VarAddr - RAM_BASE) << 5) | ((BitNumber) << 2)))
#define varSetBit(var,bit) (Var_SetBit_BB((u32)&var,bit))
#define varGetBit(var,bit) (Var_GetBit_BB((u32)&var,bit))
вызова является:
uint32_t flags;
varSetBit(flags,1);
однако, бит 1 в флажках всегда 0, если я вижу, с помощью отладчика. Сначала предполагается, что флаги будут 0. Итак, все биты в флагах равны 0. Однако, когда я использую varSetBit (флаги, 1), ответ в бит 1 снова равен 0. Я не думаю, что я что-то делаю неправильно. Это проблема компилятора? мне не хватает некоторых настроек? Любая помощь будет оценена.
Это верно; вы можете, конечно, написать свой собственный макрос, чтобы установить один бит в пользовательской переменной, но он все равно будет выполнять операцию чтения-изменения-записи, а макрос просто упрощает просмотр происходящего. – Vicky