看到这个网址上
http://bbs.eeworld.com.cn/thread-250113-1-1.html 上发的关于cortex-M3 位带特性的帖子,有几个问题想请教大家。
我现在想在LM3S8962 上使用 I2C 外扩IO,我在控制IO的时候需要发送一个字节来控制对应的8路IO,如果我只想单独控制其中一路IO,那么我就只需要改变其中1位,也就是说我原来想控制一个字节中单独1位,是像你帖子所说的那样,用与,异或等方式来实现,而且很容易误操作,如果用位带特性来操作的话应该很简单。
我的问题是:
如何定义一个属于位带特性的字节变量?又如何实在对应内存区,对其操作?
有没有这样的例程能参照一下?
此帖出自
小平头技术问答
楼主是想自己定义变量,当然是定义在 SRAM 区。
对于 Cortex-M3 内核,虽然为 SRAM 去分配 512MB,但有 1MB 是有位带别名区的。
而目前 MCU 的 SRAM 都是小于 1MB 的。
所以将变量定义为 volatile ,让后用下面对应的 macros 来操作就可以完成对一个变量的位操作。
//*****************************************************************************
//
// Macros for hardware access, both direct and via the bit-band region.
//
//*****************************************************************************
#define HWREG(x)
(*((volatile unsigned long *)(x)))
#define HWREGH(x)
(*((volatile unsigned short *)(x)))
#define HWREGB(x)
(*((volatile unsigned char *)(x)))
#define HWREGBITW(x, b)
HWREG(((unsigned long)(x) & 0xF0000000) | 0x02000000 |
(((unsigned long)(x) & 0x000FFFFF) << 5) | ((b) << 2))
#define HWREGBITH(x, b)
HWREGH(((unsigned long)(x) & 0xF0000000) | 0x02000000 |
(((unsigned long)(x) & 0x000FFFFF) << 5) | ((b) << 2))
#define HWREGBITB(x, b)
HWREGB(((unsigned long)(x) & 0xF0000000) | 0x02000000 |
(((unsigned long)(x) & 0x000FFFFF) << 5) | ((b) << 2))
一周热门 更多>