5294|7

105

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

cortex-M3 位带特性用法 [复制链接]

看到这个网址上https://bbs.eeworld.com.cn/thread-250113-1-1.html 上发的关于cortex-M3 位带特性的帖子,有几个问题想请教大家。
      我现在想在LM3S8962 上使用 I2C 外扩IO,我在控制IO的时候需要发送一个字节来控制对应的8路IO,如果我只想单独控制其中一路IO,那么我就只需要改变其中1位,也就是说我原来想控制一个字节中单独1位,是像你帖子所说的那样,用与,异或等方式来实现,而且很容易误操作,如果用位带特性来操作的话应该很简单。
       我的问题是:如何定义一个属于位带特性的字节变量?又如何实在对应内存区,对其操作?
                            有没有这样的例程能参照一下?

最新回复

详细的例程可参考 StellarisWare 中的 bit_band 例程。  详情 回复 发表于 2011-10-1 16:34
 
点赞 关注(1)

回复
举报

1729

帖子

0

TA的资源

五彩晶圆(初级)

沙发
 
等待高手!
 
 

回复

25

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
//外设别名区    ADDRESS=0x4200 0000 + (addr-0x40000000)*32 + (bitx*4) //bitx:第x位
// 把“位段地址+位序号”转换别名地址宏
#define BITBAND(addr, BitNum)         ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(BitNum<<2))
//把该地址转换成一个指针
#define MEM_ADDR(addr)                  (*( (volatile unsigned long  *)(addr) ))

#define BIT_ADDR(addr, BitNum)  MEM_ADDR( BITBAND(addr, BitNum) )

unsigned char FlagUchar;
#define BitFlag1 BIT_ADDDR(&FlagUchar,0)
 
 
 

回复

1803

帖子

0

TA的资源

五彩晶圆(高级)

4
 

回复 板凳 biansf2001 的帖子

位带区说的是对 MCU 内部集成的外设来操作的,对 MCU 没有集成的,应该是按照通常的操作来进行。
 
 
 

回复

25

帖子

0

TA的资源

一粒金砂(中级)

5
 

回复 4楼 Study_Stellaris 的帖子

仔细看看手册,外设和SRAM在影射到了未带
 
 
 

回复

105

帖子

0

TA的资源

一粒金砂(中级)

6
 

回复 板凳 biansf2001 的帖子

我觉得应该定义在SRAM上才对吧!定义在外设区,肯定会误操作外设!造成不可想象的错误!!!
 
 
 

回复

918

帖子

0

TA的资源

纯净的硅(中级)

7
 

回复 5楼 biansf2001 的帖子

是的,对于 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))
 
 
 

回复

918

帖子

0

TA的资源

纯净的硅(中级)

8
 

回复 6楼 历史的天空 的帖子

详细的例程可参考 StellarisWare 中的 bit_band 例程。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表