您的位置 首页 汽车

关于STM32别号区的了解

1什么是位段、位带别名区?2它有什么好处?答1:是这样的,记得MCS51吗?MCS51就是有位操作,以一位(BIT)为数据对象的操作,MC

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条指令。
一般操作是读-改-写的方法, 而位带别号区是写操作。避免中止对读-改-写的方法的影响。

//STM32支撑了位带操作(bit_band),有两个区中完成了位带。其间一个是SRAM 区的最低1MB 规模,第二个则是片内外设
//区的最低1MB 规模。这两个区中的地址除了能够像一般的RAM 相同运用外,它们还都有自己的“位带别号区”,位带别号区
//把每个比特胀大成一个32 位的字。
//
//每个比特胀大成一个32 位的字,便是把1M扩展为 32M ,
//
//所以;RAM地址 0X200000000(一个字节)扩展到8个32 位的字,它们是:(STM32中的SRAM依然是8位的,所以RAM中任一地址对应一个字节内容)
//0X220000000 ,0X220000004,0X220000008,0X22000000C,0X220000010,0X220000014, 0X220000018,0X22000001C

// 支撑位带操作的两个内存区的规模是:
// 0x2000_0000‐0x200F_FFFF(SRAM 区中的最低1MB)
// 0x4000_0000‐0x400F_FFFF(片上外设区中的最低1MB)


#define PERIPH_BB_BASE ((u32)0x42000000)

它 举 的 比如中, 这个 PERIPH_BB_BASE ((u32)0x42000000) 是怎么确认的?

这个文档 是 STM32 的 Firware libraryPDF文件。
Bit-Banding的意思是:对Bit-Band区一个字的操作对应实践存储器中的一位。

在STM32F10xxx的技能参阅手册中第2.3.3节,有这样的描绘:

Cortex-M3存储器映像包括两个位段(bit-band)区。这两个位段区将别号存储器区中的每个字映射到位段存储器区的一个位,在别号存储区写入一个字具有对位段区的方针位履行读-改-写操作的相同作用。

在STM32F10x里,外设寄存器和SRAM都被映射到一个位段区里,这答应履行单一的位段的写和读操作。

下面的映射公式给出了别号区中的每个字是怎么对应位带区的相应位的:
bit_word_addr = bit_band_base + (byte_offset x 32) + (bit_number × 4)
其间:
– bit_word_addr 是别号存储器区中字的地址,它映射到某个方针位。
– bit_band_base 是别号区的开始地址。
– byte_offset 是包括方针位的字节在位段里的序号
– bit_number 是方针位所在位置(0-31)
下面的比如阐明怎么映射别号区中SRAM地址为0x20000300的字节中的位2:
0x22006008 = 0x22000000 + (0x300*32) + (2*4).
对0x22006008地址的写操作和对SRAM中地址0x20000300字节的位2履行读-改-写操作有着相同的作用。

读0x22006008地址回来SRAM中地址0x20000300字节的位2的值(0x01 or 0x00)。

请参阅《Cortex-M3技能参阅手册》以了解更多有关位段的信息。

上面比如中的基地址0x22000000和你所讲的基地址0x42000000是固定在芯片中,你必须用这两个地址;基地址0x22000000用于操作内置RAM,基地址0x42000000用于操作内置外设。

STM32位界说
你能够才用先用__at来指定一个变量的ARM地址
然后在界说,那么你在程序中就能够象51中相同运用了,我便是这么界说的.
例:
unsigned long System_Mark[10]__attribute__((at(0x20000200)));//拓荒了10个32位的RAM来界说位标志
#define System_Mark00x20000200
#define System_Mark0_OFFSET(System_Mark0 – SRAM_BASE)
#define Moter_State_Changed( *(vu32 *)(SRAM_BB_BASE | (System_Mark0_OFFSET<<5 | 0<<2)))
#define Moter0_Direction( *(vu32 *)(SRAM_BB_BASE | (System_Mark0_OFFSET<<5 | 0<<2)))

那么我在程序就中就能够对:
Moter_State_Changed =1;/Moter_State_Changed =0/ if (Moter_State_Changed)
Moter_State_Changed =~Moter_State_Changed;Moter_State_Changed =!Moter_State_Changed;

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qiche/255795.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部