=============第三个实验============用c语言轮流点亮3个LED===================

1.crt0.S
.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函数
halt_loop:
            b       halt_loop

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

#define    GPF4_out    (1<<(4*2))
#define    GPF5_out    (1<<(5*2))
#define    GPF6_out    (1<<(6*2))

void  wait(volatile unsigned long dly)
{
    for(; dly > 0; dly--);
}

int main(void)
{
    unsigned long i = 0;

GPFCON = GPF4_out|GPF5_out|GPF6_out;// 将LED1,2,4对应的GPF4/5/6三个引脚设为输出

while(1){
        wait(30000);
        GPFDAT = (~(i<<4));  // 根据i的值,点亮LED1,2,4
        if(++i == 8)
            i = 0;
    }

return 0;
}

3.leds.lds

SECTIONS {
    . = 0x00;
      .text          :   { *(.text) }
    .rodata ALIGN(4) : {*(.rodata)}
      .data ALIGN(4) : { *(.data) }
      .bss ALIGN(4)  : { *(.bss)  *(COMMON) }
}

4.Makefile

CFLAGS     := -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -ffreestanding
leds.bin : crt0.S  leds.c
    arm-linux-gcc $(CFLAGS) -c -o crt0.o crt0.S
    arm-linux-gcc $(CFLAGS) -c -o leds.o leds.c
    arm-linux-ld -Ttext 0x0000000 crt0.o leds.o -o leds_elf
#    arm-linux-ld -Tleds.lds  crt0.o leds.o -o leds_elf
    arm-linux-objcopy -O binary -S leds_elf leds.bin
    arm-linux-objdump -D -m arm  leds_elf > leds.dis
clean:
    rm -f   leds.dis leds.bin leds_elf *.o

=============第四个实验============按键控制LED=============================

用按键控制LED
1.看原理图
2.
  1)配置按键的引脚为输入,LED的引脚为输出
  2)读按键的引脚,根据值来设置LED的引脚

按位操作
1.清零 a的bit3清零
  位与  a = a & ~(1 << 3)
2.置1 a的bit3 = 1
  位或 a = a | (1 << 3)

1.crt0.S
.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函数
halt_loop:
            b       halt_loop

2.key_led.c

#define GPFCON      (*(volatile unsigned long *)0x56000050)
#define GPFDAT      (*(volatile unsigned long *)0x56000054)
 
#define GPGCON      (*(volatile unsigned long *)0x56000060)
#define GPGDAT      (*(volatile unsigned long *)0x56000064)
 
/*
 * LED1,LED2,LED4对应GPF4、GPF5、GPF6
 */
#define    GPF4_out    (1<<(4*2))
#define    GPF5_out    (1<<(5*2))
#define    GPF6_out    (1<<(6*2))
 
#define    GPF4_msk    (3<<(4*2))
#define    GPF5_msk    (3<<(5*2))
#define    GPF6_msk    (3<<(6*2))
 
/*
 * S2,S3,S4对应GPF0、GPF2、GPG3
 */
#define GPF0_in     (0<<(0*2))
#define GPF2_in     (0<<(2*2))
#define GPG3_in     (0<<(3*2))
 
#define GPF0_msk    (3<<(0*2))
#define GPF2_msk    (3<<(2*2))
#define GPG3_msk    (3<<(3*2))
 
int main()
{
        unsigned long dwDat;
        // LED1,LED2,LED4对应的3根引脚设为输出
        GPFCON &= ~(GPF4_msk | GPF5_msk | GPF6_msk);
        GPFCON |= GPF4_out | GPF5_out | GPF6_out;
         
        // S2,S3对应的2根引脚设为输入
        GPFCON &= ~(GPF0_msk | GPF2_msk);
        GPFCON |= GPF0_in | GPF2_in;
 
        // S4对应的引脚设为输入
        GPGCON &= ~GPG3_msk;
        GPGCON |= GPG3_in;
 
        while(1){
            //若Kn为0(表示按下),则令LEDn为0(表示点亮)
            dwDat = GPFDAT;             // 读取GPF管脚电平状态
         
            if (dwDat & (1<<0))        // S2没有按下
                GPFDAT |= (1<<4);       // LED1熄灭
            else     
                GPFDAT &= ~(1<<4);      // LED1点亮
                 
            if (dwDat & (1<<2))         // S3没有按下
                GPFDAT |= (1<<5);       // LED2熄灭
            else     
                GPFDAT &= ~(1<<5);      // LED2点亮
     
            dwDat = GPGDAT;             // 读取GPG管脚电平状态
             
            if (dwDat & (1<<3))         // S4没有按下
                GPFDAT |= (1<<6);       // LED3熄灭
            else     
                GPFDAT &= ~(1<<6);      // LED3点亮
    }
 
    return 0;
}

3.Makefile

key_led.bin : crt0.S  key_led.c
    arm-linux-gcc -g -c -o crt0.o crt0.S
    arm-linux-gcc -g -c -o key_led.o key_led.c
    arm-linux-ld -Ttext 0x0000000 -g  crt0.o key_led.o -o key_led_elf
    arm-linux-objcopy -O binary -S key_led_elf key_led.bin
    arm-linux-objdump -D -m arm  key_led_elf > key_led.dis
clean:
    rm -f   key_led.dis key_led.bin key_led_elf *.o

GPIO实验(二)的更多相关文章

  1. 20145215&20145307《信息安全系统设计基础》实验二 固件设计

    20145215&20145307<信息安全系统设计基础>实验二 固件设计 实验目的与要求 了解多线程程序设计的基本原理,学习 pthread 库函数的使用. 了解在 linux ...

  2. FPGA与simulink联合实时环路系列——实验二LED

    实验二LED 实验内容 在实验一的基础上,将simulink产生的测试信号输出到FPGA开发板上的LED灯进行显示,这里要在生成的硬件模型上进行修改,将传送到FPGA的信号输出到8个LED灯上,并且对 ...

  3. 20145204&20145212信息安全系统实验二

    20145204&20145212信息安全系统实验二 链接

  4. 20145204&20145212实验二报告

    实验二固件设计 步骤: 1.开发环境的配置,参考实验一 1.将实验代码拷贝到共享文件夹中. 2.在虚拟机中编译代码.对于多线程相关的代码,编译时需要加-lpthread的库.下载调试在超级终端中运行可 ...

  5. 20145215实验二 Java面向对象程序设计

    一.实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O.L.I.D原则 了解设计模式 二.实验步骤 (一)单元测试 (1)三种代码 伪代码: ...

  6. 实验二 用C语言表示进程的调度

    实验二 一. 实验目的 通过模拟进程的调度,进一步了解进程的调度的具体过程. 二. 实验内容和要求 1.进程PCB的结构体定义 2.定义队列 3.输入进程序列 4.排序(按到位时间) 5.输出进程运行 ...

  7. 20145218&20145240 《信息安全系统设计基础》实验二 固件设计

    20145218&20145240 <信息安全系统设计基础>实验二 固件设计 实验报告链接:http://www.cnblogs.com/20145240lsj/p/6035512 ...

  8. 实验二 Java面向对象程序设计

    实验二 Java面向对象程序设计 实验内容 1. 初步掌握单元测试和TDD 2. 理解并掌握面向对象三要素:封装.继承.多态 3. 初步掌握UML建模 4. 熟悉S.O.L.I.D原则 5. 了解设计 ...

  9. 实验二 PHP基本语法实验

    实验二 PHP基本语法实验 0 实验准备 0.1实验环境和相关工具软件 具体到的机房环境,请在Windowsxp环境下做本实验: l  操作系统:Windowsxp l  Web服务器:Apache ...

随机推荐

  1. hdu5246 超级赛亚ACMer

    Problem Description 百小度是一个ACMer,也是一个超级赛亚人,每一个ACMer都有一个战斗力.包含百小度.
所谓超级赛亚人的定义,是说假设在对抗中刚好接近极限状态,那就会激发斗志 ...

  2. JAVA虚拟机内存架构

    Java在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途.创建和销毁的时间,有一些是随虚拟机的启动而创建,随虚拟机的退出而销毁,有些则是与线程一一对应,随 ...

  3. 解决:Access denied for user ''@'sinochip-79e833' (using password: NO)

    uthentication to host '' for user '' using method 'mysql_native_password' failed with message: Acces ...

  4. url-pattern / /*匹配

    http://hi.baidu.com/atell/item/522112d3db45081fd90e44e1 struts2中配置为 <url-pattern>/*</url-pa ...

  5. js setAttribute removeAttribute

    <input type="button" value="生效" style="font-size:111px"/> <sc ...

  6. python接口自动化(二十七)--html 测试报告——上(详解)

    简介 上一篇我们批量执行完用例后,生成的测试报告是文本形式的,不够直观,而且报告一般都是发给leader的,所以最好是直观一目了然,为了更好的展示测试报告,最好是生成 HTML 格式的.unittes ...

  7. 很轻很强大:轻量级桌面环境比较(转自linuxeden)

    这天你终于下定决心购买了一台流行的 Netbook ,与往常装机一样,直接安装心爱的 Linux 发行版.好不容易安装完成了,却发现平日启动飞快的应用程序在 Netbook 上怎么都跑不快.怎么办呢? ...

  8. Numpy库应用实例——GPS定位

    背景介绍 定位系统 GPS全球定位系统(Global Positioning System)以GPS系统为例介绍卫星定位的计算方法 GPS定位的基本原理 GPS定位的基本原理是根据高速运动卫星的 ...

  9. 【js】右下角浮动窗口

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  10. Python 字典 pop() 方法

    描述 Python 字典 pop() 方法删除给定键所对应的键/值对,并返回被删除的值.给定键如果不在字典中,则必须设置一个default值,否则会报错,此时返回的就是default值. 语法 pop ...