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条回答
cat3902982
1楼-- · 2019-03-24 21:24
等待高手!
biansf2001
2楼-- · 2019-03-25 01:50
 精彩回答 2  元偷偷看……
Study_Stellaris
3楼-- · 2019-03-25 03:08
位带区说的是对 MCU 内部集成的外设来操作的,对 MCU 没有集成的,应该是按照通常的操作来进行。
biansf2001
4楼-- · 2019-03-25 09:01
仔细看看手册,外设和SRAM在影射到了未带
历史的天空
5楼-- · 2019-03-25 14:03
 精彩回答 2  元偷偷看……
academic
6楼-- · 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))

一周热门 更多>

相关问题

    相关文章