對(duì)于STM32別名區(qū)的理解
2. 它有什么好處?
本文引用地址:http://m.butianyuan.cn/article/201611/322625.htm答1: 是這樣的,記得MCS51嗎? MCS51就是有位操作,以一位(BIT)為數(shù)據(jù)對(duì)象的操作,
答2:
//
//
//
//
//
//
//
//
// 支持位帶操作的兩個(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
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ū)寫入一個(gè)字具有對(duì)位段區(qū)的目標(biāo)位執(zhí)行讀-改-寫操作的相同效果。
在STM32F10x里,外設(shè)寄存器和SRAM都被映射到一個(gè)位段區(qū)里,這允許執(zhí)行單一的位段的寫和讀操作。
下面的映射公式給出了別名區(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)
下面的例子說明如何映射別名區(qū)中SRAM地址為0x20000300的字節(jié)中的位2:
0x22006008 = 0x22000000 + (0x300*32) + (2*4).
對(duì)0x22006008地址的寫操作和對(duì)SRAM中地址0x20000300字節(jié)的位2執(zhí)行讀-改-寫操作有著相同的效果。
讀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來指定一個(gè)變量的ARM地址
然后在定義,那么你在程序中就可以象51中一樣使用了,我就是這么定義的.
例:
unsigned long System_Mark[10]
#define System_Mark0
#define System_Mark0_OFFSET
#define Moter_State_Changed
#define Moter0_Direction
那么我在程序就中就可以對(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;
評(píng)論