位带操作学习记.doc

  1. 1、本文档共5页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
位带操作学习记

STM32?BIT_BAND?位段位带别名区使用入门 1.?什么是位段、位带别名区? 2.?它有什么好处?? 答1:?是这样的,记得MCS51吗??MCS51就是有位操作,以一位(BIT)为数据对象的操作, ??????MCS51可以简单的将P1口的第2位独立操作:?P1.2=0;P1.2=1?;?就是这样把P1口的第三个脚(BIT2)置0置。 ??????而现在STM32的位段、位带别名区就为了实现这样的功能。?????? ??????对象可以是SRAM,I/O外设空间。实现对这些地方的某一位的操作。? ??????它是这样的。在寻址空间(32位地址是?4GB?)另一地方,取个别名区空间,从这地址开始处,每一个字(32BIT) ??????就对应SRAM或I/O的一位。 ?????? ??????这样呢,1MB?SRAM就?可以有32MB的对应别名区空间,就是1位膨胀到32位(1BIT?变为1个字) ??????我们对这个别名区空间开始的某一字操作,置0或置1,就等于它映射的SRAM或I/O相应的某地址的某一位的操作。 ?????? 答2:??简单来说,可以把代码缩小,?速度更快,效率更高,更安全。 ??????一般操作要6条指令,而使用?位带别名区只要4条指令。??? ??????一般操作是??读-改-写??的方式,?而位带别名区是?写?操作。防止中断对读-改-写??的方式的影响。 /??支持了位带操作(bit_band),有两个区中实现了位带。其中一个是SRAM?区的最低1MB?范围,第二个则是片内外设 //??区的最低1MB?范围。这两个区中的地址除了可以像普通的RAM?一样使用外,它们还都有自 //??己的“位带别名区”,位带别名区把每个比特膨胀成一个32?位的字 // //??每个比特膨胀成一个32?位的字,就是把??1M??扩展为?32M?, // //??于是;RAM地址?0X200000000(一个字节)扩展到8个32?位的字,它们是: //???0X220000000?,0X220000004,0X220000008,0,0X220000010,0X220000014,?0X220000018,0 //?支持位带操作的两个内存区的范围是: //?0x2000_0000‐0x200F_FFFF(SRAM?区中的 //?0x4000_0000‐0x400F_FFFF(片上外设区中的最低1MB) /* 对SRAM?位带区的某个比特,记它所在字节地址为A,位序号 在别名区的地址为: AliasAddr=?0+((A‐0*8+n)*4?=0?(A‐0*32?+?n*4 对于片上外设位带区的某个比特,记它所在字节的地址为A,位序号为n(0=n=7),则该比特 在别名区的地址为: AliasAddr=?0((A‐0*8+n)*4?=0?(A‐0*32?+?n*4 上式中,“*4”表示一个字为4?个字节,“*8”表示一个字节中有8?个比特。 */ //?把“位带地址+位序号”转换别名地址宏 #define?BITBAND(addr,?bitnum)?((addr??0xF0000000)+0x2000000+((addr?0xFFFFF)5)+(bitnum2)) //把该地址转换成一个指针 #define?MEM_ADDR(addr)??*((volatile?unsigned?long??*)(addr)) //?MEM_ADDR(BITBAND(?(u32)CRCValue,1))?=?0x1; 例如点亮LED //?使用STM32库? ???GPIO_ResetBits(GPIOC,?GPIO_Pin_4);?//关LED5 ???GPIO_SetBits(GPIOC,?GPIO_Pin_7);???//开LED2 //?一般读操作 ????STM32_Gpioc_Regs-bsrr.bit.BR4?=1;//?1:清除对应的ODRy位为0 ????STM32_Gpioc_Regs-bsrr.bit.BS7?=1;//?1:设置对应的ODRy位为1 //如果使用?位带别名区操作 ??STM32_BB_Gpioc_Regs-BSRR.BR[4]?=1;//?1:清除对应的ODRy位为0 ??STM32_BB_Gpioc_Regs-BSRR.BS[7]?=1;//?1:设置对应的ODRy位为1 代码比STM32库?高效?十倍?! 对内存变量的位操作。?复制内容到剪贴板? 代码

文档评论(0)

mhk8089 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档