欢迎来到天天文库
浏览记录
ID:62033929
大小:100.50 KB
页数:2页
时间:2021-04-15
《STM32的位带操作的理解详解.doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、STM32的位带操作的理解详解首先要了解一个基本的概念:STM32单片机的一个地址(如:0x20000000。)是一个字节,即8bit。STM32的位带操作。简单的说就是把一个地址A的8个位,分别单独的重新定义8个地址,操作一个地址等同于操作一个位,形象的理解即为取别名.位带区中的地址除了可以同RAM一样使用外,还带有自己的“位带别名”。将每个位拓展为32位的字,既成了位带别名。如:0x20000000(一个字节)拓展到32位可得8个32位的字分别是:0x220000000x220000040x220000080x2200000c0x220000100x220000140x220000180x
2、2200001c由此可得“位带区”上任意地址的“位带别名地址"SRAM:0x22000000+((A‐0x20000000)*8+n)*4FLASH:0x42000000+((A‐0x40000000)*8+n)*4既:0x22000000+(A‐0x20000000)*32+n*40x42000000+(A‐0x40000000)*32+n*4别名区地址=位带别名区起始地址+偏移量备注:字节的地址:A位序号:n(03、”转换别名地址#defineGPIOA_ODR_Addr(GPIOA_BASE+12)//0x4001080C#defineGPIOA_IDR_Addr(GPIOA_BASE+8)//0x40010808#defineGPIOB_ODR_Addr(GPIOB_BASE+12)//0x40010C0C#defineGPIOB_IDR_Addr(GPIOB_BASE+8)//0x40010C08#defineBITBAND(addr,bitnum)((addr&0xF0000000)+0x2000000+((addr&0xFFFFF)〈<5)+(bitnum<〈2))#defineBITBAND(4、addr,bitnum)((addr&0xF0000000)+0x2000000+((addr&0xFFFFF)<〈5)+(bitnum〈〈2))//计算bit区地址偏移#defineMEM_ADDR(addr)(*((vu32*)(addr)))//强制转换为指针#defineBIT_ADDR(addr,bitnum)MEM_ADDR(BITBAND(addr,bitnum))再来一个宏重命名一下#definePA0BIT_ADDR(GPIOA_ODR_Addr,0)有什么好处呢?是这样的,记得MCS51吗?MCS51就是有位操作,以一位(BIT)为数据对象的操作,MCS51可以简单的将P15、口的第2位独立操作:P1。2=0;P1。2=1;就是这样把P1口的第三个脚(BIT2)置0置。而现在STM32的位段、位带别名区就为了实现这样的功能。对象可以是SRAM,I/O外设空间。实现对这些地方的某一位的操作。它是这样的.在寻址空间(32位地址是4GB)另一地方,取个别名区空间,从这地址开始处,每一个字(32BIT)就对应SRAM或I/O的一位。这样呢,1MBSRAM就可以有32MB的对应别名区空间,就是1位膨胀到32位(1BIT变为1个字)我们对这个别名区空间开始的某一字操作,置0或置1,就等于它映射的SRAM或I/O相应的某地址的某一位的操作。
3、”转换别名地址#defineGPIOA_ODR_Addr(GPIOA_BASE+12)//0x4001080C#defineGPIOA_IDR_Addr(GPIOA_BASE+8)//0x40010808#defineGPIOB_ODR_Addr(GPIOB_BASE+12)//0x40010C0C#defineGPIOB_IDR_Addr(GPIOB_BASE+8)//0x40010C08#defineBITBAND(addr,bitnum)((addr&0xF0000000)+0x2000000+((addr&0xFFFFF)〈<5)+(bitnum<〈2))#defineBITBAND(
4、addr,bitnum)((addr&0xF0000000)+0x2000000+((addr&0xFFFFF)<〈5)+(bitnum〈〈2))//计算bit区地址偏移#defineMEM_ADDR(addr)(*((vu32*)(addr)))//强制转换为指针#defineBIT_ADDR(addr,bitnum)MEM_ADDR(BITBAND(addr,bitnum))再来一个宏重命名一下#definePA0BIT_ADDR(GPIOA_ODR_Addr,0)有什么好处呢?是这样的,记得MCS51吗?MCS51就是有位操作,以一位(BIT)为数据对象的操作,MCS51可以简单的将P1
5、口的第2位独立操作:P1。2=0;P1。2=1;就是这样把P1口的第三个脚(BIT2)置0置。而现在STM32的位段、位带别名区就为了实现这样的功能。对象可以是SRAM,I/O外设空间。实现对这些地方的某一位的操作。它是这样的.在寻址空间(32位地址是4GB)另一地方,取个别名区空间,从这地址开始处,每一个字(32BIT)就对应SRAM或I/O的一位。这样呢,1MBSRAM就可以有32MB的对应别名区空间,就是1位膨胀到32位(1BIT变为1个字)我们对这个别名区空间开始的某一字操作,置0或置1,就等于它映射的SRAM或I/O相应的某地址的某一位的操作。
此文档下载收益归作者所有