1. 程式人生 > >STM32入門系列-STM32外設地址對映

STM32入門系列-STM32外設地址對映

片上外設區分為四條匯流排,根據外設速度的不同,不同匯流排掛載著不同的外設,APB1掛載低速外設,APB2和AHB掛載高速外設。相應匯流排的最低地址我們稱為該匯流排的基地址,匯流排基地址也是掛載在該總線上的首個外設的地址。APB1匯流排的地址最低,因此片上外設就從這這個地址開始,也稱外設基地址。

匯流排基地址

    從儲存器對映那張圖的Block2可以看到,分為4大塊,每塊都有一個起始地址,這個起始地址就是基地址,然後到下一塊起始地址的時候就會和前一塊地址出現偏差,這個差值就是偏移量,即相對基地址的偏移量。如下圖所示。

 從上圖可以看到APB1匯流排基地址是0x4000 0000,相對外設基地址的偏移量是0,所以此匯流排也是外設Block2的基地址。

外設基地址

    每條總線上都會掛接著很多的外設,這些外設也會有自己的地址範圍,XXX 外設的首個地址即最低地址就是XXX外設的基地址,也稱作XXX邊界地址。有關STM32F1xx 外設的具體邊界地址可以參考《STM32F1xx 中文參考手冊》P28頁, 裡面有詳細的介紹。嵌入式物聯網智慧硬體等系統學習企鵝意義氣嗚嗚吧久零就易, 這裡我們就以GPIO外設來講解外設基地址。其他的外設也是同樣分析。GPIO外設基地址如下圖所示。

 從圖中可以知道,外設GPIOx都是掛接在APB2總線上,屬於高速的外設,而APB2匯流排的基地址是0x4001 0000,故GPIOA的相對APB2匯流排的地址偏移是800。

外設暫存器地址

    XXX外設的暫存器就分佈在其對應的外設地址範圍內。這裡我們以GPIO外設為例,GPIO是通用輸入輸出埠的簡稱,可以通過軟體來控制其輸入和輸出。GPIO有很多個暫存器,每一個都有特定的功能。每個暫存器為32bit,佔四個位元組,這些暫存器都是按順序依次排列在外設的基地址上。暫存器的位置都以相對該外設基地址的偏移地址來描述。這裡我們以GPIOC埠為例,來說明GPIO都有哪些暫存器,如下圖所示。

  這裡就以GPIOC_BSRR暫存器來教大家如何看《STM32F1xx 中文參考手冊》內暫存器的說明。 如果想要了解更多的暫存器內容, 可以參考《STM32F1xx中文參考手冊》相應暫存器外設部分。首先我們需要開啟參考手冊,找到GPIO外設章節,裡面會有一個GPIO暫存器,只要找到我們所要查詢的暫存器即可,如下圖所示。

  下面我們就對上圖進行分析,帶領大家這麼獲取其中的資訊。

    A.紅色框 4 表示的我們所查詢暫存器的名稱,暫存器GPIOx_BSRR內的x表示的是STM32GPIO埠,範圍是A-E,也就是說在GPIOA、GPIOB等埠中都有這個暫存器。

    B.紅色框5表示的是相對GPIOx地址的偏移值,比如現在我們使用的是GPIOC外設,其基地址是0x40011000,那麼本暫存器GPIOx_BSRR地址=0x40011000+0x10=0x40011010。對於其他的GPIO外設也是一個原理。

    C.紅色框6和7表示的是暫存器的位表。其中6表示暫存器編號,因為一個暫存器是32bit,所以範圍是0-31。7表示的是相應位的許可權,w:只寫,r:只讀,rw:可讀可寫。本暫存器位許可權是w,所以只能寫,如果試圖讀本暫存器,是無法保證讀取到它真正內容的。而有的暫存器位許可權為只讀,一般是用於表示STM32 外設的某種工作狀態的,由STM32硬體自動更改,通過讀取那些暫存器位來判斷外設的工作狀態。

    D.紅色框 8 是暫存器位功能說明。這個也是暫存器說明中最重要的部分,它詳細介紹了暫存器每一個位的功能。例如本暫存器中有兩種暫存器位,分別為BRy及BSy,其中的y數值表示的是管腳號,可以是0-15。如BR0、BS0用於控制GPIOx的第0個引腳,若 x 表示GPIOC,那就是控制GPIOC的第0引腳,而BR1、BS1就是控制GPIOC第1個引腳。

    其中BRy引腳的說明是“ 0:不會對相應的ODRx位執行任何操作;1:對相應ODRx位進行復位”。這裡的“復位”是將該位設定為0的意思,而“置位”表示將該位設定為1;說明中的ODRx是另一個暫存器的暫存器位,我們只需要知道ODRx位為1的時候,對應的引腳x輸出高電平,為0的時候對應的引腳輸出低電平即可。感興趣的可以查詢該暫存器GPIOx_ODR的說明來了解。

    所以,如果對BR0寫入“ 1”的話,那麼GPIOx的第0個引腳就會輸出“低電平”,但是對BR0寫入“0”的話,卻不會影響ODR0位,所以引腳電平不會改變。要想該引腳輸出“高電平”,就需要對“BS0”位寫入“1”,暫存器位BSy與BRy是相反的操作。