stm32--位帶基本操作

2020-10-21 17:01:10

stm32--位帶基本操作

支援了位帶操作後,可以使用普通的載入/儲存指令來對單一的位元進行讀寫。在 CM3 中,有兩個區中實現了位帶。其中一個是 SRAM 區的最低 1MB 範圍,第二個則是片內外設區的最低 1MB範圍。這兩個區中的地址除了可以像普通的 RAM 一樣使用外,它們還都有自己的「位帶別名區」,位帶別名區把每個位元膨脹成一個 32 位的字。當你通過位帶別名區存取這些字時,就可以達到存取原始位元的目的。
       位帶操作的概念其實 30 年前就有了,那還是8051 微控制器開創的先河,如今,CM3 將此能力進化,這裡的位帶操作是 8051 位定址區的威力大幅加強版。
       CM3 使用如下術語來表示位帶儲存的相關地址:
              位帶區:支援位帶操作的地址區
              位帶別名:對別名地址的存取最終作用到位帶區的存取上(這中途有一個地址對映過程)
       在位帶區中,每個位元都對映到別名地址區的一個字——這是隻有 LSB 有效的字。當一個別名地址被存取時,會先把該地址變換成位帶地址。對於讀操作,讀取位帶地址中的一個字,再把需要的位右移到 LSB,並把 LSB 返回。對於寫操作,把需要寫的位左移至對應的位序號處,然後執行一個原子的「讀-改-寫」過程。

 

 

 

       支援位帶操作的兩個記憶體區的範圍是:
              0x2000_0000‐0x200F_FFFF(SRAM 區中的最低 1MB)
              0x4000_0000‐0x400F_FFFF(片上外設區中的最低 1MB)
       對 SRAM 位帶區的某個位元,記它所在位元組地址為 A,位序號為 n(0<=n<=7),則該位元在別名區的地址為:
              AliasAddr=0x22000000+((A-0x20000000)*8+n)*4=0x22000000+(A-0x20000000)*32+n*4
       對於片上外設位帶區的某個位元,記它所在位元組的地址為 A,位序號為 n(0<=n<=7),則該位元在別名區的地址為:
              AliasAddr=0x42000000+((A-0x40000000)*8+n)*4=0x42000000+(A-0x40000000)*32+n*4
       上式中,「*4」表示一個字為 4 個位元組,「*8」表示一個位元組中有 8 個位元。

       這裡再不嫌囉嗦地舉一個例子:
       1. 在地址 0x20000000 處寫入 0x3355AACC
       2. 讀取地址0x22000008。本次讀存取將讀取 0x20000000,並提取位元 2,值為 1。
       3. 往地址 0x22000008 處寫 0。本次操作將被對映成對地址 0x20000000 的「讀-改-寫」操作(原子的),把位元2 清 0。
       4. 現在再讀取 0x20000000,將返回 0x3355AAC8(bit[2]已清零)。
       位帶別名區的字只有 LSB 有意義。另外,在存取位帶別名區時,不管使用哪一種長度的資料傳送指令(字/半字/位元組),都把地址對齊到字的邊界上,否則會產生不可預料的結果。