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 в flags всегда равен 0, если я вижу использование отладчика. Сначала предполагается, что флаги равны 0. Итак, все биты во флагах будут равны 0. Однако, когда я использую varSetBit(flags,1), ответ в бите 1 снова равен 0. Я не думаю, что я делаю что-то неправильно. Это проблема компилятора? я пропустил некоторые настройки? Любая помощь будет оценена.


person Abhishek Thakur    schedule 07.05.2013    source источник


Ответы (1)


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

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

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

    FOO = FOO | 0b100;

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

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

    varSetBit(FOO, 3);

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

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

Дополнительные сведения см. в примечаниях по применению ARM.

person greydet    schedule 07.05.2013
comment
Это верно; вы, конечно, можете написать свой собственный макрос, чтобы установить один бит в определяемой пользователем переменной, но это все равно будет операция чтения-изменения-записи, и макрос просто упрощает просмотр того, что происходит. - person Vicky; 07.05.2013