LED跑马灯实验笔记

来源:互联网 发布:js使用正则表达式 编辑:程序博客网 时间:2024/05/05 17:00

 

此总结是依照S3C2440总结。对于S3C2440LED接在CPU管脚图上有nLED_1nLED_2nLED_3nLED4。而他们分别对应的寄存器是GPB5GPB6GPB7GPB8,这里要说下GPB寄存器。PORT端口一共有GPA 25位输出端口、GPB 11位输入输出端口、GPC 16位输入输入端口、GPD 16位输入输出端口、GPE 16位输入输出端口、GPF 8位输入输入端口、GPG 16位输入输出端口、GPH 9位输入输出端口、GPJ 13位输入输出端口。这里不做细致总结。以后学到PORT再总结。先拿CPB为例。

端口控制寄存器GPBCON是用来设置输入输出属性的,GPBCON在手册中写的地址为0x56000010,端口数据寄存器GPBDAT的地址是0x56000014,端口上拉寄存器GPBUP的地址是0x56000018PBCON寄存器是从第0位到第10位的11位寄存器。每个位由2位二进制数表示,00表示输入状态,01表示输出状态,10表示功能引脚,11是保留的。输入状态是将数据写入状态寄存器的,而输出状态是将数据从数据寄存器中读出。我们想要让LED亮灭是将LED对应的位设置成10就可以了。对于端口上拉寄存器我对它还不是怎么了解,先将它的作用记一下吧。端口上拉寄存器用于控制每组端口的上拉电阻为禁止还是使能。如果为0,则是该引脚上拉电阻使能,为1则禁止,如果使能了,则不论引脚配置为那种功能上拉电阻都会起作用。现在对LEDCPU的连接应该有些了解了。应该开始写程序了。首先得写个引导程序。

  AREA |DATA|,CODE,READONLY

  ENTRY

  ldr r13, =0x1000

  IMPORT main

  b main

  END

群里有人说只写后面3行就可以。可是我试了下不好使,(不知道为什么我对ARM汇编不是很了解)总之对应跑马灯函数的主函数应该是main而且返回类型要求是int型的。贴出论坛上对此话的理解不错,看到那个=号就知道LDR是伪指令,用来解决mov之类或者ldr不能直接解决的问题,把这个问题留给汇编器来解决。LDR r13,=0x1000.看看0x1000内存4k的位置有些什么东西,r13一般表示为lr,程序跳转用的。似乎bootloader正好是4k的大小。

下面贴出我写的跑马灯的程序

#define GPBCON (*(volatile unsigned *)0x56000010)

#define GPBDAT (*(volatile unsigned *)0x56000014)

#define GPBUP (*(volatile unsigned *)0x56000018)

 

void delay(int x)

{

       int i,j;

       for(i=0;i<1000;i++)

              {

                     for(j=0;j<x;j++)

                            ;

              }

}

int main()

{

       GPBCON=0x3d57fc;//11 01 01 01 01 11 11 11 11 000位应该是蜂鸣器

       GPBDAT=0x3ff;//全置1LED灯灭

       GPBUP=0X000; //上啦电阻使能

       delay(300);

       while(1)

       {    

              GPBDAT=0xffdf;//5位为0让第一个LED

              delay(200);

              GPBDAT=0xffbf;//6位为0让第二个LED

              delay(200);

              GPBDAT=0xff7f;//7位为0让第三个LED

              delay(200);

              GPBDAT=0xfeff;//8位为0让第四个LED

              delay(200);

       }

       return 0;

}

程序写完了,烧到板子行了发现了个问题,就是没达到预期的效果。理想是12341234循环亮,但是真正的LED却是1234123如此循环亮。具体点是12341231234123灭的循环。while循环体中没有让灯全灭竟然出现了全灭的状态。而在while循环外面有个delay函数delay值钱灯是全灭的这样可以想到程序并不是循环的执行while中的语句,而是过一段时间就重新执行。这是什么原因呢?我还不了解。和群里人讨论了一下,好像是因为看门狗没关导致的,现在我的实力还不能确定是不是这样。还等我继续学习再发现吧。

原创粉丝点击