離找工作只有不到三個月的時間,為了複習嵌入式方面的知識,這裡會寫一系列的部落格,包含裸機,核心移植,驅動。為了督促自己遇到難點時不要放棄,這裡貼上一條《高質量程式設計指南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...