嵌入式位址雜談

2021-10-22 08:48:41 字數 2021 閱讀 5959

最近對嵌入式中的位址有了更深入的認識,簡單記錄一下。

以stm32f103為例,在暫存器模板中我們都知道只要對暫存器簡單地進行賦值就可以完成流水燈等操作,那麼這些暫存器是怎麼封裝的呢?

首先,先通過一串的巨集定義確定了硬體的基位址,以stm32f103中的gpiob為例:

在stm32f10x.h這個標頭檔案中首先定義:

#define gpiob_base            (apb2periph_base + 0x0c00)

#define apb2periph_base (periph_base + 0x10000)

#define periph_base ((uint32_t)0x40000000)

這樣,gpiob_base的基位址就是0x40010c00,這和手冊中記錄的位址是一致的:

接著,是暫存器的定義。其實,向暫存器中寫值從本質上說就是往那個位址上賦值,只不過為了方便理解,程式設計師們把每個不同的位址給抽象成了不同的暫存器,還是以gpiob為例,手冊中有:

於是偏移量為000h開始的32位位址,這一塊被定義為gpiox_crl,偏移量為004h開始的32位位址,這一塊被定義位gpiox_crh,以此類推。

那麼有了手冊,我們在keil中是怎麼操作這些暫存器的呢?它們又是怎麼定義的呢?回到軟體,在stm32f10x_h中,有這樣的巨集定義:

#define gpiob               ((gpio_typedef *) gpiob_base)
typedef struct

gpio_typedef;

原來這是乙個結構體,這個結構體中的每個暫存器都是按照手冊中的順序排列的,每乙個暫存器都是32位的,這樣你就可以開始你熟悉的操作了,比如:

gpiob->crl&

=0xff0fffff;

gpiob->crl|

=0x00300000;

gpiob->odr|

=1<<5;

那麼可能又有人想問了,手冊中的暫存器的順序是定死的嗎?當然不是了,這是根據做晶元的時候設計人員的喜好決定的,比如拿我在fpga上移植的乙個cortex-m3核心的工程為例,我在給核心新增uart介面時,我這麼定義了一串暫存器:

if

(paddr[11:5]

== 7'h00) begin

case (paddr[4:2])

3'h0: read_mux_byte0 = reg_rx_buf;

3'h1: read_mux_byte0 =

},uart_status}

; 3'h2: read_mux_byte0 =

},reg_ctrl}

; 3'h3: read_mux_byte0 =

},intr_state}

; 3'h4: read_mux_byte0 = reg_baud_div[7:0]

; endcase

end

typedef struct

; __io uint32_t bauddiv; /*!

< offset: 0x010 baudrate divider register (r/w) */

} uart_typedef;

除這以外,當初還有乙個概念始終困擾著我,就是在i2c通訊中的位址。

在i2c通訊的寫控制中,首先寫的是i2c器件的位址,這個位址是i2c器件掛在i2c匯流排上的位址,然後傳送的暫存器位址,是暫存器在i2c器件的位置。

初識嵌入式 嵌入式開發概述

1 什麼是嵌入式技術 1 嵌入式軟體與非嵌入式軟體的區別?答 嵌入式軟體是結合作業系統之上做的開發 非嵌入式軟體是做的裸機開發。裸機 沒有作業系統 2 嵌入式開發與微控制器開發的區別?答 區別 是否有作業系統。拓展 答 優點 解決了軟體的移植性 解決了開發人員的能力的劃分問題。提供了豐富的網路協議 ...

如何學習嵌入式 嵌入式如何入門?

學習嵌入式,該學習什麼基本的知識呢?嵌入式如何入門?其次,應該對作業系統有所了解,這對你對硬體和軟體的理解,絕對有很大的幫助。應該把系統的管理理解一下,比如程序 執行緒,系統如何來分配資源的,系統如何來管理硬體的,當然,不是看書就能把這些理解透,如果不是一時能理解,沒關係,多看看,結合以後的專案經驗...

非嵌入式與嵌入式的區別

非嵌入式是通過軟體控制硬體,軟硬體之間直接聯絡來實現要求。但是一旦硬體發生改變軟體也要改變,為了降低這種偶合度過高的問題,出現了嵌入式。嵌入式在軟體和硬體之間新增了作業系統,軟體通過控制作業系統進而控制硬體,硬體發生改變並不會導致軟體也發生改變,這為軟體開發人員節約了很多時間,並且嵌入式能在已有的硬...