Я следую руководству, данному на micromouseonline. com / 2010/07/14 / bit-banding-in-the-stm32. я использую IAR EWARM
а также Cortex M3
, Все работает нормально, но я не могу установить биты по указанному адресу. Я использую STM32L151xD
а также IAR EWARM
компилятор.
Вот как они определяют функции
#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 (flags, 1), ответ на бит 1 снова равен 0. Я не думаю, что я делаю что-то не так. Это проблема компилятора? мне не хватает некоторых настроек? Любая помощь будет оценена.
Я подозреваю, что вы неправильно понимаете назначение функции битовой полосы.
Благодаря битовой полосе приложение получает доступ (чтение / запись) к регистрам микроконтроллера побитно. Это позволяет модифицировать бит с помощью одной инструкции сохранения вместо последовательности чтения / изменения / записи. Чтобы это работало, stm32
устройства (или в более общем плане Cortex M3
устройства) имеют конкретное адресное пространство, в котором каждый бит каждого регистра отображается на определенный адрес.
Давайте рассмотрим пример, если вам нужно установить бит 3 регистра FOO
:
Без бит-полос вам нужно написать следующий код:
FOO = FOO | 0b100;
Это вытекает из инструкций ассемблера в загрузке реестра FOO
немного мудрый OR
работа и хранение реестра FOO
,
С бит-бэндингом вы пишете:
varSetBit(FOO, 3);
что приводит к простому хранилищу по адресу, вычисленному препроцессором из varSetBit
макро.
Теперь все сказано, что полоса битов применяется только к регистру микроконтроллера. Вы не можете использовать их для манипулирования битами ваших собственных переменных, как вы делаете с вашим flags
переменная.
Для получения дополнительной информации читайте Замечание по применению ARM
Других решений пока нет …