zoukankan      html  css  js  c++  java
  • GPIO实验(一)

    目标:点亮LED
    1.看原理图,找到对应的引脚和寄存器
    2.a.配置寄存器为输入/出引脚
        GPFCON[9:8]=0b01
      b.设置输出高/低电平
        GPDAT[4]=0b0
     
    1.预处理
    2.编译  .c==>.s
    3.汇编  .s==>.o
    4.链接  把多个.o合并成一个可执行文件


    ==============第一个实验===========用汇编语言实现===========================


    led_on.S
    @******************************************************************************
    @ File:led_on.S
    @ 功能:LED点灯程序,点亮LED1
    @******************************************************************************       
                
    .text
    .global _start
    _start:     
                LDR     R0,=0x56000050      @ R0设为GPFCON寄存器。此寄存器
                                            @ 用于选择端口B各引脚的功能:
                                            @ 是输出、是输入、还是其他
                MOV     R1,#0x00000100        
                STR     R1,[R0]             @ 设置GPF4为输出口, 位[8:7]=0b01
                
                LDR     R0,=0x56000054      @ R0设为GPBDAT寄存器。此寄存器
                                            @ 用于读/写端口B各引脚的数据
                MOV     R1,#0x00000000      @ 此值改为0x00000010,
                                            @ 可让LED1熄灭
                STR     R1,[R0]             @ GPF4输出0,LED1点亮
    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
    clean:
        rm -f   led_on.bin led_on_elf *.o

    arm-linux-gcc参数:
    -g:加入调试信息
    -c:编译不链接   .s==>.o

    arm-linux-ld参数:
    -o表示输出什么文件
    -Ttext 0x0000000 代码段的开始地址为0

    arm-linux-objcopy参数:
    -O binary  输出二进制


    2440两种启动方式:
    1.从nor flash 启动
      可以像内存一样读nor flash,但是不能够像内存一样直接写,0地址在nor falsh上面
      1)0地址指向nor falsh
      2)cpu从0地址取址执行
    2.从nand flash启动
      2440内部有4kSDRAM
      1)硬件上会强制把nand flash前面4k的内容拷贝到4kSDRAM中
      2)cpu从0地址取址执行

    =============第二个实验============用c语言实现=========================


    main函数被调用 ===>被谁调用
    执行完返回     ===>返回到哪
    启动文件,库   ===>调用 hello.c,执行完毕hello.c中的main函数,返回到启动文件

    启动文件包括:硬件初始化 软件初始化
    硬件初始化:
    1.关闭看门狗
    2.初始化时钟
    3.初始化SDRAM

    软件相关的初始化:
    1.设置栈     sp===>内存(片内的SRAM,不用初始化,如果是SDRAM,则需要初始化SDRAM)
    2.设置main函数的返回地址
    3.调用main函数
    4.执行清理工作

    crt0.S(启动文件)
    @******************************************************************************
    @ File:crt0.S
    @ 功能:通过它转入C程序
    @******************************************************************************       

    .text
    .global _start
    _start:
                ldr     r0, =0x53000000 @ WATCHDOG寄存器地址
                mov     r1, #0x0                     
                str     r1, [r0]    @ 写入0,禁止WATCHDOG,否则CPU会不断重启
                
                ldr     sp, =1024*4 @ 设置堆栈,注意:不能大于4k, 因为现在可用的内存只有4K
                                    @ nand flash中的代码在复位后会移到内部ram中,此ram只有4K
                bl      main        @ 调用C程序中的main函数,并且把返回地址保存到lr寄存器里面
    halt_loop:
                b       halt_loop   @main函数执行完后会执行halt_loop循环



    led_on_c.c
    #define GPFCON   (*(volatile unsigned long *)0x56000050)
    #define GPFDAT   (*(volatile unsigned long *)0x56000054)

    int main()
    {
        GPFCON = 0x00000100; // 设置GPF4为输出口, 位[9:8]=0b01
        GPFDAT = 0x00000000; // GPF4输出0,LED1点亮

        return 0;
    }

    //int a;
    //int *p;
    //p = &a;
    //*p = 0x100     <===> a=0x100
    //p = (int *)56000050
    //*p = 0x100     <===> *(int *)56000050 = 0x100
    //volatile关键字不会被编译器优化

    Makefile

    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

    led_on_c.dis 反汇编
    led_on_c_elf:     file format elf32-littlearm
    Disassembly of section .text:
    00000000 <_start>:
       0:    e3a00453     mov    r0, #1392508928    ; 0x53000000
       4:    e3a01000     mov    r1, #0    ; 0x0
       8:    e5801000     str    r1, [r0]
       c:    e3a0da01     mov    sp, #4096    ; 0x1000
      10:    eb000000     bl    18 <main>

    00000014 <halt_loop>:
      14:    eafffffe     b    14 <halt_loop>

    00000018 <main>:
      18:    e1a0c00d     mov    ip, sp
      1c:    e92dd800     stmdb    sp!, {fp, ip, lr, pc}
      20:    e24cb004     sub    fp, ip, #4    ; 0x4
      24:    e3a03456     mov    r3, #1442840576    ; 0x56000000
      28:    e2833050     add    r3, r3, #80    ; 0x50
      2c:    e3a02c01     mov    r2, #256    ; 0x100
      30:    e5832000     str    r2, [r3]
      34:    e3a03456     mov    r3, #1442840576    ; 0x56000000
      38:    e2833054     add    r3, r3, #84    ; 0x54
      3c:    e3a02000     mov    r2, #0    ; 0x0
      40:    e5832000     str    r2, [r3]
      44:    e3a03000     mov    r3, #0    ; 0x0
      48:    e1a00003     mov    r0, r3
      4c:    e89da800     ldmia    sp, {fp, sp, pc}
    Disassembly of section .comment:

    ....

  • 相关阅读:
    链接
    Oracle创建表空间
    C#中的全局异常捕捉
    软件架构入门
    Nginx安装及配置详解包括windows环境
    极路由4增强版(B70)HC5962离线ROOT通过Breed刷openwrt教程
    vue自定义全局指令v-emoji限制input输入表情和特殊字符
    【vue】@input
    【window】常用软件
    Vbox 虚拟机全屏
  • 原文地址:https://www.cnblogs.com/liulipeng/p/3399184.html
Copyright © 2011-2022 走看看