- 1、本文档共5页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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)