【初入電子坑之stm32篇(三)】位帶操作
前言
由暫存器程式設計我們可以知道,很多時候我們需要修改的值的其實只有單獨的某一位,那在stm32中怎麼實現對單獨一個位的操作呢?位帶操作!
問題討論範圍
什麼是位帶操作?
位帶操作有什麼意義?
怎麼進行位帶操作?
正文
位帶操作
位帶操作(也叫位段操作),可以理解為允許進行位操作的地帶。
由於底層電路設計的原因,stm32微控制器單次可操作的儲存單元是4Byte,所以想要進行位操作的話從邏輯上是行不通的。但是ST公司考慮到了這種使用者需求,在記憶體地址對映表中專門留出了一塊地址。這塊地址就被稱為了
位帶別名區
。
位帶別名區
的作用很簡單,它其實就是在記憶體對映表的基礎上做了二次對映。
既然你stm32單次操作最少只能控制4個Byte,那麼我們把1Bit當4Byte使用,其中只有最低位的1個Bit操作有效不就可以了嘛。
但不是所有記憶體地址都支援位帶操作的,所以支援位帶操作的記憶體地址也就被稱為了
位帶區
。
上圖就是支援位帶操作的區域示意圖,藍色和紫色的箭頭指向就是位帶區上的每一位進行二次對映後的記憶體地址區域。
我們對比下外設的地址對映表:
可以看到所有片上外設的地址都包含在內了。所以我們操作外設的時候都可以進行位帶操作。
位帶操作的意義
一開始看位帶操作的時候,有種雞肋的感覺。
原因有二:
騰出遠多於實際需要操作的外設、SRAM記憶體,只為了可以單獨操作極少部分記憶體的一個bit,這值得嗎?
官方既然給出了韌體庫庫函式可以對單獨的某一位進行修改,為什麼又還需要用位帶操作?
在查閱了很多資料後,得出了一個勉強可以說服自己的答案:
韌體庫的本質是呼叫已經封裝好的函式,而函式的執行效率比暫存器操作要慢。
而直接使用暫存器操作的話,會有些不便、容易出錯,所以位帶操作就是這兩者中的折中方案了。
我也不知道這個答案對不對,為了可能需要節省的效能而專門騰出辣麼多記憶體幹這件事真的值得嗎?也許是我太菜還沒不能理解它的珍貴之處吧。
2021年4月22日更新:
經網友提醒,之前說騰出辣麼多記憶體的說法有失嚴謹,因為記憶體地址對映表中的記憶體不是實際的物理記憶體,而是CPU能控制的記憶體範圍。從彙編的學習中,我們可以知道CPU可以控制的記憶體範圍是有限的,所以我還是不能理解騰出了辣麼多記憶體的意義。。。有那麼多記憶體預算乾點別的不香嘛。。。