stm32--位帶基本操作
支持了位帶操作后央碟,可以使用普通的加載/存儲(chǔ)指令來(lái)對(duì)單一的比特進(jìn)行讀寫(xiě)。在CM3中均函,有兩個(gè)區(qū)中實(shí)現(xiàn)了位帶亿虽。其中一個(gè)是 SRAM 區(qū)的最低 1MB 范圍,第二個(gè)則是片內(nèi)外設(shè)區(qū)的最低 1MB范圍苞也。這兩個(gè)區(qū)中的地址除了可以像普通的 RAM 一樣使用外洛勉,它們還都有自己的“位帶別名區(qū)”,位帶別名區(qū)把每個(gè)比特膨脹成一個(gè) 32 位的字如迟。當(dāng)你通過(guò)位帶別名區(qū)訪問(wèn)這些字時(shí)收毫,就可以達(dá)到訪問(wèn)原始比特的目的攻走。位帶操作的概念其實(shí) 30 年前就有了,那還是8051?單片機(jī)開(kāi)創(chuàng)的先河此再,如今昔搂,CM3將此能力進(jìn)化,這里的位帶操作是 8051 位尋址區(qū)的威力大幅加強(qiáng)版输拇。CM3使用如下術(shù)語(yǔ)來(lái)表示位帶存儲(chǔ)的相關(guān)地址:位帶區(qū):支持位帶操作的地址區(qū)位帶別名:對(duì)別名地址的訪問(wèn)最終作用到位帶區(qū)的訪問(wèn)上(這中途有一個(gè)地址映射過(guò)程)在位帶區(qū)中摘符,每個(gè)比特都映射到別名地址區(qū)的一個(gè)字——這是只有 LSB 有效的字。當(dāng)一個(gè)別名地址被訪問(wèn)時(shí)策吠,會(huì)先把該地址變換成位帶地址逛裤。對(duì)于讀操作,讀取位帶地址中的一個(gè)字奴曙,再把需要的位右移到 LSB别凹,并把 LSB 返回。對(duì)于寫(xiě)操作洽糟,把需要寫(xiě)的位左移至對(duì)應(yīng)的位序號(hào)處炉菲,然后執(zhí)行一個(gè)原子的“讀-改-寫(xiě)”過(guò)程。
支持位帶操作的兩個(gè)內(nèi)存區(qū)的范圍是:0x2000_0000‐0x200F_FFFF(SRAM 區(qū)中的最低 1MB)0x4000_0000‐0x400F_FFFF(片上外設(shè)區(qū)中的最低 1MB)對(duì) SRAM 位帶區(qū)的某個(gè)比特坤溃,記它所在字節(jié)地址為 A,位序號(hào)為 n(0<=n<=7)拍霜,則該比特在別名區(qū)的地址為:? ?? ?? ?? ???AliasAddr=0x22000000+((A-0x20000000)*8+n)*4=0x22000000+(A-0x20000000)*32+n*4對(duì)于片上外設(shè)位帶區(qū)的某個(gè)比特,記它所在字節(jié)的地址為 A,位序號(hào)為 n(0<=n<=7)薪介,則該比特在別名區(qū)的地址為:? ?? ?? ?? ???AliasAddr=0x42000000+((A-0x40000000)*8+n)*4=0x42000000+(A-0x40000000)*32+n*4上式中祠饺,“*4”表示一個(gè)字為 4 個(gè)字節(jié),“*8”表示一個(gè)字節(jié)中有 8 個(gè)比特汁政。
這里再不嫌啰嗦地舉一個(gè)例子:1.在地址 0x20000000 處寫(xiě)入 0x3355AACC2.讀取地址0x22000008道偷。本次讀訪問(wèn)將讀取 0x20000000,并提取比特 2记劈,值為 1勺鸦。3.往地址 0x22000008 處寫(xiě) 0。本次操作將被映射成對(duì)地址 0x20000000 的“讀-改-寫(xiě)”操作(原子的)目木,把比特2 清 0换途。4.現(xiàn)在再讀取 0x20000000,將返回 0x3355AAC8(bit[2]已清零)刽射。位帶別名區(qū)的字只有 LSB 有意義军拟。另外,在訪問(wèn)位帶別名區(qū)時(shí)誓禁,不管使用哪一種長(zhǎng)度的數(shù)據(jù)傳送指令(字/半字/字節(jié))懈息,都把地址對(duì)齊到字的邊界上,否則會(huì)產(chǎn)生不可預(yù)料的結(jié)果摹恰。