Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1056156
  • 博文数量: 573
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 66
  • 用 户 组: 普通用户
  • 注册时间: 2016-06-28 16:21
文章分类

全部博文(573)

文章存档

2018年(3)

2016年(48)

2015年(522)

分类: C/C++

2015-12-02 17:42:55

leds.c文件

点击(此处)折叠或打开

  1. #define GPBCON (*(volatile unsigned long *)0xA0000010)
  2. /*可以使用这个虚拟地址来访问,物理地址:0x56000010*/
  3. #define GPBDAT (*(volatile unsigned long *)0xA0000014)
  4. /*可以使用这个虚拟地址来访问,物理地址:0x56000014*/
  5. #define GPBUP (*(volatile unsigned long *)0xA0000018)
  6. /*可以使用这个虚拟地址来访问,物理地址:0x56000018*/

  7. #define GPB5_OUT (1<<(5*2))
  8. #define GPB6_OUT (1<<(6*2))
  9. #define GPB7_OUT (1<<(7*2))
  10. #define GPB8_OUT (1<<(8*2))

  11. #define GPB5_ON (~(1<<5))
  12. #define GPB6_ON (~(1<<6))
  13. #define GPB7_ON (~(1<<7))
  14. #define GPB8_ON (~(1<<8))

  15. #define GPB5_OFF (1<<5)
  16. #define GPB6_OFF (1<<6)
  17. #define GPB7_OFF (1<<7)
  18. #define GPB8_OFF (1<<8)

  19. /*
  20. *功能:延时函数
  21. *注意:static:静态函数,表明这个函数只在本文件有效,外部程序不能调用这个函数。
  22. * inline:内联函数:指示编译器插入一个函数的代码到调用者的代码中,也就是插入到实际上调用产生的地方。
  23. * 这样可以使得编译本文件时,wait嵌入到main中,编译结果中只有main一个函数,
  24. * 于是在连接时,main函数的地址就是连接文件制定的地址。
  25. * 而连接脚本文件mmu.lds中,指定了leds.o的运行时装载地址为0xB0004000.
  26. * 所以,在head.S中的“LDR PC, =0xB0004000”就是跳去执行main函数。
  27. */
  28. static inline void wait(volatile unsigned long num)
  29. {
  30.     int i = 0;
  31.     int j = 0;
  32.     for(i=0; i<100; i++)
  33.         for(j=0; j<num; j++);
  34. }


  35. int main(void)
  36. {
  37.     GPBCON = (GPB5_OUT | GPB6_OUT | GPB7_OUT | GPB8_OUT);
  38.     GPBUP = 0x1e0;
  39.     
  40.     test111();
  41.     test222();
  42.     
  43.     while(1)
  44.     {
  45.         GPBDAT = (GPB5_ON & GPB6_ON & GPB7_ON & GPB8_ON);
  46.         wait(1000);
  47.         GPBDAT = (GPB5_OFF | GPB6_OFF | GPB7_OFF | GPB8_OFF);
  48.         wait(1000);
  49.     }

  50.     return 0;
  51. }
crt0.S文件

点击(此处)折叠或打开

  1. @******************************************************************************
  2. @ File:crt0.S
  3. @ 功能:通过它转入C程序
  4. @******************************************************************************

  5. .text
  6. .global _start
  7. _start:
  8.             ldr r0, =0x53000000 @ WATCHDOG寄存器地址
  9.             mov r1, #0x0
  10.             str r1, [r0] @ 写入0,禁止WATCHDOG,否则CPU会不断重启
  11.             
  12.             ldr sp, =1024*4 @ 设置堆栈,注意:不能大于4k, 因为现在可用的内存只有4K
  13.                                         @ nand flash中的代码在复位后会移到内部ram中,此ram只有4K
  14.             bl main @ 调用C程序中的main函数
  15. halt_loop:
  16.             b halt_loop
makefile文件

点击(此处)折叠或打开

  1. leds.bin : crt0.S leds.c
  2.     arm-linux-gcc -Wall -O2 -g -c -o crt0.o crt0.S
  3.     arm-linux-gcc -Wall -O2 -g -c -o leds.o leds.c
  4.     arm-linux-ld -Ttext 0x0000000 -g crt0.o leds.o -o leds_elf
  5.     arm-linux-objcopy -O binary -S leds_elf leds.bin
  6.     arm-linux-objdump -D -m arm leds_elf > leds.dis
  7. clean:
  8.     rm -f leds.dis leds.bin leds_elf *.o

阅读(416) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~