新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 對(duì)于STM32別名區(qū)的理解

對(duì)于STM32別名區(qū)的理解

作者: 時(shí)間:2016-11-28 來(lái)源:網(wǎng)絡(luò) 收藏
1. 什么是位段、位帶別名區(qū)?

2. 它有什么好處?

本文引用地址:http://butianyuan.cn/article/201611/322625.htm

答1: 是這樣的,記得MCS51嗎? MCS51就是有位操作,以一位(BIT)為數(shù)據(jù)對(duì)象的操作,
MCS51可以簡(jiǎn)單的將P1口的第2位獨(dú)立操作: P1.2=0;P1.2=1 ; 就是這樣把P1口的第三個(gè)腳(BIT2)置0置。
而現(xiàn)在STM32的位段、位帶別名區(qū)就為了實(shí)現(xiàn)這樣的功能。
對(duì)象可以是SRAM,I/O外設(shè)空間。實(shí)現(xiàn)對(duì)這些地方的某一位的操作。
它是這樣的。在尋址空間(32位地址是 4GB )另一地方,取個(gè)別名區(qū)空間,從這地址開(kāi)始處,每一個(gè)字(32BIT)
就對(duì)應(yīng)SRAM或I/O的一位。
這樣呢,1MB SRAM就 可以有32MB的對(duì)應(yīng)別名區(qū)空間,就是1位膨脹到32位(1BIT 變?yōu)?個(gè)字)
我們對(duì)這個(gè)別名區(qū)空間開(kāi)始的某一字操作,置0或置1,就等于它映射的SRAM或I/O相應(yīng)的某地址的某一位的操作。
答2:簡(jiǎn)單來(lái)說(shuō),可以把代碼縮小, 速度更快,效率更高,更安全。
一般操作要6條指令,而使用位帶別名區(qū)只要4條指令。
一般操作是讀-改-寫(xiě)的方式, 而位帶別名區(qū)是寫(xiě)操作。防止中斷對(duì)讀-改-寫(xiě)的方式的影響。

//STM32支持了位帶操作(bit_band),有兩個(gè)區(qū)中實(shí)現(xiàn)了位帶。其中一個(gè)是SRAM 區(qū)的最低1MB 范圍,第二個(gè)則是片內(nèi)外設(shè)
//區(qū)的最低1MB 范圍。這兩個(gè)區(qū)中的地址除了可以像普通的RAM 一樣使用外,它們還都有自己的“位帶別名區(qū)”,位帶別名區(qū)
//把每個(gè)比特膨脹成一個(gè)32 位的字。
//
//每個(gè)比特膨脹成一個(gè)32 位的字,就是把1M擴(kuò)展為 32M ,
//
//于是;RAM地址 0X200000000(一個(gè)字節(jié))擴(kuò)展到8個(gè)32 位的字,它們是:(STM32中的SRAM依然是8位的,所以RAM中任一地址對(duì)應(yīng)一個(gè)字節(jié)內(nèi)容)
//0X220000000 ,0X220000004,0X220000008,0X22000000C,0X220000010,0X220000014, 0X220000018,0X22000001C

// 支持位帶操作的兩個(gè)內(nèi)存區(qū)的范圍是:
// 0x2000_0000‐0x200F_FFFF(SRAM 區(qū)中的最低1MB)
// 0x4000_0000‐0x400F_FFFF(片上外設(shè)區(qū)中的最低1MB)


#define PERIPH_BB_BASE ((u32)0x42000000)

它 舉 的 例子中, 這個(gè) PERIPH_BB_BASE ((u32)0x42000000) 是如何確定的?

這個(gè)文檔 是 STM32 的 Firware library的 PDF文件。
Bit-Banding的意思是:對(duì)Bit-Band區(qū)一個(gè)字的操作對(duì)應(yīng)實(shí)際存儲(chǔ)器中的一位。

在STM32F10xxx的技術(shù)參考手冊(cè)中第2.3.3節(jié),有這樣的描述:

Cortex-M3存儲(chǔ)器映像包括兩個(gè)位段(bit-band)區(qū)。這兩個(gè)位段區(qū)將別名存儲(chǔ)器區(qū)中的每個(gè)字映射到位段存儲(chǔ)器區(qū)的一個(gè)位,在別名存儲(chǔ)區(qū)寫(xiě)入一個(gè)字具有對(duì)位段區(qū)的目標(biāo)位執(zhí)行讀-改-寫(xiě)操作的相同效果。

在STM32F10x里,外設(shè)寄存器和SRAM都被映射到一個(gè)位段區(qū)里,這允許執(zhí)行單一的位段的寫(xiě)和讀操作。

下面的映射公式給出了別名區(qū)中的每個(gè)字是如何對(duì)應(yīng)位帶區(qū)的相應(yīng)位的:
bit_word_addr = bit_band_base + (byte_offset x 32) + (bit_number × 4)
其中:
- bit_word_addr 是別名存儲(chǔ)器區(qū)中字的地址,它映射到某個(gè)目標(biāo)位。
- bit_band_base 是別名區(qū)的起始地址。
- byte_offset 是包含目標(biāo)位的字節(jié)在位段里的序號(hào)
- bit_number 是目標(biāo)位所在位置(0-31)
下面的例子說(shuō)明如何映射別名區(qū)中SRAM地址為0x20000300的字節(jié)中的位2:
0x22006008 = 0x22000000 + (0x300*32) + (2*4).
對(duì)0x22006008地址的寫(xiě)操作和對(duì)SRAM中地址0x20000300字節(jié)的位2執(zhí)行讀-改-寫(xiě)操作有著相同的效果。

讀0x22006008地址返回SRAM中地址0x20000300字節(jié)的位2的值(0x01 or 0x00)。

請(qǐng)參考《Cortex-M3技術(shù)參考手冊(cè)》以了解更多有關(guān)位段的信息。

上面例子中的基地址0x22000000和你所講的基地址0x42000000是固定在芯片中,你必須用這兩個(gè)地址;基地址0x22000000用于操作內(nèi)置RAM,基地址0x42000000用于操作內(nèi)置外設(shè)。

STM32位定義
你可以才用先用__at來(lái)指定一個(gè)變量的ARM地址
然后在定義,那么你在程序中就可以象51中一樣使用了,我就是這么定義的.
例:
unsigned long System_Mark[10]__attribute__((at(0x20000200)));//開(kāi)辟了10個(gè)32位的RAM來(lái)定義位標(biāo)志
#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)))

那么我在程序就中就可以對(duì):
Moter_State_Changed =1;/Moter_State_Changed =0/ if (Moter_State_Changed)
Moter_State_Changed =~Moter_State_Changed;Moter_State_Changed =!Moter_State_Changed;



關(guān)鍵詞: STM32別名

評(píng)論


技術(shù)專區(qū)

關(guān)閉