1. 程式人生 > >STM32學習筆記(2):儲存器對映和儲存器重對映(Memory Map and Memory Remap)

STM32學習筆記(2):儲存器對映和儲存器重對映(Memory Map and Memory Remap)

“對映”一詞首先是在數學中接觸到的,在認識儲存器對映或儲存器重對映前先回顧一下數學中對對映一詞的解釋。
對映的定義:如果集合A中的每個元素在對應法則f的作用下,在集合B中都有唯一的一個元素與它對應,那麼集合A,B及對應法則f稱為集合A到集合B的一個對映,記作f : A→B
在對映f : A→B中,與A中的元素a對應的B中的元素b叫做a的象,a叫做b的原象。對應法則f、集合A及集合B稱為對映的三要素。
從對映的定義可以看出,對映是“一對一”或“多對一”的對應關係。微機中的“多對一”關係就是重對映。
從數學中對映的定義可以看出,要弄清楚儲存器的對映或重對映前,需要找出儲存器對映的三要素

儲存器本身並沒有地址資訊,它的地址是由晶片廠商分配好的,一般不可修改。給儲存器編址的過程(CPU對晶片中或晶片外的FLASH、RAM、外設、BOOTBLOCK等進行編址,地址統一編入儲存器中)稱為儲存器對映,也稱為儲存器地址對映。其中,對映到埠暫存器的儲存器單元(或儲存器空間)稱為儲存器對映暫存器,其地址(或地址空間)稱為儲存器對映暫存器地址(或儲存器對映暫存器地址空間)。

所以,對應法則f是儲存器對映暫存器地址,集合A是儲存器,集合B是外設暫存器。(外設有私有外設、片上外設及片外裝置這三種外設,其中,片上外設有GPIO埠 、ADC、 TIM、 SPI、 USART、CAN、I2C等,私有外設有NVIC等。CPU通過儲存器對映方式對這些功能模組進行統一編址,使得CPU通過訪問記憶體單元達到對外設暫存器的訪問)。所以它們構成的對映

為:儲存器對映暫存器地址:儲存器儲存單元→外設暫存器(或 儲存器對映暫存器地址空間:儲存器儲存空間→外設暫存器),即儲存器到外設暫存器的對映。

那麼,重對映就是CPU將外設暫存器重複編址到儲存器的過程,也就是某一個外設暫存器在儲存器裡被映射了多個地址空間。

實際上,真實的外設暫存器在物理上不屬於儲存器。由於真實的外設暫存器與其對應的儲存器對映暫存器是通過線路相互連線的,所以,邏輯上外設暫存器屬於儲存器。並且,真實的外設暫存器中的內容與儲存器對映暫存器中的內容在任何時候都是相同的。

用片上外設中的IO埠暫存器舉個例子:一個IO埠的埠位x在儲存器中有2個被對映的儲存單元A和B,儲存單元A的地址為m,儲存單元B的地址為n。這樣,通過地址m訪問A可以達到訪問B,最終實現訪問IO埠位x。同樣地,通過地址n訪問B可以達到訪問A的目的,最終實現訪問IO埠位x。也就是說儲存單元A的內容變化了,那麼儲存單元B和埠位x的內容也就跟隨著A變化成相同的值,同樣地,A和埠位x也會跟隨著B變化而變化,並且A、B及埠位x中的內容始終相同。

在一些核心處理器預定義的儲存器對映中,如Cortex-M3/M4核心,有兩個核心預定義儲存空間“位帶區和位帶別名區”就是儲存器的重對映的結果。由於通過位帶操作訪問位帶別名區來訪問位帶區的單個數據位,所以,常常將它們相互對映關係稱為“位帶別名區到位帶區的對映”。

儲存器對映的意義:I/O埠有兩種編址方式,即I/O埠與儲存器統一編址和I/O埠與儲存器獨立編址。I/O地址空間和儲存器地址空間是兩個不同的物理空間,C/C++等高等語言中沒有訪問IO埠的指令(除非有專門的訪問IO的彙編核心指令或者編譯器提供的專門訪問IO的函式),不過C/C++語言具有對絕對地址(或實體地址)的單元內容讀寫的能力,也就是說具有直接訪問實體地址的能力,它是以指標方式訪問實體地址單元內容的。所以,若採用I/O埠與儲存器統一編址的方式,將儲存器空間對映給IO空間,那麼就可以通過訪問儲存器實現對IO的訪問。
注:實體地址/絕對地址指對儲存器編址後儲存單元的地址。