110701|638

190

帖子

0

TA的资源

五彩晶圆(初级)

楼主
 

这份写得不错,在STM32平台上实现Cortex-M3的位带特性 [复制链接]

 

STM32平台上实现Cortex-M3的位带特性

    位操作是指单独操作某个数据中的某一位。在嵌入式程序设计中很常见,诸如设置标志位、判断一个字节某一位的值、取反一个字节的某一位等都需要通过位操作来完成。常见的51单片机可以通过sbit关键字进行位定义从而实现位操作。但事实上绝大部分的单片机(比如被广泛使用的AVR单片机)是不支持位操作的,如此一来就必须通过程序的设计来实现位操作,最常见的操作如下:

(1) a &=~(1 << 5);        // 将变量 a 的第5位清0
(2) a |= (1 << 6);        // 将变量 a 的第6位置1
(3) a ^=(1 << 2);         // 将变量 a 的第2位取反

使用以上三句C代码进行位操作是一种很规范的方法,因为其没有使用任何非ANSI C关键字,任何支持C编译的开发环境都支持这样的写法,这对程序的移植性有相当的好处。与此对应的,51单片机的keil uVision2开发环境所支持的sbit关键字就是非ANSI C关键字,因此若在用户程序中使用了此关键字,则该程序无法移植到其他开发环境中,该程序也不具备移植到其他硬件平台(比如德仪的MSP430单片机)的基础。

         有少许C代码编写经验的读者应该知道,上述3句代码都是“复合”语句。选(1)句为例:该语句首先进行移位操作,再将移位后的结果进行取反,然后读取出变量a的值并与取反的结果进行“与”运算,总结起来便是“读出——修改——写入”的过程。如此一来从表面上来看就至少经过了4条指令才完成该句代码的执行——从代码效率的角度上来说,这并不是很理想。

 

游客,如果您要查看本帖隐藏内容请回复

[ 本帖最后由 losingamong 于 2011-6-3 01:51 编辑 ]
此帖出自stm32/stm8论坛

最新回复

感谢   详情 回复 发表于 2023-3-14 15:43

点评

学习学习,顶一下。  详情 回复 发表于 2013-12-17 13:46
good .感谢大家一起分享,一起进步。  详情 回复 发表于 2013-12-15 19:26
回复看看  详情 回复 发表于 2013-12-8 12:17
回复看看!  详情 回复 发表于 2013-11-28 16:05
不回复对不起楼主  详情 回复 发表于 2013-11-28 15:25
点赞 关注(4)
 

回复
举报

190

帖子

0

TA的资源

五彩晶圆(初级)

沙发
 
       STM32所基于的ARM Cortex-M3内核引入了一种新颖的“位带”技术(英文称为Bit Band),这种“位带”技术将部分其片内的部分称为“位带区”的存储区域和另外一部分称为“位带别名区”的区域映射起来。一个比较完整的描述是:Cortex-M3的内部存储空间有2个“位带区”,分别称为“SRAM位带区”和“外设存储位带区”,各自位于SRAM区和外设存储区各自最低的1MBit空间;并有对应的2个“位带别名区”,分别称为“SRAM位带别名区”和“外设存储位带别名区”,每个别名区大小为32MBit。“位带”技术将两个“位带区”的每一位分别映射带对应的“位带别名区”的一个“字”(即32位)的最低位上。图1展示了这种关系:

图1

       图1中,左边的0x40000000表示“外设存储位带区”的起始地址,而右边的0x42000000则表示“外设存储位带别名区”的存储地址,0th Bit、1th Bit等表示从地址0x40000000依次往后的第0位,第1位等。右边的0x42000000表示STM32内部的“外设存储位带别名区”起始地址,而下面的0x42000000 – 0x420000010、0x42000010 – 0x420000020等则表示从地址0x42000000依次往后的第1个、第二个“字”空间。在此要注意到的是,STM32作为一款32位控制器,其数据总线当然是32位的,但其内部存储空间不仅支持32位存取,同时也支持8位(字节)、16位(半字)存取方式,因此其内部存储空间是按照最小存取长度(8位)来对齐的,以图1中的0x42000000 – 0x420000010为例,其存储空间的排列情况如下图2所示。假设想这段空间内写入数据0x12345678,则实际内容(假设是小端存储格式)如图3所示。

图2                                                                 图3

        8位长度的对齐方式决定了用户通过应用程序操作存储空间的最小长度为8位,亦即1个字节。因此如果要单独对某一“位”进行操作,则必须使用上文中所讲述的办法。 但通过这种“位带”技术进行存储空间的映射后,可以很轻易快捷的实现位操作。当对“位带别名区”的某一个“字”空间的最低位进行清除操作时,则对应的“位带区”所对应的“位”即会被清除,反之当对“位带别名区”的某一个“字”空间的最低位进行置位操作时,,则对应的“位带区”所对应的“位”也会被置位。这样一来,前文所讲述的“读出——修改——写入”就变成了只有“写入”的过程,这是一种非常典型的空间换时间的做法。也许有读者会疑问,这样岂不是损失掉了2个32MBit的存储空间?答案是这部分存储空间是通过映射技术“虚拟”出来的,STM32片内的这部分地址空间并没有物理存储介质存在。 下面通过一个简单的例子讲述如何实现STM32微控制器平台上的“位带”技术实现一个简单的点亮发光二极管的操作。其中发光二极管使用STM32的PA4引脚的输出高电平点亮,则只要在PA4引脚输出一个高电平,即可点亮该发光二极管。 通过查阅STM32的开发手册可以知道,要在PA4引脚输出高电平,则只需要在初始化完毕GPIOA设备之后对GPIOA的ODR寄存器的第4位写入一个“1”即可。这个目的很简单,重点是如何计算ODR寄存器的第4位在“位带别名区”中所对应的“字”空间地址。获取该地址的过程如下图4所示。

图4

        事实上有了前文的描述,相信图4是比较容易理解的。图中自上往下最终推算出了GPIOA的ODR各个位的“位带别名区”的地址,可以看到ODR寄存器的第4位所对应的“字”空间地址为0x42210190。从STM32的开发手册上也可以获取“位带别名区”的字空间所对应的“位”: bit_word_addr = bit_band_base + (byte_offset×32) + (bit_number×4) 上述公式中,bit_word_addr表示“位带别名区”字空间,bit_band_base表示对应的“位带区别名区”起始地址,byte_offset表示“位”在“位带区”中的字节偏移地址,bit_number则表示“位”在对应“位带区”字节中的位置。 以对GPIOA的ODR寄存器的第4位写入一个“1”为例,首先要找到ODR寄存器的第4位的“位带区”起始地址,字节偏移地址和在字节中的位置。其中“位带区”起始地址已知为0x42000000,而字节偏移地址由在图4找出为0x0001080C(注意是此处偏移地址,不是图中的绝对地址),同时位置为第4位,因此可以套用上述公式计算对应的“字空间” bit_word_addr = 0x42000000 + (0x0001080C × 32) + (4 × 4) = 0x42210190 可知可图中推算的结果一致。因此,只要向地址为0x42210190的空间写入“1”即可点亮发光二极管。程序清单见PDF。 [ 本帖最后由 losingamong 于 2011-6-3 01:48 编辑 ]
此帖出自stm32/stm8论坛

点评

:pleased: haohaoaho  详情 回复 发表于 2013-9-30 16:52
楼主我怎么看有些地址写错了呢。图4有个算地址偏移的0x00001000*32bit=0x00200000,好像多了个0啊。后面几个都是这样,就最后一个0x000000c*32bit=0x00000180是正确的。还有第1位1*32bit=20才对啊,怎么0x42210184仅  详情 回复 发表于 2012-11-16 16:26
老规矩,回复可见。  详情 回复 发表于 2012-11-8 11:46
很好的帖子  详情 回复 发表于 2012-8-22 10:02
不错奥,学习一下  详情 回复 发表于 2012-7-11 12:39
 
 

回复

1万

帖子

16

TA的资源

版主

板凳
 

写的不错赞一下

此帖出自stm32/stm8论坛
 
个人签名http://shop34182318.taobao.com/
https://shop436095304.taobao.com/?spm=a230r.7195193.1997079397.37.69fe60dfT705yr
 

回复

7219

帖子

192

TA的资源

五彩晶圆(高级)

4
 
继续关注楼主哦
此帖出自stm32/stm8论坛
 
 
 

回复

4

帖子

0

TA的资源

一粒金砂(初级)

5
 
   赞,很好,收藏咯!
此帖出自stm32/stm8论坛
 
 
 

回复

100

帖子

0

TA的资源

一粒金砂(高级)

6
 
“位带”技术学习一下。对端口的任意位写数据也可以用BSRR或BRR来实现
此帖出自stm32/stm8论坛
 
 
 

回复

11

帖子

0

TA的资源

一粒金砂(中级)

7
 
kankan
此帖出自stm32/stm8论坛
 
 
 

回复

88

帖子

0

TA的资源

一粒金砂(中级)

8
 
学习下位操作
此帖出自stm32/stm8论坛
 
 
 

回复

1059

帖子

0

TA的资源

纯净的硅(高级)

9
 
先mark 回头学习
此帖出自stm32/stm8论坛
 
 
 

回复

18

帖子

0

TA的资源

一粒金砂(初级)

10
 
看看
此帖出自stm32/stm8论坛
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

11
 
向楼主前来取经了
此帖出自stm32/stm8论坛
 
 
 

回复

7

帖子

0

TA的资源

一粒金砂(初级)

12
 
很好,学习了
此帖出自stm32/stm8论坛
 
 
 

回复

4138

帖子

0

TA的资源

五彩晶圆(中级)

13
 

回复 楼主 losingamong 的帖子

讲得不错受益匪浅
此帖出自stm32/stm8论坛
 
 
 

回复

7

帖子

0

TA的资源

一粒金砂(初级)

14
 

分析的很好

感谢分享!
此帖出自stm32/stm8论坛
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

15
 

看看

 
此帖出自stm32/stm8论坛
 
 
 

回复

996

帖子

0

TA的资源

一粒金砂(高级)

16
 
看来C学的还有待提高!~~~
此帖出自stm32/stm8论坛
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(中级)

17
 
不错顶一下!
此帖出自stm32/stm8论坛
 
 
 

回复

22

帖子

0

TA的资源

一粒金砂(中级)

18
 
赞一个,想学stm32
此帖出自stm32/stm8论坛
 
 
 

回复

39

帖子

0

TA的资源

一粒金砂(高级)

19
 
不错 好
此帖出自stm32/stm8论坛
 
 
 

回复

4

帖子

0

TA的资源

一粒金砂(初级)

20
 
谢谢分享,学习中!!
此帖出自stm32/stm8论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
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
快速回复 返回顶部 返回列表