OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 9982|回复: 4

关于位带的问题,请大家赐教!

[复制链接]

3

主题

5

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2011-8-9
在线时间
1 小时
发表于 2011-11-27 20:46:42 | 显示全部楼层 |阅读模式
关于位带的问题,请大家赐教!
我从外部读入信号,存放至位带区。第一次读READ0,存入相应位带区;当读READ1时,READ0位带区的内容就会改变(外部信号是恒定的,读入电路也正常)。会不会是没有设置好,编译器把某一个变量也使用了这个区域,那该怎样设置才能让别的变量不用这个位带区。谢谢!
#define  READ0  *( ((volatile unsigned long *) (0x20000020)) )   //位带区
#define  READ1  *( ((volatile unsigned long *) (0x20000024)) )   //位带区
READ0 = GPIOA->IDR  ;
READ1 = GPIOB->IDR  ; //此条指令会影响READ0内容,即0x20000020内容
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2011-11-27 21:04:06 | 显示全部楼层
回复【楼主位】firth:
---------------------------------
你这个不是未带区....
你这个直接就是在内存了.
干嘛不用u8/u16之类的变量,让编译器自己分配呢?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

3

主题

5

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2011-8-9
在线时间
1 小时
 楼主| 发表于 2011-11-27 21:45:03 | 显示全部楼层
原子大哥,你好!
其实我把C51的位sbit移值过来的,比较完整的如下所示。这样,我就可以像C51的sbit这样单独处理信号,PA相当于C51的D0-D7数据线。不知道这样对不对?
#define  READ0  *( ((volatile unsigned long *) (0x20000020)) )
//位带区 对应地址ADRR0:0800H  1-8传感器  #define  IN1  *( ((volatile unsigned long *) (0x22000400)) )
//第1传感器读取结果
#define  IN2  *( ((volatile unsigned long *) (0x22000404)) )
//第2传感器读取结果
#define IN3  *( ((volatile unsigned long *) (0x22000408)) )
//第3传感器读取结果
#define  IN4  *( ((volatile unsigned long *) (0x2200040C)) )
//第4传感器读取结果
#define  IN5  *( ((volatile unsigned long *) (0x22000410)) )
//第5传感器读取结果
#define IN6  *( ((volatile unsigned long *) (0x22000414)) )
//第6传感器读取结果
#define IN7  *( ((volatile unsigned long *) (0x22000418)) )
//第7传感器读取结果
#define IN8  *( ((volatile unsigned long *) (0x2200041C)) )
//第8传感器读取结果
READ0 = GPIOA->IDR  ;
回复 支持 反对

使用道具 举报

3

主题

5

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2011-8-9
在线时间
1 小时
 楼主| 发表于 2011-11-27 23:13:51 | 显示全部楼层
问题已解决,用变量定义,然后用宏定义:
#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)) 
//IO口地址映射
就可以像C51的sbit这样操作了。
谢谢原子大哥!
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2011-11-28 00:51:45 | 显示全部楼层
回复【4楼】firth:
---------------------------------
呵呵,恭喜.
不过,这种方法能不用尽量不用吧.毕竟不是每个芯片都支持这样的操作.
会降低代码的可移植性.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-24 13:11

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表