生活随笔
收集整理的這篇文章主要介紹了
OK6410裸机开发之LED灯
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
平臺(tái):WinXP+eclipse+OpenJTAG
開(kāi)發(fā)板:OK6410A?128M?DDR?1G?NandFlash
---------------------------------------------------------
PS:CSDN的貼圖功能太不人性化了,感覺(jué)好麻煩!
這段時(shí)間一直在翻看OK6410裸機(jī)開(kāi)發(fā)的教程,現(xiàn)在準(zhǔn)備自己動(dòng)手寫(xiě)一寫(xiě),并記錄下來(lái)調(diào)試過(guò)程和遇到的問(wèn)題。
這一節(jié)是關(guān)于LED燈的操作,比較簡(jiǎn)單,如同51單片機(jī)上開(kāi)發(fā)流水燈一樣簡(jiǎn)單。
1、建立工程
首先,我們建立一個(gè)項(xiàng)目,打開(kāi)eclipse,file——>new——>C?Project,項(xiàng)目名稱(chēng)寫(xiě)入OK6410_LED,點(diǎn)擊下一步。
然后點(diǎn)擊Finish,我們就可以在左側(cè)的項(xiàng)目資源管理器中看見(jiàn)我們剛建立的工程了。
2、添加源代碼
建立好工程后,我們添加源代碼。一共有3個(gè)文件:start.S、led.c、Makefile
右鍵項(xiàng)目名稱(chēng)——>new——>file,寫(xiě)入start.S(下同)。
先來(lái)寫(xiě)start.S,因?yàn)槲覀円ㄟ^(guò)start.S來(lái)跳入我們c函數(shù)的入口處
[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?????????@看門(mén)狗寄存器地址為0x7E004000?? ????mov?r1,?#0?? ????str?r1,?[r0]????????????????@往看門(mén)狗寄存器寫(xiě)入0,關(guān)閉看門(mén)狗,否則板子會(huì)不斷重啟?? ?????????????????????????????????????????????????????? ????/*?設(shè)置棧?*/?? ????ldr?sp,?=8*1024?????????????@此時(shí)棧大小不能大于8K,因?yàn)楝F(xiàn)在可用的內(nèi)存只有8K??????????????????????????????????????????????????????????@NAND?Flash中的代碼在復(fù)位后會(huì)移到SRAM中,而SRAM只有8K大小?? ?????????????????????????????????????????????????????? ????bl?main?????????????????????@跳入C程序的main函數(shù)處執(zhí)行?? halt:?? ????b?halt??
接下來(lái)寫(xiě)Led.c
首先我們看一下OK6410開(kāi)發(fā)板的原理圖,發(fā)現(xiàn)LED1-4燈分別對(duì)應(yīng)GPM0-3,找到控制LED燈的引腳,那么我們就可以寫(xiě)程序來(lái)控制它們了。
?
打開(kāi)6410手冊(cè),找到GPM的相關(guān)寄存器,如下圖:
我們先來(lái)看配置寄存器,既然要控制LED燈的亮滅,那么就得把GPM0-3設(shè)為輸出。
即:rGPMCON?=?0x1111;
接下來(lái)看上拉/下拉設(shè)置寄存器,根據(jù)原理圖,我們不需要設(shè)置上拉、下拉,所以設(shè)置為禁止上/下拉。
即:rGPMPUD?=?0x00;
最后就是用高低電平來(lái)控制LED亮滅了。
rGPMDAT?=?0x1F;//4個(gè)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;?? }??
最后我們來(lái)搞定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參數(shù),不然我們無(wú)法進(jìn)行調(diào)試的。還有就是最好不要在編譯代碼是添加優(yōu)化選項(xiàng),即-O參數(shù),優(yōu)化以后,反匯編代碼和源代碼就不對(duì)應(yīng)了,對(duì)于調(diào)試來(lái)說(shuō)是個(gè)麻煩。
3、編譯程序
下面我們來(lái)進(jìn)行編譯,右鍵項(xiàng)目名稱(chēng),點(diǎn)擊Build?Project,完成后如下圖,在左邊會(huì)多出幾個(gè)文件。
4、調(diào)試程序
點(diǎn)擊Debug調(diào)試按鈕,彈出對(duì)話框,按圖片上的步驟操作,在Main標(biāo)簽中的C/C++?Application中填入生成的elf文件的存放路徑。
點(diǎn)擊Debugger標(biāo)簽,在GDB?common?file中填入6410初始化文件s3c6410_gdb.init,這個(gè)文件網(wǎng)上應(yīng)該可以搜到。
接著在command標(biāo)簽中填入
load
break?main
c
然后我們打開(kāi)OpenJTAG?GUI,連接開(kāi)發(fā)板。
一切OK后,我們點(diǎn)擊Debug按鈕,就可以進(jìn)行源碼調(diào)試了。
貼圖貼的我好累,好多都是一些eclipse的使用,后面的章節(jié)就不貼這部分的圖了。
總結(jié)
以上是生活随笔為你收集整理的OK6410裸机开发之LED灯的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。