gpt4 book ai didi

c++ - 皮质 m3,stm32L1XX 位带

转载 作者:太空狗 更新时间:2023-10-29 21:45:57 26 4
gpt4 key购买 nike

我正在按照 micromouseonline 上提供的指南进行操作。 com/2010/07/14/stm32 中的位带。我正在使用 IAR EWARMCortex M3。一切正常,但我无法在给定地址中设置这些位。我正在使用 STM32L151xDIAR 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。我不认为我做错了什么。是编译器问题吗?我缺少一些设置吗?任何帮助将不胜感激。

最佳答案

我怀疑您误解了位带功能的用途。
通过位带,应用程序可以逐位访问(读/写)微 Controller 的寄存器。这允许使用单个存储指令而不是读取/修改/写入序列来修改位。为此,stm32 设备(或更一般的 Cortex M3 设备)有一个特定的地址空间,其中每个寄存器的每一位都映射到一个特定的地址。

举个例子,如果你需要设置寄存器FOO的第3位:

  • 如果没有位带,您将不得不编写以下代码:

    FOO = FOO | 0b100;

这是由汇编器指令在寄存器 FOO 的加载、按位 OR 操作和寄存器 FOO 的存储中产生的>.

  • 使用位带,您可以编写:

    varSetBit(FOO, 3);

这导致在预处理器根据 varSetBit 宏计算的地址处进行简单存储。

也就是说,bit-banding 仅适用于微 Controller 的寄存器。您不能像使用 flags 变量那样使用它们来操作您自己的变量的位。

有关更多信息,请阅读 ARM application note

关于c++ - 皮质 m3,stm32L1XX 位带,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16419210/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com