zoukankan      html  css  js  c++  java
  • S5PV210_流水灯

    1、整体思路:把相应的配置数据写入相应的寄存器,控制GPIO电平(Led.s)——运用工程管理Makefile编译、链接文件(由Led.s编译得到led.bin,该文件用于USB启动方式点亮LED,若使用SD卡方式启动LED,则需要添加mkv210_image.c,使用gcc编译得到可执行程序mkmini210,然后通过执行mkmini210程序由led.bin加工得到210.bin)

    2、所需文件:led.s、mkv210_image.c、Makefile

    3、led.s

     1 /*
     2  * 文件名:    led.s    
     3  * 描述:    流水灯
     4  */
     5 
     6 #define GPJ0CON    0xE0200240
     7 #define GPJ0DAT    0xE0200244
     8 
     9 .global _start    // 把_start链接属性改为外部,其他文件就可以看见_start
    10 _start:
    11     // 第一步:把所有引脚都设置为输出模式
    12     ldr r0, =0x11111111    // 从=可以看出用的是ldr伪指令,需要编译器来判断这个数
    13     ldr r1, =GPJ0CON    // 是合法立即数还是非法立即数。一般都用ldr伪指令
    14     str r0, [r1]            // 寄存器间接寻址。把r0中的数写入到r1中的数为地址的内存中去
    15     
    16 flash:
    17     // 第1步:点亮LED1,其他熄灭
    18     ldr r0, =~(1<<3)            //0000 0100,另外一种“低端”写法:ldr r0, =((0<<3) | (1<<4) | (1<<5))
    19     ldr r1, =GPJ0DAT            //将GPJ0DAT地址赋值给r1
    20     str r0, [r1]                // 把0写入到GPJ0DAT寄存器中,引脚即输出低电平,LED点亮
    21     bl delay                // 使用bl调用延时函数
    22     
    23     // 第2步:点亮LED2,其他熄灭    
    24     ldr r0, =~(1<<4)
    25     ldr r1, =GPJ0DAT
    26     str r0, [r1]                
    27     bl delay                
    28     
    29     // 第3步:点亮LED3,其他熄灭    
    30     ldr r0, =~(1<<5)
    31     ldr r1, =GPJ0DAT
    32     str r0, [r1]    
    33     bl delay    
    34     
    35     //第4步:循环实现流水灯效果
    36     b flash
    37 
    38 // 延时函数:delay
    39 delay:
    40     ldr r2, =9000000
    41     ldr r3, =0x0
    42 delay_loop:    
    43     sub r2, r2, #1                //r2 = r2 -1
    44     cmp r2, r3                    // cmp会影响Z标志位,如果r2等于r3则Z=1,下一句中eq就会成立
    45     bne delay_loop
    46     mov pc, lr                    // 函数调用返回

    4、mkv210_image.c
    mkv210_image.c最终不是在开发板上执行,而是在主机linux(即执行make对整个项目进行编译的虚拟机)中执行,因此编译这个程序用gcc而不是用arm-linux-gcc。这个.c文件编译后得到可执行程序mkmini210,目的是通过执行这个mkmini210程序而由led.bin得到210.bin。(210.bin是通过SD卡启动时的裸机镜像,这个镜像需要由led.bin来加工的到,加工的具体方法和原理要在mkv210_image.c中编写实现)

    5、Makefile

    基本概念
    目标:目标定格写,后面是冒号(冒号后面是依赖)
    依赖:依赖是用来产生目标的原材料
    命令:命令前面一定是Tab,不能是定格,也不能说多个空格。命令就是要生成那个目标需要做的动作

    led.bin: led.o 
        arm-linux-ld -Ttext 0x0 -o led.elf $^    //将当前目录下的.o文件链接成elf文件,
                                                //其中-Ttext 0x0表示程序的运行地址是0x0
                                                //当前编写的代码是未知无关码,所以程序能在任何一个地方运行
        arm-linux-objcopy -O binary led.elf led.bin //将elf文件抽取为可在开发板上运行的.bin文件
        arm-linux-objdump -D led.elf > led_elf.dis    //将elf文件反汇编后保存在dis文件中,可用于后期程序调试
        gcc mkv210_image.c -o mkx210
        ./mkx210 led.bin 210.bin
        
    %.o : %.S
        arm-linux-gcc -o $@ $< -c    //将当前目录下存在的汇编文件编译成.o文件
    
    %.o : %.c
        arm-linux-gcc -o $@ $< -c     //将当前目录下存在的C文件编译成.o文件
    
    clean:
        rm *.o *.elf *.bin *.dis mkx210 -f
  • 相关阅读:
    【Android笔记】Android操作HTTP实现与服务器通信
    【Android笔记】Android与服务器通信 http和socket两种形式
    【网络编程笔记】简单的TCP协议 socket编程(C语言版服务器和客户端)
    【Web后端笔记】基于Socket实现的简单Web服务器搭建
    【Web前端笔记】css让背景图片拉伸填充的属性
    【Android笔记】ServerSocket 与 Socket的区别
    【Android笔记】Android与服务器数据库通信的方法
    【Android笔记】Android的三种网络通信方式
    【Web后端笔记】jsp传递中文数据出现乱码的问题
    【Web后端笔记】jsp 的四个作用域 :page、request、session和application的区别
  • 原文地址:https://www.cnblogs.com/CYP01/p/5876933.html
Copyright © 2011-2022 走看看