STM32 位段詳解


1 定義

首先需要明確下,位段,位帶和別名區這三個名詞

位段:STM32用戶參考手冊使用的名字

位帶:CortexM3參考手冊使用的

別名區:地址總線上用來位訪問地址區域,

 

所以說,位段和位帶是一個意思,是不同手冊的不同叫法。

由上述的名詞解釋得知,位帶功能並不是STM32獨有的,是CortexM3的功能(CortexM4也有這樣的功能)。MCS51有位操作,以一位(bit)為數據對象的操作,MCS51可以簡單的將P1口的第2位獨立操作:P1.2=0;P1.2=1 ;這樣就把P1口的第三個腳(bit2)置0置1。而STM32的位段、位帶別名區最重要的就為了實現這樣的功能。

2 位帶操作

2.1 范圍

位帶是有范圍的,並不是CortexM3全部地址空間都支持的。在 CM3中,有兩個區中實現了位帶。其中一個是 SRAM 區的最低 1MB 范圍,第二個則是片內外設區的最低 1MB 范圍。這兩個區中的地址除了可以像普通的 RAM 一樣使用外,它們還都有自己的“位帶別名區”,位帶別名區把每個比特膨脹成一個 32 位的字。當你通過位帶別名區訪問這些字時,就可以達到訪問原始比特的目的。

支持位帶操作的兩個內存區的范圍是:

 

0x2000_0000‐0x200F_FFFF(SRAM 區中最低1MB區域)

0x4000_0000‐0x400F_FFFF(片上外設區中的最低 1MB)

 

2.2 位帶操作

對 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 個比特。

2.3代碼實現

把“位帶地址+位序號”轉換別名地址宏為:

#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000 + ((addr &0xFF FFF)<<5) + (bitnum<<2))

把該地址轉換成一個指針:

#define MEM_ADDR(addr, bitnum) *((volatile unsigned long *)((addr & 0xF0000000)+0x2000000 + ((addr &0xFF FFF)<<5) + (bitnum<<2)))

其中

addr的取值范圍:

0x2000_0000‐0x200F_FFFF

0x4000_0000‐0x400F_FFFF

注意:addr取值要32位對齊

bitnum的取值范圍:0-31

 

解析:

(addr & 0xf0000000) + 0x02000000:

區分SRAM還是外設,如果是外設,結果為4,再加0x2000000就等於0x4200000,0x42000000就是外設別名位帶區。如果是SRAM,結果為2,再加上0x2000000就等於0x22000000,0x22000000就是SRAM別名位帶區。

 

addr & 0x00ffffff:

屏蔽了最高2位,相當於減去0x20000000或者0x40000000。因為位帶區的有效范圍是1M,即0x100000,這樣子就做到了低6位有效。

 

<< 5:

等價於乘以32

 

<< 2:

等價於乘以4

 

特別提醒:

當你使用位帶功能時,要訪問的變量必須用 volatile 來定義。因為 C 編譯器並不知道同一個比特可以有兩個地址。所以就要通過 volatile,使得編譯器每次都如實地把新數值寫入存儲器,而不再會出於優化的考慮。

3 位段的優點

最容易想到的就是通過 GPIO 的管腳來單獨控制每盞 LED 的點亮與熄滅。另一方面,也對操作串行接口器件提供了很大的方便(典型如 74HC165,CD4094)。位帶操作可以把代碼縮小, 速度更快,效率更高,更安全。總之位帶操作對於硬件 I/O 密集型的底層程序最有用處了

位帶操作還能用來化簡跳轉的判斷。

當跳轉依據是某個位時,以前必須這樣做

1、讀取整個寄存器

2、掩蔽不需要的位

3、比較並跳轉

使用位帶操作后

1、從未帶別名區讀取狀態位

2、比較並跳轉

當然,對於寫入操作也從4步精簡到3步

 

點擊查看本文所在的專輯,STM32F207教程


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM