JZ2440點燈程式

2021-08-02 06:48:59 字數 3446 閱讀 1530

離找工作只有不到三個月的時間,為了複習嵌入式方面的知識,這裡會寫一系列的部落格,包含裸機,核心移植,驅動。為了督促自己遇到難點時不要放棄,這裡貼上一條《高質量程式設計指南c++c語言》中的一段名言:如果放棄一次,那麼碰到下乙個挫折時我就會繼續放棄;如果堅持而成功,那麼碰到下乙個挑戰時我就會激勵自己再次取得成功

廢話不多說,直接開始貼上**

(1)純彙編寫的控制點亮led的**,總共兩個檔案,led.s彙編檔案,makefile檔案

led.s檔案

#define ledout   ((1<<12)|(1<<10)|(1<<8))

.text

.global _start

_start:

ldr r0,=0x56000050

ldr r1,=ledout

str r1,[r0]

ldr r0,=0x56000054

mov r1,#0x00000000

str r1,[r0]

mainloop:

b mainloop

makefile檔案

led.bin:led.s

arm-linux-gcc -g -c led.s -o led.o

arm-linux-ld -ttext 0x00000000 -g led.o -o led_elf

arm-linux-objcopy -o binary -s led_elf led.bin

clean:

rm -f led.bin led_elf *.o

從jz2440的原理圖中可以得知,led1,led2,led3分別接在了gpf4,gpf5,gpf6三個引腳上。

控制通用gpio引腳使用如下三個暫存器

gpxcon(gpio引腳控制暫存器):用它來配置引腳的功能(輸入,輸出,還是其他功能)

gpxdat(gpio資料暫存器):讀寫引腳狀態,當引腳作為輸入功能時,讀此暫存器可以知道引腳的電平是高或低,當引腳作為輸出是,寫此暫存器可以控制引腳的輸出電平。

gpxup暫存器:某位為1時,相應引腳內部無上拉電阻,為0時,內部有上拉電阻

在寫程式控制led時,首先應該是gpf埠的相應位為輸出功能(寫gpfcon),然後往gpf相應位輸出低電平(寫gpfdat)。

(2)c和彙編混合寫的點亮led的程式

led.s檔案

.text

.global _start

_start:

ldr r0 ,=0x56000010

mov r1,#0x00000000

str r1,[r0]

ldr sp,=1024*4 /*在呼叫c函式之前必須設定堆疊指標,這裡設定為steppingstone末尾處*/

bl main

halt_loop:

bl halt_loop

main.c檔案

#define gpfcon (*(volatile unsigned long *)0x56000050)

#define gpfdata (*(volatile unsigned long *)0x56000054)

#define out ((1<<12)|(1<<10)|(1<<8))

int main()

makefile檔案

ledc.bin:led.s main.c

arm-linux-gcc -g -c led.s -o led.o

arm-linux-gcc -g -c main.c -o main.o

arm-linux-ld -ttext 0x00000000 -g led.o main.o -o ledc_elf

arm-linux-objcopy -o binary -s ledc_elf ledc.bin

arm-linux-objdump -d -m arm ledc_elf > ledc.dis

clean:

rm ledc.bin ledc_elf ledc.dis *.o

(3)彙編混合c寫的按鍵控制led的程式

led_and_key.s檔案

#define watchdog 0x53000000

.text

.global _start

_start:

/*關看門狗*/

ldr r1,=watchdog

mov r0,#0x00000000

str r1,[r0]

/*設定堆疊指標*/

ldr sp,=1024*4 /*堆疊位置為steppingstone的末尾處*/

bl main

halt_loop:

b halt_loop

main.c檔案

#define gpfcon (*(volatile unsigned long *)0x56000050)

#define gpfdat (*(volatile unsigned long *)0x56000054)

#define gpgcon (*(volatile unsigned long *)0x56000060)

#define gpgdat (*(volatile unsigned long *)0x56000064)

#define gpf4_5_6_out ((0x01<<12)|(0x01<<10)|(0x01<<8))

#define gpf0_2_in (~((0x3<<4)&(0x3)))

#define gpg3_in (~(0x3<<6))

#define gpf4_5_6_off ((1<<4)|(1<<5)|(1<<6))

int main()

return 0;

}

makefile檔案

led_and_key.bin:led_and_key.s main.c

arm-linux-gcc -g -c led_and_key.s -o led_and_key.o

arm-linux-gcc -g -c main.c -o main.o

arm-linux-ld -ttext 0x00000000 -g led_and_key.o main.o -o led_and_key_elf

arm-linux-objcopy -o binary -s led_and_key_elf led_and_key.bin

arm-linux-objdump -d -m arm led_and_key_elf > led_and_key.dis

clean:

rm -f led_and_key.elf led_and_key.bin led_and_key.dis *.o

初學JZ2440之GPIO彙編點燈

剛拿到jz2440開發板熟悉了它的程式燒錄之後,我想大家的做法肯定都差不多,肯定是準備自己的程式設計之旅了,當然第乙個實驗肯定不能少了偉大 點燈實驗 點亮led非常簡單,為了養成良好的學習習慣,還是一步一步來。第一步 檢視硬體連線圖 不管是什麼板子,這個硬體原理圖肯定是你的板子廠商提供給你的 從我的...

JZ2440學習筆記

1.easyopenjtag工具用於為目標板初次燒寫u boot再合適不過了。2.燒寫核心和檔案系統使用tftp nfs,速度是很快的哦。toc 你好!這是你第一次使用markdown編輯器所展示的歡迎頁。如果你想學習如何使用markdown編輯器,可以仔細閱讀這篇文章,了解一下markdown的基...

JZ2440 系統時鐘

jz2440 系統時鐘。時鐘控制邏輯給整個晶元提供了三種時鐘。fclk 用於cpu核心 hclk 用於ahb匯流排上裝置,比如cpu核,儲存控制器,中斷控制器,lcd控制器,dma控制器,和usb主機模組,主要用於高效能模組 pclk 用於apb匯流排上裝置,比如watchdog,iis,i2c,p...