程式設計操控乙個硬體的步驟(以LED為例)

2021-08-28 07:17:18 字數 2151 閱讀 8638

首先我們需要明白的是:暫存器是操控硬體的api介面。我們如果想操控led是通過gpio來間接操控的,實質是操控soc的gpio的的暫存器,從而控制led這個硬體工作。

led本身有2個接線點,乙個是led的正極,乙個是led的負極。led這個硬體的功能就是點亮或者不亮,物理上想要點亮一顆led只需要給他的正負極上加正電壓即可。

我們可以看到,4顆led的接法是:正極接3.3v,負極接了soc上的乙個引腳(gpio),具體詳細接法是:

d22:gpj0_3

d23:gpj0_4

d24:gpj0_5

d25:pwmtout1(gpd0_1)    

要讓led亮起來必須要在led的正負極形成乙個電壓差。

以d22為例,由於與led的正極(d22)已經與vdd_io相連,說明我們只需要將led的負極(gpj0_3)設定為低電平,即可形成電壓差,從而驅動led點亮。【注意:led負極多了乙個470r的電阻,原因是當led通電瞬間,瞬時電流會很大,這個電阻存在的意義就是讓led通電時的瞬時電流降低,從而達到保護led的作用】

找到gpj0對應的部分,因為我們需要點亮gpj0_3~gpj0_5,所以需要將gpj0con[3]、gpj0con[4]、gpj0con[5]設定為輸出狀態。由下表可知,也就是設定對應的bit位為:0001

對於gpj0dat, (gpj0 data)。上面描述的解析是:當引腳配置為input/output模式時,暫存器的相應位和引腳的電平高低相對應。也就是當gpj0dat這個暫存器對應的bit等於1,意味著這個位是高電平;當gpj0dat這個暫存器對應的bit等於0,意味著這個位是低電平;

/*說明:這小段程式來自朱老師物聯網大講堂*/

#define gpj0con 0xe0200240

#define gpj0dat 0xe0200244

_start:

// 第一步:把所有引腳都設定為輸出模式,**不變

ldr r0, =0x11111111 // 從後面的=可以看出用的是ldr偽指令,因為需要編譯器來判斷這個數

ldr r1, =gpj0con // 是合法立即數還是非法立即數。一般寫**都用ldr偽指令

str r0, [r1] // 暫存器間接定址。功能是把r0中的數寫入到r1中的數為位址的記憶體中去

// 點亮led1,其他熄滅

ldr r0, =((0<<3) | (1<<4) | (1<<5))

ldr r1, =gpj0dat

str r0, [r1] // 把0寫入到gpj0dat暫存器中,引腳即輸出低電平,led點亮

程式解讀:操控gpj0con暫存器:

ldr r0, =0x11111111               注意標紅的三位1,這三個1是16進製制的(0x1=0b0001),這樣就已經將gpj0con[3]、gpj0con[4]、gpj0con[5]設定為輸出狀態。

程式解讀:操控gpj0dat暫存器,點亮nled1

ldr r0, =((0<<3) | (1<<4) | (1<<5))        

意思是(0<<3),把0寫入到gpj0dat暫存器中,引腳即輸出低電平,led點亮。用下圖來表述就是只要gpj0dat暫存器中gpj0_3這乙個bit對應的位置是0(低電平),即可點亮led1。

【關於sfr 的補充】

soc中有2類暫存器:通用暫存器和sfr

通用暫存器(arm中有37個):是cpu的組成部分,cpu的很多活動都需要通用暫存器的支援和參與。

sfr(special function register,特殊功能暫存器):不在cpu中,而存在於cpu的外設中,我們通過訪問外設的sfr來程式設計操控這個外設,這就是硬體程式設計控制的方法。

備註:這兩個暫存器的說明資料來自朱老師物聯網大講堂

乙個LED驅動的編寫

include include include include include include include include include include include define gpm4con 0x110002e0 volatile unsigned long baseaddr 0 位址...

梳理乙個產品的步驟

作為乙個平台 專案 負責人,必須要做到對產品有把控力,沒有人比你更熟悉它。列舉平台有幾個應用,包括未來的半到一年要做的應用。能夠明確每乙個產品是幹什麼的,解決什麼問題的!梳理出每乙個應用的主流程,並畫出來,能夠快速描述出來。梳理出每乙個應用的核心名詞,每乙個應用都會有比較內聚的名詞,如果是舊的系統基...

建立乙個物件的步驟

建立乙個物件的步驟 1.建立乙個物件的步驟 student s new student 1,student.class載入進記憶體 2,宣告乙個student型別引用s 3,在堆記憶體建立物件,4,給物件中屬性預設初始化值 5,屬性進行顯示初始化 定義類時可以直接在成員位置為屬性賦值,叫做顯式初始化...