才疏學淺,以下是我自己個人理解
乙個16進製制的位址對應乙個位元組->8bit
stm32中每個暫存器是32bit,所以乙個暫存器就跨越了4個16進製制的位址,取了四個位址中最小的那個作為該暫存器的位址
就像下面的圖,總共有4個32位暫存器,每個暫存器跨越了4個位址。
參考手冊中寫到:位段區將別名儲存器區中的每個字對映到位段儲存器區的乙個位。
以下是我對這種對映的理解。
這是參考手冊中給出的公式
下面的對映公式給出了別名區中的每個字是如何對應位帶區的相應位的:
bit_word_addr = bit_band_base + (byte_offset× 32) + (bit_number× 4)
其中:bit_word_addr是別名儲存器區中字的位址,它對映到某個目標位。
bit_band_base是別名區的起始位址。
byte_offset是包含目標位的位元組在位段裡的序號
bit_number是目標位所在位置(0-31)
這個公式可以改一改有助於理解
bit_word_addr = bit_band_base + (byte_offset× 8 + bit_number)× 4
這個公式也是我在理解過程中從別人的部落格中看來的
舉個例子
就設位段起始位址是0x2000 0000,要求出位段位址0x2000 0002的bit2在別名儲存區域對映的位址
那麼公式就是
bit_word_addr = 0x2000 0000 + ((0x2000 0002-0x2000 0000)x8+2)x4
bit_word_addr = 0x2000 0000 + 72
0x2000 0002-0x2000 0000)x8+2這一部分其實就是求出了0x2000 0002的bit2相對於0x2000 0000的bit0是第幾位,也就是兩者之間共有多少bit。
我之前糾結的就是為什麼是×4不是×32,主要是我理解錯了,畢竟我們需要求的是位段位址對應的暫存器中的某個位,對映之後對應到別名儲存區的位址。而不是對應到別名儲存區的第幾位。
畫個圖可能更容易直觀上的理解
位段區,位址0x2000 0000的bit0到bit3被對映到儲存區之後的樣子。等於是位段區的乙個位被放大成了32位,然後求出這個位在別名區的位址。我感覺對我來說理解成把位段區的乙個位對映成別名區的四個位址更容易讓我理解。
stm32位段操作SRAM
三個寫得很好的教程 乙個小例子 include stm32f10x.h define bitband addr,bitnum addr 0xf0000000 0x2000000 addr 0xfffff 5 bitnum 2 將實際位址對映為別名區位址 由於後面定義的a為u8變數,0 bitnum ...
STM32階段學習
這段時間主要學習了stm32的gpio的工作原理,學習運用了跑馬燈 蜂鳴器 按鍵輸入控制 跑馬燈led的初始化 蜂鳴器和按鍵輸入的初始化與led相同 需注意的是按鍵初始化時輸入設定應為gpio mode in,蜂鳴器和led的輸入設定為gpio mode out 對led和蜂鳴器進行高低電平的設定有...
STM32記憶體管理和mdk儲存段劃分
1.mdk下code,ro data,rw data,zi data這幾個段 code是儲存 的。ro data是儲存const常量和指令的。rw data是儲存初始化不為0的全域性變數和全域性陣列的。zi data是儲存未初始化的或初始化值為0的全域性變數和全域性陣列的。2.程式編譯完成後 fla...