一步步點亮LED之彙編點亮LED

2022-09-07 01:00:13 字數 3526 閱讀 1717

gpj0con埠一共有8個埠,分別記住:gpj0_0~gpj0_7;相關暫存器為gpj0con、gpj0dat

gpj0con暫存器中設定8個引腳的工作模式(32/8=4,每個引腳分到4位,譬如gpj0_0位bit0~bit3,我們就給=它寫入0001得到輸出模式)

1、需要控制的引腳:gpj0_3、gpj0_4、gpj0_5低電平亮,高電平滅。

2、gpj0con(0xe0200240):控制模式      

gpj0dat(0xe0200244):控制引腳資料

將led燈全部點亮

/*

*檔名:led.s

*描述:這是我們一步步點亮led燈的第乙個led程式**/

_start:

//第一步:把0x11111111寫入0xe0200240(gpjocon)位置

ldr r0, =0x11111111

//從後面的=號可以看出來是偽指令,因為需要編譯器來判

ldr r1, =0xe0200240

//定是合法立即數還是非法立即數,一般都是ldr偽指令

str r0, [r1] //

把r0中的數寫入r1為位址的記憶體中去

//第二步:把0x0寫入0xe0200244(gpj0dat)

ldr r0, =0x0

ldr r1, =0xe0200244

str r0, [r1]

//把0寫入r1(0xe0200244)中

b .

//寫了乙個死迴圈。逐行執行裸機程式直到斷電

編譯後得到led.bin燒錄到裸機中,就可以點亮led。

1、增加可讀性

由於上述**可讀性較差,過度依賴注釋,下面需要改進**,雖然可能增加**複雜度,但是可讀性增強

(1)運用巨集定義,把對應的記憶體位址和gpio名字繫結

(2)運用位操作,只亮中間乙個燈(位操作便於直**出哪位改動了)

#define gpj0c0n 0xe0200240

#define gpj0dat 0xe0200244.

global

_start

_start:

//第一步:把0x11111111寫入0xe0200240(gpjocon)位置

ldr r0, =0x11111111

//從後面的=號可以看出來是偽指令,因為需要編譯器來判

ldr r1, =gpj0c0n //

定是合法立即數還是非法立即數,一般都是ldr偽指令

str r0, [r1] //

把r0中的數寫入r1為位址的記憶體中去

//第二步:把0x0寫入0xe0200244(gpj0dat)

ldr r0, =(0x0)|(1

<<3)|(0

<<4)|(1

<<5

)   ldr r1, =gpj0dat

str r0, [r1]

//把0寫入r1(0xe0200244)中

b .

//寫了乙個死迴圈。逐行執行裸機程式直到斷電

2、led流水燈效果

(1)加入延時**

(2)加入迴圈

#define gpj0c0n 0xe0200240

#define gpj0dat 0xe0200244.

global

_start

_start:

//第一步:把0x11111111寫入0xe0200240(gpjocon)位置

ldr r0, =0x11111111

//從後面的=號可以看出來是偽指令,因為需要編譯器來判

ldr r1, =gpj0c0n //

定是合法立即數還是非法立即數,一般都是ldr偽指令

str r0, [r1] //

把r0中的數寫入r1為位址的記憶體中去

flash:

//第二步:閃爍效果

//點亮第乙個燈,延時

ldr r0, =(0

<<3)|(1

<<4)|(1

<<5

) ldr r1, =gpj0dat

str r0, [r1]

//把0寫入r1(0xe0200244)中

bl delay

//熄滅,延時

ldr r0, =(1

<<3)|(1

<<4)|(1

<<5

) ldr r1, =gpj0dat

str r0, [r1]

//把0寫入r1(0xe0200244)中

bl delay

//點亮第二個燈,延時

ldr r0, =(1

<<3)|(0

<<4)|(1

<<5

) ldr r1, =gpj0dat

str r0, [r1]

//把0寫入r1(0xe0200244)中

bl delay

//熄滅,延時

ldr r0, =(1

<<3)|(1

<<4)|(1

<<5

) ldr r1, =gpj0dat

str r0, [r1]

//把0寫入r1(0xe0200244)中

bl delay

//點亮第三個燈,延時

ldr r0, =(1

<<3)|(1

<<4)|(0

<<5

) ldr r1, =gpj0dat

str r0, [r1]

//把0寫入r1(0xe0200244)中

bl delay

//熄滅,延時

ldr r0, =(1

<<3)|(1

<<4)|(1

<<5

) ldr r1, =gpj0dat

str r0, [r1]

//把0寫入r1(0xe0200244)中

bl delay

b flash

b .

//寫了乙個死迴圈。逐行執行裸機程式直到斷電(由於上一行有迴圈,這行根本不會執行,也可以刪掉)

delay:

ldr r2, =900000

ldr r3, =0x0

delay_loop:

sub r2, r2, #

1cmp r2, r3

//cmp會影響z標誌位,如果r2=r3則z等於1,下一句eq就會成立

bne delay_loop

mov pc, lr

一步步點亮led之軟硬體分析

剩下的4顆led燈 正極接 3.3v,負極接soc的乙個引腳 d22 gpj0 3 d23 gpj0 4 d24 gpj0 5 d25 pwmtout1 gpd0 1 因此,為了點亮led,我們可以讓那些對應的引腳為低電平。下面開始分析軟體方面的問題。如何操控這些引腳為低電平?gpio是晶元的引腳,...

一步步點亮LED6 流水燈效果

1 流水燈原理分析 流水燈又叫跑馬燈,實現的效果就是 挨著的led依次點亮熄滅 同時只有1顆led亮的 2 流水燈編寫 使用迴圈 led1亮延時 led2亮延時 led3亮延時 迴圈 4 總結 跟著朱老師一步步做實驗根本不難。程式設計操控硬體的步驟 1 分析硬體工作原理 2 分析原理圖 3 分析資料...

一步步學彙編(九)call ret

一步步學彙編 九 call ret call和ret指令都是轉移指令,都修改ip,或同時修改cs和ip。經常被用來 實現子程式的設計。ret指令用棧中的資料,修改ip的內容,實現近轉移 retf指令用棧中的資料,修改cs和ip的內容,實現遠轉移 cpu執行ret指令時的操作 1 ip ss 16 s...