關於強制類型轉換和內存地址單位

關於強制類型轉換和內存地址單位

以stm32f10x官方庫中的 #define RCC ((RCC_TypeDef *) RCC_BASE)爲例說明

聲明時鐘寄存器組結構體RCC_TypeDef

typedef struct{
  __IO uint32_t CR;
  __IO uint32_t CFGR;
  __IO uint32_t CIR;
  __IO uint32_t APB2RSTR;
  __IO uint32_t APB1RSTR;
  __IO uint32_t AHBENR;
  __IO uint32_t APB2ENR;
   __IO uint32_t APB1ENR;
  __IO uint32_t BDCR;
  __IO uint32_t CSR;
} RCC_TypeDef;

將地址進行一系列偏移,使RCC_BASE 等於 0x40021000

#define PERIPH_BASE      ((uint32_t)0x40000000)
#define AHBPERIPH_BASE   (PERIPH_BASE + 0x20000)
#define RCC_BASE         (AHBPERIPH_BASE + 0x1000) 

將RCC_BASE所對應的16進制數(0x40021000)轉換成指針地址與RCC相對應,而這個地址指向的是RCC_TypeDef結構體類型的變量的首個元素*/

  #define RCC              ((RCC_TypeDef *) RCC_BASE)

RCC->CR等價於(*RCC).CR,此句將CR的值賦值爲32位整數0x00000001 */
C語言中內存地址以字節爲單位,結構體中的首個元素對應結構體的首地址,其後元素地址偏移0x04

RCC->CR |= (uint32_t)0x00000001;

執行結果:將0x40021000的地址中的位0存入1。

RCC->CFGR &= (uint32_t)0xF0FF0000;  /*對應的二進制數爲(1111 0000 1111 1111 0000 0000 0000 0000)*/

執行結果:將0x40021004的地址中的位0-15和位24-27存入0。

文中代碼爲STM32官方庫文件中摘取
可對照STM32中文參考手冊的寄存器說明查看具體設置

內存地址單位與地址偏移

在計算機中最小的信息單位是一個二進制位(bit),8個位組成一個字節(Byte),中央處理器(CPU)一次處理的數據長度稱爲字(word)。如:8位機的字長是八位,16位機的字長是16位,32位機的字長是32位,通常寄存器的位數等於字長。單片機對寄存器的數據以字節爲單位進行處理,地址編排是一個字節一個地址,稱爲字節尋址,即一次存儲或者讀取一個Byte。

內存地址的單位是字節是由內存的物理構造決定的,一個內存是由若干個黑色的內存顆粒構成,每一個內存顆粒叫做一個chip,每一個chip中包含8個bank,bank內部爲電容的行列矩陣結構,(二維矩陣中每一個元素一般存儲8個bit,即包含8個小電容),通過內存的物理結構可以看出內存的最小的單位就是字節。
原文地址:https://www.jianshu.com/p/bc8252f18ecf?tdsourcetag=s_pcqq_aiomsg

STM32單片機的寄存器爲32位,需要32bit變量來爲其賦值,因此在結構體中要申明佔有32bit的uint32_t(無符號的32位整形變量)元素,對應4個字節,因爲字節尋址機制,這4個字節的數據需要4個地址單位,所以結構體中其後的元素地址爲前一元素地址的基礎上加0x04。

自學新手,個人總結,如有出入,請多指教!

發佈了13 篇原創文章 · 獲贊 2 · 訪問量 2026
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章