OK6410裸机开发之LED灯

来源:互联网 发布:烟雨江南 知乎 编辑:程序博客网 时间:2024/04/30 04:13

平台:WinXP+eclipse+OpenJTAG

开发板:OK6410A 128M DDR 1G NandFlash

---------------------------------------------------------

PS:CSDN的贴图功能太不人性化了,感觉好麻烦!

这段时间一直在翻看OK6410裸机开发的教程,现在准备自己动手写一写,并记录下来调试过程和遇到的问题。

这一节是关于LED灯的操作,比较简单,如同51单片机上开发流水灯一样简单。

1、建立工程

首先,我们建立一个项目,打开eclipsefile——>new——>C Project,项目名称写入OK6410_LED,点击下一步。


然后点击Finish,我们就可以在左侧的项目资源管理器中看见我们刚建立的工程了。

2、添加源代码

建立好工程后,我们添加源代码。一共有3个文件:start.Sled.cMakefile

右键项目名称——>new——>file,写入start.S(下同)。

先来写start.S,因为我们要通过start.S来跳入我们c函数的入口处

[plain] view plaincopy
  1. .globl _start  
  2. _start:  
  3.                                                       
  4.     /* Peri port setup */  
  5.     ldr r0, =0x70000000  
  6.     orr r0, r0, #0x13  
  7.     mcr p15,0,r0,c15,c2,4       @ 256M(0x70000000-0x7fffffff)  
  8.                                                       
  9.     /* Disable Watchdog */  
  10.     ldr r0, =0x7E004000         @看门狗寄存器地址为0x7E004000  
  11.     mov r1, #0  
  12.     str r1, [r0]                @往看门狗寄存器写入0,关闭看门狗,否则板子会不断重启  
  13.                                                       
  14.     /* 设置栈 */  
  15.     ldr sp, =8*1024             @此时栈大小不能大于8K,因为现在可用的内存只有8K                                                          @NAND Flash中的代码在复位后会移到SRAM中,而SRAM只有8K大小  
  16.                                                       
  17.     bl main                     @跳入C程序的main函数处执行  
  18. halt:  
  19.     b halt  


接下来写Led.c

首先我们看一下OK6410开发板的原理图,发现LED1-4灯分别对应GPM0-3,找到控制LED灯的引脚,那么我们就可以写程序来控制它们了。

 

打开6410手册,找到GPM的相关寄存器,如下图:

我们先来看配置寄存器,既然要控制LED灯的亮灭,那么就得把GPM0-3设为输出。

即:rGPMCON = 0x1111;

接下来看上拉/下拉设置寄存器,根据原理图,我们不需要设置上拉、下拉,所以设置为禁止上/下拉。

即:rGPMPUD = 0x00;

最后就是用高低电平来控制LED亮灭了。

rGPMDAT = 0x1F;//4LED灯都亮

下面是led.c的完整代码:

[cpp] view plaincopy
  1. /************************************************************************************** 
  2. * 
  3. *   File Name : Led.c 
  4. * 
  5. *   File Description : OK6410流水灯. 
  6. * 
  7. *   Author : 踏雪059 
  8. *   Dept. : HackSnow 
  9. *   Created Date : 2013/1/15 
  10. *   Version : 1.0 
  11. * 
  12. **************************************************************************************/  
  13.                                         
  14.                                         
  15. #define rGPMCON          (*(volatile unsigned *)(0x7F008820))  
  16. #define rGPMDAT          (*(volatile unsigned *)(0x7F008824))  
  17. #define rGPMPUD          (*(volatile unsigned *)(0x7F008828))  
  18.                                         
  19.                                         
  20.                                         
  21. void msDelay(int time)  
  22. {  
  23.         volatile unsigned int i,j;  
  24.         for(i = 0; i < 2000000; i++)  
  25.             for(j=0; j<time; j++);  
  26. }  
  27.                                         
  28.                                         
  29. void GPIO_Init(void)  
  30. {  
  31.     rGPMCON  = 0x11111;  
  32.     rGPMPUD  = 0x00;  
  33.     rGPMDAT  = 0X1F;  
  34. }  
  35.                                         
  36. void LedTest(void)  
  37. {  
  38.     volatile unsigned int i;  
  39.     while (1)  
  40.     {  
  41.         for(i=0; i<4; i++)  
  42.         {  
  43.             rGPMDAT  = ~(1<<i);  
  44.             msDelay(10);  
  45.         }  
  46.                                         
  47.     }  
  48. }  
  49. int main(void)  
  50. {  
  51.     GPIO_Init();  
  52.     LedTest();  
  53.     return 0;  
  54. }  


最后我们来搞定Makefile文件:

[cpp] view plaincopy
  1. all:led.bin  
  2. led.bin: start.o led.o  
  3.     arm-elf-ld -Ttext 0 -o led.elf start.o led.o  
  4.     arm-elf-objcopy -O binary led.elf led.bin  
  5.     arm-elf-objdump -D led.elf > led.dis    
  6.                                          
  7. start.o : start.S  
  8.     arm-elf-gcc -g -o start.o start.S -c    
  9.                                          
  10. led.o : led.c  
  11.     arm-elf-gcc -g -o led.o led.c -c    
  12.                                          
  13. clean:  
  14.     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的使用,后面的章节就不贴这部分的图了。

0 0