結構體定義暫存器方法(很流行哦)

2021-06-18 21:25:59 字數 1484 閱讀 8677

arm暫存器數量之多,嘆為觀止!幸運的是,它都是以模組分布,再依託c語言的模組化程式設計,使用者就沒有必要記憶那麼多的暫存器名稱了!

拿lpc1114來說,微控制器內部模組有「模數轉換器adc模組」,「看門狗wdg模組」,「中斷模組nvic」,「串列埠uart模組」等等。

每個模組都有一些暫存器。

在51微控制器中,用串列埠傳送資料,會這樣寫:sbuf=0x88,如何正確的把0x88寫到名稱為sbuf的暫存器中,在51的暫存器位址定義檔案裡面,scon的位址這樣定義:sfr scon = 0x98。

同樣,lpc1114裡面也需要定義位址,由於lpc1114用純c語言編寫程式,所以不能用「偽c語言」sfr來定義位址了。

涉及到位址,肯定會用到指標,因為指標可以指向位址。

拿看門狗模組來舉例,結構體定義如下:

typedef struct

wdt_typedef

複製**

結構體定義了看門狗裡面一共有四個暫存器

基址定義如下:

#define wdt_base          (apb0_base + 0x04000)

#define apb0_base         (0x40000000ul)

#define wdt         ((wdt_typedef    *) wdt_base   )

在官網使用者手冊中指出:看門狗模組的四個暫存器位址分別為0x40004000,0x40004004,0x40004008,0x4000400c,如何正確的把暫存器位址放到這個地方,上面的語句就是實現方法。

看懂上面的語句,並不是十分困難,因為都是些c語言的基礎知識。(所以說,不管任何行業,高手並不是掌握了高深的技能,而是掌握了紮實的基礎!)

#define 在c語言中表示 :用define後面的詞代替這個詞後面的語句。

寫程式賦值的時候,我們會這樣寫:

wdt->tc = 80000;

那麼wdt就是:(wdt_typedef *)

(0x40000000ul

+ 0x04000) 即把上面的結構體位址定義為0x40004000,那麼裡面的4個暫存器位址就分別是:

mod = 0x40004000

tc= 0x40004004

feed=0x40004008

tv=0x4000400c

位址為什麼會遞增4?

請看前面的rw_en,r_en,w_en,分別是:

#define r_en   volatile uint32

#define w_en   volatile uint32

#define rw_en volatile uint32

uint32即四個位元組,所以位址會增加4。

「->」運算子用於指向結構體變數指標,當然也可以用「.」,如果用「.」,對於結構體指標,要這樣用:

(*wdt).tc = 80000;

用"->"和"."都可以,書寫正確就可以,都可以正常使用!

為了書寫方便,我們一般用「->」,而不用「.」

暫存器定義

暫存器是 處理器內的組成部分。暫存器是有限存貯容量的高速存貯部件,它們可用來暫存指令 資料和位址。在 處理器的控制部件中,包含的暫存器有指令暫存器 ir 和程式計數器 pc 在 處理器的算術及邏輯部件中,包含的暫存器有累加器 acc 暫存器是記憶體階層中的最頂端,也是系統獲得操作資料的最快速途徑。暫...

暫存器定義

arm程式設計 關於arm暫存器的巨集定義 gf86530430 136次 2008 8 27 請問各位大蝦 在arm的標頭檔案裡,對與暫存器的定義為什麼不跟51的一樣?如下 define rutxh0 volatile unsigned char 0x1d00020 define rutxh1 v...

8086暫存器結構

知道有點老,但對電腦的的學習有好處,可以看看。8086暫存器和標誌位如下 通用暫存器 高8位 低8位 暫存器為16位,可按位元組 8位 操作 7 0 7 0 ax ah al 累加器 bx bh bl 基址暫存器 cx ch cl 計數暫存器 dx dh dl 資料暫存器 段暫存器 15 16位 0...