cortex m3, stm32L1XX битовая полоса

Я следую руководству, данному на 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. Я не думаю, что я делаю что-то не так. Это проблема компилятора? мне не хватает некоторых настроек? Любая помощь будет оценена.

3

Решение

Я подозреваю, что вы неправильно понимаете назначение функции битовой полосы.
Благодаря битовой полосе приложение получает доступ (чтение / запись) к регистрам микроконтроллера побитно. Это позволяет модифицировать бит с помощью одной инструкции сохранения вместо последовательности чтения / изменения / записи. Чтобы это работало, stm32 устройства (или в более общем плане Cortex M3 устройства) имеют конкретное адресное пространство, в котором каждый бит каждого регистра отображается на определенный адрес.

Давайте рассмотрим пример, если вам нужно установить бит 3 регистра FOO:

  • Без бит-полос вам нужно написать следующий код:

    FOO = FOO | 0b100;

Это вытекает из инструкций ассемблера в загрузке реестра FOOнемного мудрый OR работа и хранение реестра FOO,

  • С бит-бэндингом вы пишете:

    varSetBit(FOO, 3);

что приводит к простому хранилищу по адресу, вычисленному препроцессором из varSetBit макро.

Теперь все сказано, что полоса битов применяется только к регистру микроконтроллера. Вы не можете использовать их для манипулирования битами ваших собственных переменных, как вы делаете с вашим flags переменная.

Для получения дополнительной информации читайте Замечание по применению ARM

2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector