2013-05-07 3 views
3

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

ответ

2

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

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

  • Без битовых обвязок, вы должны написать следующий код:

    FOO = FOO | 0b100;

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

  • С битовом обвязки, вы пишете:

    varSetBit(FOO, 3);

что приводит к простому магазину по адресу, рассчитанному препроцессором из varSetBit макросъемки.

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

Для получения более подробной информации читайте ARM application note

+1

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

 Смежные вопросы

  • Нет связанных вопросов^_^