目标:点亮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:

....

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

  1. Cortex-M3学习日志(一)-- GPIO实验

    因为项目所需,所以不得不开始研究M3,我用的是NXP公司的LPC1768这个芯片,它是具有三级流水线的哈佛结构,带独立的本地指令和数据总线以及用于外设的稍微低性能的第三条总线,还包含一个支持随机跳转的 ...

  2. S02_CH10_ User GPIO实验

    S02_CH10_ User GPIO实验 在之前的第四章课程中,我们详细的讲解了如何在VIVADO软件下封装一个简单的流水灯程序.在ZYNQ开发过程中,有时候我们可能会需要与ARM硬核进行通信,在这 ...

  3. GPIO实验之c语言

    上一章节进行实验使用的是汇编进行编程的,本次实验是使用c语言进行编写的. (1)点亮一个led灯   1)启动文件:    crt.S   .text   .global _start   _star ...

  4. Beaglebone Back学习四(GPIO实验)

    GPIO Beaglebone Back开发板引出了92个引脚,其中只有65个GPIO口可通过配置使用,由于引脚具有“复用”的特性,大约每个引脚有8种工作模式(Beagle System Refere ...

  5. GPIO实验(二)

    =============第三个实验============用c语言轮流点亮3个LED=================== 1.crt0.S.text.global _start_start:    ...

  6. 02-JZ2440裸机学习之GPIO实验【转】

    本文转载自:http://blog.csdn.net/fengyuwuzu0519/article/details/54910717 版权声明:本文为博主原创文章,转载请注明http://blog.c ...

  7. GPIO实验

    一.目标:点亮led 1.看原理图:怎样点亮led 2.怎样GPF4输出0/1 a.配置功能  输出/输入/其他功能(中断或者其他) b.设置输出高电平/低电平 操作寄存器--->看芯片手册 A ...

  8. JZ2440之GPIO篇

    买来开发板已经有一段时间了,刚接触时兴奋至极,后来跟着视频看下去发现似乎自己并没有学到太多东西,于是发现自己可能欠缺的太多以致从课程中无法提取出重要的东西来,所以并没有得到太多的营养成分.因此我个人认 ...

  9. DSP5509的GPIO学习-第5篇

    1. 使用CCS V6.1版本,目前已经不局限于仅仅把实验搞清楚了,要深入去探究内部的原理,本章看下GPIO实验 2. 在CCS启动的时候,提示,这个问题是什么,XDAIS是什么?XDAIS (eXp ...

随机推荐

  1. 使用fiddler来抓包

    使用fiddler来抓包 Sniffer,wireshark,WinNetCap.WinSock Expert,SpyNet 都是当前流行的抓包工具 需要先做一些简单的准备工作: 一台带有无线网卡的P ...

  2. UsageLog4j

      迁移时间:2017年5月21日09:42:46CreateTime--2017年1月2日09:35:55Author:Marydon原文链接:http://www.360doc.com/conte ...

  3. fread与read的差别(文件io补充)

    这里有一个我们常常提出的问题就是fread,read的差别.(当然这两个分别代表了操作文件系统的两套不同的函数,包含open,read, write, seek 等). 一.他们的差别就是一个(rea ...

  4. Java中将InputStream读取为String, 各种方法的性能对比

    如下, 一共存在11种实现方式及其对应的性能测试结果: 1. 使用IOUtils.toString (Apache Utils) String result = IOUtils.toString(in ...

  5. 【微信小程序】 引用公共js里的方法

    一个小程序页面由四个文件组成,一个小程序页面的四个文件具有相同路径与文件名,由此我们可知一个小程序页面对应着一个跟页面同名的js文件.可是当有些公共方法,我们想抽离出来成为一个独立公共的js文件.我们 ...

  6. Web Service基础——基础概念

    1. Web Service基本概念 Web Service(Web服务)是一种远程调用技术,他的作用就是从远程系统中获取业务数据.具体来说,Web Service可以让你的网站使用其他网站的资源,比 ...

  7. 【转】ubuntu如何修改/添加/删除硬盘分区的挂载(点)?

    我(macroliu)的问题:安装ubuntu时,/home单独挂载在一个分区,此后我想调整分区大小,删除了/home对应的分区以及另外几个分区,导致开机时找不到挂载点.把硬盘空闲空间分好区后,想把1 ...

  8. QQ网页链接打开本地QQ.exe原理

    一.观察现象 QQ推广上有相关文档 http://shang.qq.com/v3/widget.html 新建一个html,点击链接就会启动本地QQ. <html> <body> ...

  9. 分析一帧基于UDP的TFTP协议帧

    下图是UDP的段格式: 相比TCP段格式,UDP要简单得多,也没啥好说的,需要注意的是UDP数据长度指payload加上首部的长度. 下面分析一帧基于UDP的TFTP协议帧: 以太网首部 0000: ...

  10. Linux常见的进程调度算法

    进程调度:在操作系统中调度是指一种资源分配. 调度算法是指: 根据系统的资源分配策略所规定的资源分配算法. 操作系统管理了系统的有限资源,当有多个进程(或多个进程发出的请求)要使用这些资源时,因为资源 ...