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...