zoukankan      html  css  js  c++  java
  • 韦东山嵌入式Linux学习笔记04--点亮开发板的一个LED灯

    搜索开发板原理图LED的走线

             

    LED8是网线接口的指示灯.

    在这里我们尝试用汇编代码控制D10, 也就是LED1,它连接到EINT4/GPF4,读取芯片手册

     有原理图可知,如果需要点亮LED1,需要控制s3c2440的GPF4引脚输出低电平.

    GPFCON = 0x56000050

    GPFDAT = 0x56000054

    GPFUP = 0x56000058

    =========================

    直接set 0x56000050 = 0x100  设置GPF4为引脚为输出模式

    set 0x56000054 0x00 设置GPF4输出电平为0

    set 0x56000058 0x10 不使能GPF4内部拉高

    这样就可以控制改灯常亮,汇编应该怎么写?

    1. 通过汇编点亮一个LED

    代码:

     .text
    .global _start
    _start:     
                LDR     R0,=0x56000050      @  这是个内存操作命令, 先将寄存器的地址装入R0中
                                            @ 
                                            @ 
                MOV     R1,#0x00000100      @ 将0x00赋值给R1
                STR     R1,[R0]             @ 内存的反向操作, 将R1的值存到R0地址处. 括号代表类似于取指针
                
                LDR     R0,=0x56000054      @ 同样操作
                                            @ 
                MOV     R1,#0x00000000      @ 
                                            @ 
                STR     R1,[R0]             @ 
    MAIN_LOOP:                              @ 死循环
                B       MAIN_LOOP
    

    Makefile

    led_on.bin : led_on.S  # 编译的顺序  -- 预处理, 编译, 汇编, 链接
    	arm-linux-gcc -g -c -o led_on.o led_on.S # 汇编
    	arm-linux-ld -Ttext 0x0000000 -g led_on.o -o led_on_elf #链接并指定运行地址
    	arm-linux-objcopy -O binary -S led_on_elf led_on.bin #将ELF格式的可执行文件转换成二进制文件
    clean:
    	rm -f   led_on.bin led_on_elf *.o
    

    上电,通过tftp下载, tftp 0x3000000 led_on.bin

    go 0x3000000, 可以看到有一个led点亮了.测试成功.

     2. 通过c点亮一个LED

    要通过汇编来调用c函数

    crt0.S

    .text
    .global _start  @系统起来会先从_start开始跑
    _start:
                ldr     r0, =0x53000000     @ 这个寄存器是WATCHDOG控制寄存器, 需要写0来关闭看门狗,不然会一直重启,为什么全汇编的时候不需要做硬件初始化?
                mov     r1, #0x0                     
                str     r1, [r0]            @ 
                
                ldr     sp, =1024*4         @ 因为s3c2440有4k大的内部RAM,将栈的位置设在这里
                                            @ 
                bl      main                @ 跳到main函数然后返回,往下执行halt_loop
    halt_loop:
           b halt_loop

    c文件

    #define GPFCON      (*(volatile unsigned long *)0x56000050)
    #define GPFDAT      (*(volatile unsigned long *)0x56000054)
    
    int main()
    {
        GPFCON = 0x00001000;    // 
        GPFDAT = 0x00000000;    // 
    
        return 0;
    }

    Makefile

    led_on_c.bin : crt0.S  led_on_c.c #编译的目标为 led_on_c.bin 需要依赖 crt0.S  led_on_c.c 这两个文件
        arm-linux-gcc -g -c -o crt0.o crt0.S
        arm-linux-gcc -g -c -o led_on_c.o led_on_c.c
        arm-linux-ld -Ttext 0x0000000 -g  crt0.o led_on_c.o -o led_on_c_elf
        arm-linux-objcopy -O binary -S led_on_c_elf led_on_c.bin
        arm-linux-objdump -D -m arm  led_on_c_elf > led_on_c.dis
    clean:
        rm -f led_on_c.dis led_on_c.bin led_on_c_elf *.o

    tftp 30000000 led_on_c.bin

    nand erase bootloader

    nand write 0x30000000 bootloader

    选择从nand启动, 重启开发板

     

  • 相关阅读:
    单表通用excle导入(只要是单表都可以,只需要传文件跟表名及用户id即可)
    单表通用excle导出(只要是单表都可以)
    mysql数据库中的mybatis中xml解决in不起作用的问题
    Mysql获取系统时间,年,月,日
    Linux下MySQL的数据库安装
    MP3音频文件的剪切合并方法
    Oracle client客户端简易安装网上文档一
    excel导出功能
    Oracle数据库的创建表全
    Oracle表字段的增加、删除、修改和重命名
  • 原文地址:https://www.cnblogs.com/cheyihaosky/p/11863764.html
Copyright © 2011-2022 走看看