cortex-M3 位带特性用法

2019-03-24 15:35发布

看到这个网址上http://bbs.eeworld.com.cn/thread-250113-1-1.html 上发的关于cortex-M3 位带特性的帖子,有几个问题想请教大家。       我现在想在LM3S8962 上使用 I2C 外扩IO,我在控制IO的时候需要发送一个字节来控制对应的8路IO,如果我只想单独控制其中一路IO,那么我就只需要改变其中1位,也就是说我原来想控制一个字节中单独1位,是像你帖子所说的那样,用与,异或等方式来实现,而且很容易误操作,如果用位带特性来操作的话应该很简单。        我的问题是:如何定义一个属于位带特性的字节变量?又如何实在对应内存区,对其操作?                             有没有这样的例程能参照一下? 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
7条回答
academic
2019-03-25 19:20
是的,对于 Peripheral 来说是可以位带操作的。但对这些操作,通常是有 API 函数来完成的。
楼主是想自己定义变量,当然是定义在 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))

一周热门 更多>

相关问题

    相关文章