OpenEdv-开源电子网

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

关于位带操作的疑问

[复制链接]

31

主题

1954

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4510
金钱
4510
注册时间
2018-5-11
在线时间
944 小时
发表于 2018-7-2 16:21:25 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 warship 于 2018-7-2 23:14 编辑

位带功能将外设的各个寄存器的每1bit映射到别名存储区扩充到了1个字(32位),比如GPIO B的IDR8(控制PB8)的BIT位,别名存储地址为0x4221 81A0,当我想置位PB8的时候,直接访问别名存储地址就可以了,即:     *(0x422181A0)=0x01;
那么问题来了:  这个地址是专用的吗,不能被其它实际的物理存储器占用吗?
假如可以有其它实际的物理存储器占用该地址,
我用上述指令访问的时候,程序怎么知道我是正常访问这个存储器,还是只利用它来给PB8置位呢?

最佳答案

查看完整内容[请看2#楼]

接上楼,再进一步地,如果上述理解都正确的话。 可以推想这么设计的初衷: 片上SRAM共分配了0.5GB的空间,这么大的SRAM是用不了的。 进一步地,ARM只对该空间的底部共64MB进行了定义, 而最底部的32MB是用户能够使用的SRAM(其中最最底部的1MB兼设计为位带区) 接下来的高32MB定义为别名区,这一部分无法作为正常存储器使用 因为,就你们这些小样儿,免费赠送的SRAM最多给到别名区空间以下!!! 免费的大部分情况已经足够 ...
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

31

主题

1954

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4510
金钱
4510
注册时间
2018-5-11
在线时间
944 小时
 楼主| 发表于 2018-7-2 16:21:26 | 显示全部楼层
接上楼,再进一步地,如果上述理解都正确的话。
可以推想这么设计的初衷:
片上SRAM共分配了0.5GB的空间,这么大的SRAM是用不了的。
进一步地,ARM只对该空间的底部共64MB进行了定义,
而最底部的32MB是用户能够使用的SRAM(其中最最底部的1MB兼设计为位带区)
接下来的高32MB定义为别名区,这一部分无法作为正常存储器使用
因为,就你们这些小样儿,免费赠送的SRAM最多给到别名区空间以下!!!
免费的大部分情况已经足够用了,共1MB+31MB。真不够的话,自己想办法去!!
就是这些也看具体厂家的设计了,但所见到的103系列,最大也只有区区64kB, 离越界还远着呢。
所以2200 0000至23FF FFFF这一区域你们猴年马月也用不上,老子设计成别名区了。哈哈。
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复

使用道具 举报

31

主题

1954

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4510
金钱
4510
注册时间
2018-5-11
在线时间
944 小时
 楼主| 发表于 2018-7-2 18:54:11 | 显示全部楼层
我自己的理解是:
别名区的那一块存储器地址,对应片上外设寄存器的,共32MB
地址空间为:4200 0000-43FF FFFF这一段地址规定就是这一映射用途,
不允许被用作存储空间,
这样,只要有对这一区域的访问,STM32直接就用于位操作了。
不知,这样理解对不对?
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复

使用道具 举报

31

主题

1954

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4510
金钱
4510
注册时间
2018-5-11
在线时间
944 小时
 楼主| 发表于 2018-7-2 19:23:13 | 显示全部楼层
如果上楼的理解正确,
那么对片上SRAM区的理解也一样:
片上SRAM共分配了0.5GB的空间, 即2000 0000至3FFF FFFF
其中位绑定区占用最低的1MB空间,即2000 0000至200F FFFF(这一区域可当作一般存储器按字节读写,也可使用别名地址按位寻址)
对应上述位绑定的别名区占用32MB,即2200 0000至23FF FFFF(这一空间是STM32规定死的,无法作为正常存储器使用,凡寻址这一地址空间的,默认是对相应的位带区进行位操作)
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复

使用道具 举报

31

主题

1954

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4510
金钱
4510
注册时间
2018-5-11
在线时间
944 小时
 楼主| 发表于 2018-7-2 19:49:59 | 显示全部楼层
由于我们常用的STM10X系列,最大SRAM只有区区64kB,
都处于底部位带的1MB空间范围内,
所以我们的SRAM的每1位都可用于位操作。
不知KEIL有没有做这样的优化:当我们以字节(unsigned char)用作FLAG,类似布尔变量的时候,编译时以位带的模式进行操作?
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2018-7-3 01:16:46 | 显示全部楼层
warship 发表于 2018-7-2 18:54
我自己的理解是:
别名区的那一块存储器地址,对应片上外设寄存器的,共32MB
地址空间为:4200 0000-43F ...

厉害。。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

31

主题

1954

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4510
金钱
4510
注册时间
2018-5-11
在线时间
944 小时
 楼主| 发表于 2018-7-3 18:35:56 | 显示全部楼层

谢谢原子亲自过来夸奖,难道我理解正确无误了吗?
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2018-7-4 01:58:26 | 显示全部楼层
warship 发表于 2018-7-3 18:35
谢谢原子亲自过来夸奖,难道我理解正确无误了吗?

我是直接用的,没深究。你可以看CM3权威指南,中文版那个,有详细说明的
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

29

主题

338

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1181
金钱
1181
注册时间
2018-4-13
在线时间
170 小时
发表于 2018-7-4 13:18:40 | 显示全部楼层
我昨晚刚看位带知识,我的理解和楼主大体一样。
大容量的F103ZET的SRAM只有64kB,而block2用作外设总线地址,这些我们只能使用。
SRAM低1MB可以映射到0x2200,0000开始的地址作为位带区操作,这个地址是保留地址,外扩存储器应该需要避开这片空间。
至于操作位带区是不是keil自动转为操作映射的bit这个我认为是STM32内部本身支持的,如果没有内核支持就存在转换过程,也就省不了操作周期了。如果不是这样,那么手册上关于用位带操作可以避免多任务系统中共享资源出现紊乱危机就无从谈起了。
具体看CM3权威指南,P.88-P.90
回复

使用道具 举报

31

主题

1954

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4510
金钱
4510
注册时间
2018-5-11
在线时间
944 小时
 楼主| 发表于 2018-7-4 19:28:16 | 显示全部楼层
xiatianyun 发表于 2018-7-4 13:18
我昨晚刚看位带知识,我的理解和楼主大体一样。
大容量的F103ZET的SRAM只有64kB,而block2用作外设总线地 ...

同意
外扩SRAM的地址空间在6000 0000开始的1GB空间
所以即使外扩也与别名区无涉。
另外,你不知对我何处误解了,
我没有说过Keil自动转换操作映射,
这肯定是STM32的内部机制,
Keil编译出来的目标代码肯定是对位带别名区地址进行访问的,
MCU执行的时候说:没有这个地址存在哦,我转到位带区吧!
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复

使用道具 举报

29

主题

135

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
329
金钱
329
注册时间
2018-10-19
在线时间
28 小时
发表于 2018-11-9 10:38:27 | 显示全部楼层
不是很明白为什么要用别名区操作,如果我直接知道要操作的地址1(BRR),为什么还要用地址2 (LED)去指向地址1 然后去操作呢?是为了取个更直观的名字么(GPIOB->BRR 叫做LED)?
回复

使用道具 举报

31

主题

1954

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4510
金钱
4510
注册时间
2018-5-11
在线时间
944 小时
 楼主| 发表于 2018-11-9 13:18:06 | 显示全部楼层
好风 发表于 2018-11-9 10:38
不是很明白为什么要用别名区操作,如果我直接知道要操作的地址1(BRR),为什么还要用地址2 (LED)去指向地址 ...

http://www.openedv.com/forum.php?mod=viewthread&tid=274196
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复

使用道具 举报

31

主题

1954

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4510
金钱
4510
注册时间
2018-5-11
在线时间
944 小时
 楼主| 发表于 2018-11-9 13:38:09 | 显示全部楼层
好风 发表于 2018-11-9 10:38
不是很明白为什么要用别名区操作,如果我直接知道要操作的地址1(BRR),为什么还要用地址2 (LED)去指向地址 ...

你这样发问,是因为你根本没有搞清位操作的基本状况。
你问的这种属于宏定义,与位操作没有任何关系的。
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复

使用道具 举报

13

主题

633

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1331
金钱
1331
注册时间
2016-8-1
在线时间
229 小时
发表于 2018-11-9 14:46:54 | 显示全部楼层
楼主牛逼
回复

使用道具 举报

29

主题

135

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
329
金钱
329
注册时间
2018-10-19
在线时间
28 小时
发表于 2018-11-9 16:03:55 | 显示全部楼层
行吧我再回去看看 原子哥的位带操作
回复

使用道具 举报

0

主题

7

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2018-11-10
在线时间
15 小时
发表于 2019-11-26 15:42:38 | 显示全部楼层
跟着深入思考的人学习总是那么高效。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-25 05:52

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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