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 有意義,另外,在訪問位帶別名區時,不管使用哪一種長度的資料傳送指令(字/半字/位元組),都把地址對齊到字的邊界上,否則會產生不可預料的結果,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/183734.html
標籤:python
上一篇:華為設備遠程登錄設定
