BIT_BAND(帮你理解M3的位断区).doc_第1页
BIT_BAND(帮你理解M3的位断区).doc_第2页
BIT_BAND(帮你理解M3的位断区).doc_第3页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

摘录的Chuzhujun的一点经验,和大家一起分享!首先追溯到51,51单片机RAM内从从20H往后到3FH是位访问区,每一个字节的每一个位也对应有从00h开始的的每一个字节的最后一位,例如20H.0对应00h,20H.1对应于01h,.其中00h,01h中起作用的也只是最后一位,其他位都是没意义的,又如FLAG1BIT00H,这样的话如果SetbFLAG1这条语句执行,实际上市对RAM中20H这个字节的Bit0置一了,由此看来,这能ARM也是受Intel的影响和启发啊!其次:开始讲cm3的BIT_BAND,处理器存储器映射包括两个bit-banding区域。它们分别为SRAM和外设存储区域中的最低的1MB。这些bit-band区域将存储器别名区的一个字映射为bit-band区的一个位。请看下图:file:/C:/Documents%20and%20Settings/jishu/桌面/isp/未命名.jpg图中1M的bitband区域的每一个字节的每一位分别有bitband别名区的每一个字(四字节)对应,那么,这是不是和51的位区原理一样啊?呵呵,但是我们要知道,这里的位区可不是51里面的那么几十个字节啊,而是偌大的空间,很多人会认为,这样好浪费啊,每一个位对应一个字,那么这个字的其他剩余31个字节就等于是浪费的啊,虽然这是对的,是有点浪费,但是这样做的好处是不可估量的,想象看吧,我们这么举个例子来看看,就比如说现在忘SRAM的首地址写一个字节吧,也就是地址:0x20000000,但是我们想往0x20000000这个字节的bit3写1而保证其他的位都不发生变化,我们会怎么做,当然了,这肯定都会,就是一个读-修改-写的过程嘛,首先读出来这个字节给一个temp临时字节类型变量,然后同11110111b相与,然后再把temp给0x20000000完成位修改的操作,这样麻烦啊,还要定义一个变量,还一不小心把别的位也改变了,岂不出问题?现在好了,我们知道0x20000000这个字节对应的bit0位是对应在别名区的0x22000000往后的一个字(四字节)中,那么,我现在直接像这个别名区写一个最后一位为1就可以了的一个字:(*(u32*)0x2200000b)=1,这样一条语句就可以往0x20000000这一字节的bit3写1了,不用定义变量,不用担心会影响其他位,这样带来的好处同刚才我们认为的浪费空间的想法来比,不言而喻啦!第三:方法和思想都清楚啦,接下来就是要寻找一个有效的方法来高效的写入啦,否则要是这样写一个位都算老半天该往那一个别名区的地址里写数,那可就麻烦了,所以请大家先看一个图,我手画然后扫描上去的,不是很好看,大家将就着看吧,别因为我图画的不好就认为我人品不好啊,我可是花了半天时间扫描的呢:C:DocumentsandSettingsjishu桌面isp1.jpgCortex-M3存储器映射有2个32MB别名区,它们被映射为两个1MB的bit-band区:32MBSRAM别名区和32MB外设别名区,我这里图示的是SRAM位区同他们的别名区所对应的关系:SRAM是从0x20000000开始的,他的别名区是从0x22000000开始的,这一点首先要弄清楚,0x20000000的每一个位对应于0x22000000往后的一个一个字,如:(0x22000000).0对应0x220000000x22000003这一个字空间,你只需要定义一个指向32位地址的指针:(u32*)0x22000000,往这个指针对应的地址中写1就是对:(0x22000000).0这一位置一,写0就是清零,诚然,这个别名区的一个字中,1到31位都没有用到,也就是我们先前所说的浪费空间问题,不过优点已经很明显了!依此类推,向图中的0x20004001的第3位,图上是BIT3(我这里没有将第一位写成BIT0)写1,那么由途中对应的关系,我们就应该向0x22080024地址往后的四个字节中写1即:*(u32*)0x22080024)=1;这怎么用公式算呢,很好算,首先我们先确定两个区的基地址,我现在要向0x20004001的第三位写一,它偏移了0x20000000一共是(0x20004001-0x20000000)个字节外加3位,而图中我们可以看到,位区的每一个字节的每一个位对应别名区中四个字节,所以总的表达式是:0x22000000+(0x20004001-0x20000000)*8*4+3*4这样表达式就小荷才露尖尖角啦:会变的部分有两个:1.(0x20004001-0x20000000),我们称其为字节偏移,用byte_offset表示2.3,这个我们称其为比特偏移,用bit_offset表示,那么通用表达式就是:0x22000000+(byte_offset*32)+(bit_offset*4),得出的便是在别名区中相对于首地址0x22000000偏移的字节数。当然啦,我们这里是对SRAM而言的,如果对外设

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论