STM32 位段詳解

1 定義

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

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

位帶:CortexM3參考手冊使用的優化

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

 

因此說,位段和位帶是一個意思,是不一樣手冊的不一樣叫法。指針

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

2 位帶操做

2.1 範圍

位帶是有範圍的,並非CortexM3所有地址空間都支持的。在 CM3中,有兩個區中實現了位帶。其中一個是 SRAM 區的最低 1MB 範圍,第二個則是片內外設區的最低 1MB 範圍。這兩個區中的地址除了能夠像普通的 RAM 同樣使用外,它們還都有本身的「位帶別名區」,位帶別名區把每一個比特膨脹成一個 32 位的字。當你經過位帶別名區訪問這些字時,就能夠達到訪問原始比特的目的。對象

支持位帶操做的兩個內存區的範圍是:blog

 

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 密集型的底層程序最有用處了

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

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

一、讀取整個寄存器

二、掩蔽不須要的位

三、比較並跳轉

使用位帶操做後

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

二、比較並跳轉

固然,對於寫入操做也從4步精簡到3步

 

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

相關文章
相關標籤/搜索