我正在遵循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);
但是,如果我看到使用调试器,则flags中的位1始终为0。首先假定标志为0。因此,flags中的所有位都将为0.但是,当我使用varSetBit(flags,1)时,位1的答案再次为0。我不认为我做错了什么。这是编译器问题吗?我错过了一些设置吗?任何帮助将不胜感激。
答案 0 :(得分:2)
我怀疑你误解了比特带功能的目的
通过位带,应用程序可以逐位访问(读/写)微控制器的寄存器。这允许使用单个存储指令而不是读取/修改/写入序列来修改位。为此,stm32
设备(或更常见的Cortex M3
设备)具有特定的地址空间,其中每个寄存器的每个位都映射到特定地址。
我们举个例子,如果你需要设置寄存器{3}的第3位:
如果没有位带,则必须编写以下代码:
FOO
这是由寄存器FOO = FOO | 0b100;
的加载中的汇编指令,逐位FOO
操作和寄存器OR
的存储产生的。
使用位带,您可以写:
FOO
导致预处理器从varSetBit(FOO, 3);
宏计算的地址处的简单存储。
现在可以说,位带仅适用于微控制器的寄存器。您不能像使用varSetBit
变量那样使用它们来操纵自己变量的位。
有关详细信息,请阅读ARM application note