生活随笔
收集整理的這篇文章主要介紹了
OK6410裸机开发之LED灯
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
平臺:WinXP+eclipse+OpenJTAG
開發板:OK6410A?128M?DDR?1G?NandFlash
---------------------------------------------------------
PS:CSDN的貼圖功能太不人性化了,感覺好麻煩!
這段時間一直在翻看OK6410裸機開發的教程,現在準備自己動手寫一寫,并記錄下來調試過程和遇到的問題。
這一節是關于LED燈的操作,比較簡單,如同51單片機上開發流水燈一樣簡單。
1、建立工程
首先,我們建立一個項目,打開eclipse,file——>new——>C?Project,項目名稱寫入OK6410_LED,點擊下一步。
然后點擊Finish,我們就可以在左側的項目資源管理器中看見我們剛建立的工程了。
2、添加源代碼
建立好工程后,我們添加源代碼。一共有3個文件:start.S、led.c、Makefile
右鍵項目名稱——>new——>file,寫入start.S(下同)。
先來寫start.S,因為我們要通過start.S來跳入我們c函數的入口處
[plain]?view plaincopy
.globl?_start?? _start:?? ?????????????????????????????????????????????????????? ????/*?Peri?port?setup?*/?? ????ldr?r0,?=0x70000000?? ????orr?r0,?r0,?#0x13?? ????mcr?p15,0,r0,c15,c2,4???????@?256M(0x70000000-0x7fffffff)?? ?????????????????????????????????????????????????????? ????/*?Disable?Watchdog?*/?? ????ldr?r0,?=0x7E004000?????????@看門狗寄存器地址為0x7E004000?? ????mov?r1,?#0?? ????str?r1,?[r0]????????????????@往看門狗寄存器寫入0,關閉看門狗,否則板子會不斷重啟?? ?????????????????????????????????????????????????????? ????/*?設置棧?*/?? ????ldr?sp,?=8*1024?????????????@此時棧大小不能大于8K,因為現在可用的內存只有8K??????????????????????????????????????????????????????????@NAND?Flash中的代碼在復位后會移到SRAM中,而SRAM只有8K大小?? ?????????????????????????????????????????????????????? ????bl?main?????????????????????@跳入C程序的main函數處執行?? halt:?? ????b?halt??
接下來寫Led.c
首先我們看一下OK6410開發板的原理圖,發現LED1-4燈分別對應GPM0-3,找到控制LED燈的引腳,那么我們就可以寫程序來控制它們了。
?
打開6410手冊,找到GPM的相關寄存器,如下圖:
我們先來看配置寄存器,既然要控制LED燈的亮滅,那么就得把GPM0-3設為輸出。
即:rGPMCON?=?0x1111;
接下來看上拉/下拉設置寄存器,根據原理圖,我們不需要設置上拉、下拉,所以設置為禁止上/下拉。
即:rGPMPUD?=?0x00;
最后就是用高低電平來控制LED亮滅了。
rGPMDAT?=?0x1F;//4個LED燈都亮
下面是led.c的完整代碼:
[cpp]?view plaincopy
? ? ? ? ? ? ? ? ? ? ? ?? ???????????????????????????????????????? ???????????????????????????????????????? #define?rGPMCON??????????(*(volatile?unsigned?*)(0x7F008820))?? #define?rGPMDAT??????????(*(volatile?unsigned?*)(0x7F008824))?? #define?rGPMPUD??????????(*(volatile?unsigned?*)(0x7F008828))?? ???????????????????????????????????????? ???????????????????????????????????????? ???????????????????????????????????????? void?msDelay(int?time)?? {?? ????????volatile?unsigned?int?i,j;?? ????????for(i?=?0;?i?<?2000000;?i++)?? ????????????for(j=0;?j<time;?j++);?? }?? ???????????????????????????????????????? ???????????????????????????????????????? void?GPIO_Init(void)?? {?? ????rGPMCON??=?0x11111;?? ????rGPMPUD??=?0x00;?? ????rGPMDAT??=?0X1F;?? }?? ???????????????????????????????????????? void?LedTest(void)?? {?? ????volatile?unsigned?int?i;?? ????while?(1)?? ????{?? ????????for(i=0;?i<4;?i++)?? ????????{?? ????????????rGPMDAT??=?~(1<<i);?? ????????????msDelay(10);?? ????????}?? ???????????????????????????????????????? ????}?? }?? int?main(void)?? {?? ????GPIO_Init();?? ????LedTest();?? ????return?0;?? }??
最后我們來搞定Makefile文件:
[cpp]?view plaincopy
all:led.bin?? led.bin:?start.o?led.o?? ????arm-elf-ld?-Ttext?0?-o?led.elf?start.o?led.o?? ????arm-elf-objcopy?-O?binary?led.elf?led.bin?? ????arm-elf-objdump?-D?led.elf?>?led.dis???? ????????????????????????????????????????? start.o?:?start.S?? ????arm-elf-gcc?-g?-o?start.o?start.S?-c???? ????????????????????????????????????????? led.o?:?led.c?? ????arm-elf-gcc?-g?-o?led.o?led.c?-c???? ????????????????????????????????????????? clean:?? ????rm?*.o?led.elf?led.bin?led.dis??
注意:在arm-elf-gcc后面一定要記得帶上-g參數,不然我們無法進行調試的。還有就是最好不要在編譯代碼是添加優化選項,即-O參數,優化以后,反匯編代碼和源代碼就不對應了,對于調試來說是個麻煩。
3、編譯程序
下面我們來進行編譯,右鍵項目名稱,點擊Build?Project,完成后如下圖,在左邊會多出幾個文件。
4、調試程序
點擊Debug調試按鈕,彈出對話框,按圖片上的步驟操作,在Main標簽中的C/C++?Application中填入生成的elf文件的存放路徑。
點擊Debugger標簽,在GDB?common?file中填入6410初始化文件s3c6410_gdb.init,這個文件網上應該可以搜到。
接著在command標簽中填入
load
break?main
c
然后我們打開OpenJTAG?GUI,連接開發板。
一切OK后,我們點擊Debug按鈕,就可以進行源碼調試了。
貼圖貼的我好累,好多都是一些eclipse的使用,后面的章節就不貼這部分的圖了。
總結
以上是生活随笔為你收集整理的OK6410裸机开发之LED灯的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。