目标:C语言实现点亮LED灯

首先是main函数,并不特殊,它是被系统调用来执行的,main函数结束后要返回调用main函数的地址处,那么裸机程序,没有操作系统做这些工作,就要自己写调用main函数的程序了。
软件相关的初始化:
1、设置栈 2、设置main函数返回地址 3、调用main 4、清理工作

所谓设置栈就是将栈指针SP指向某块内存,在S3C2440中这块内存可以是片内SRAM,这样不用初始化内存了,如果指向SDRAM,那么首先要初始化SDRAM。
硬件相关的初始化:
a、关闭看门狗;b、初始化时钟;c、初始化SDRAM等
软件相关初始化和硬件相关初始化结合一起就是启动文件。

下面是用C语言写的代码
这一段代码是汇编语言,作用相当于启动文件,在这里为了简单,在硬件方面初始化只关闭了看门狗,软件方面初始化设置了栈。

crt.S

.text
.global _start
_start:
ldr r0,=0x53000000 @看门狗地址
mov r1,#0x0
str r1,[r0] @写入0,关闭看门狗
ldr sp,=* @设置堆栈,注意不能大于4K bl main
halt_loop:
b halt_loop

分析这段汇编程序,首先初始化硬件相关的,关闭看门狗,然后设置堆栈,在s3c2440不能大于4K,因为s3c2440片内SRAM只有4K,再然后就是调到main函数,用了bl指令,bl有两个功能,一是跳转,二是设置了返回地址,就是bl    main指令的下一条指令b hail_loop,所以在这里就初始化完返回地址了。
下面就实现c语言的main函数。

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

2、用C语言轮流点亮LED

#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
delay(volatile unsigned long dly)
{
for(;dly > ;dly--);
}
int
main()
{
unsigned i = ; GPFCON = GPF4_out | GPF5_out | GPF6_out;
while()
{
GPFDAT = ( ~( i << ) );
i *=;
if( i == )
{
i = ;
}
delay(); } return ;
}

Makefile

CFLAGS := -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -ffreestanding
led_on.bin:ctr.S main.c
arm-linux-gcc $(CFLAGS) -c -o ctr.o ctr.S
arm-linux-gcc $(CFLAGS) -c -o main.o main.c
arm-linux-ld -Ttext 0x00000000 ctr.o main.o -o led_on.elf
arm-linux-objcopy -O binary -S led_on.elf led_on.bin
arm-linux-objdump -D -m arm led_on.elf>led_on.dis
clean:
rm -f led_on.bin led_on.elf *.o led_on.dis

3、按键操作

#define GPFCON  (*(volatile unsigned long *)0x56000050)
#define GPFDAT (*(volatile unsigned long *)0x56000054)
#define GPGCON (*(volatile unsigned long *)0x56000060)
#define GPGDAT (*(volatile unsigned long *)0x56000064) #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 ) ) #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( void )
{
unsigned long ysdat;
GPFCON &= ~( GPF4_msk | GPF5_msk | GPF6_msk );
GPFCON |= GPF4_out |GPF5_out | GPF5_out; GPFCON &= ~( GPF0_msk | GPF2_msk );
GPFCON |= GPF0_in |GPF2_in; GPGCON &= ~( GPG3_msk );
GPGCON |= GPG3_in; while()
{
ysdat = GPFDAT; if( ysdat & ( << ) )
{
GPFDAT |= ( << );
}
else
{
GPFDAT &= ~( << );
} if( ysdat & ( << ) )
{
GPFDAT |= ( << );
}
else
{
GPFDAT &= ~( << );
} ysdat = GPGDAT; if( ysdat & ( << ) )
{
GPFDAT |= ( << );
}
else
{
GPFDAT &= ~( << );
} } return ;
}

Makefile

CFLAGS := -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -ffreestanding
led_on.bin:ctr.S main.c
arm-linux-gcc $(CFLAGS) -c -o ctr.o ctr.S
arm-linux-gcc $(CFLAGS) -c -o main.o main.c
arm-linux-ld -Ttext 0x00000000 ctr.o main.o -o led_on.elf
arm-linux-objcopy -O binary -S led_on.elf led_on.bin
arm-linux-objdump -D -m arm led_on.elf>led_on.dis
clean:
rm -f led_on.bin led_on.elf *.o led_on.dis

通过嵌入式GPIO接口及操作(一)及这篇两个程序的练习,能够掌握对GPIO的操作,这是操作硬件的基本技能。

嵌入式GPIO接口及操作(二)的更多相关文章

  1. 嵌入式GPIO接口及操作(一)

    GPIO意思就是通用输入输出,一些引脚可以通过他们输出高低电平,或者通过它们读入引脚的状态.对GPIO的操作是对所有硬件的操作最基本的技能.一.通过寄存器来操作GPIO引脚,一个引脚可以用于输入.输出 ...

  2. GPIO接口解析【转】

    本文提供了一个linux下访问GPIO的约定的概述. 这些调用使用gpio_* 命名前缀.没有别的调用会使用这个前缀或是相关的__gpio_*前缀. 转自:http://blog.163.com/w5 ...

  3. 《嵌入式系统原理与接口技术》——嵌入式系统接口应用基础

    本文为我负责编写的电子工业出版社出版的<嵌入式系统原理与接口技术>一书第七章部分,这里整理的仍然是修改稿,供需要的同学参考,本书为普通高等教育"十二五"规划教材,电子信 ...

  4. C#中抽象类和接口的区别(二)

    一.抽象类: 抽象类是特殊的类,只是不能被实例化:除此以外,具有类的其他特性:重要的是抽象类可以包括抽象方法,这是普通类所不能的.抽象方法只能声明于抽象类中,且不包含任何实现,派生类必须覆盖它们.另外 ...

  5. 玩转X-CTR100 | STM32F4 l GPIO位带操作

    更多塔克创新资讯欢迎登陆[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ]       STM32F4位带概念,及位带的GPIO操作实践应用. 原理介 ...

  6. Intel Edison —— 控制GPIO接口,网页显示传感器数值

    前言 原创文章,转载引用务必注明链接. 因为是使用Typora(markdown)写好然后复制到论坛的,推荐直接访问我的网站以获得更好地阅读体验. Intel XDK IoT 开发环境很久之前就上手了 ...

  7. {MySQL的库、表的详细操作}一 库操作 二 表操作 三 行操作

    MySQL的库.表的详细操作 MySQL数据库 本节目录 一 库操作 二 表操作 三 行操作 一 库操作 1.创建数据库 1.1 语法 CREATE DATABASE 数据库名 charset utf ...

  8. 第13章 GPIO—位带操作

    第13章     GPIO—位带操作 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/fire ...

  9. GPIO—位带操作

    GPIO—位带操作本章参考资料:< STM32F4xx 中文参考手册>存储器和总线构架章节. GPIO 章节,< Cortex®-M4 内核编程手册> 2.2.5 Bit-ba ...

随机推荐

  1. How I explained OOD to my wife

    Introduction My wife Farhana wants to resume her career as a software developer (she started her car ...

  2. 使用jxls技术导入Excel模版数据(转自其他博客)

    第一步:先确定好Excel导入的格式以及各表格字段值的含义 第二步:定义好解析的XML--videoConfig.xml <?xml version="1.0" encodi ...

  3. wcf 配置与代码创建

    <behaviors> <serviceBehaviors> <behavior name="MyServiceBehavior"> <s ...

  4. python全栈学习笔记(一)网络基础之网络协议篇

    阅读目录 一.操作系统基础 二.网络通信原理 2.1 互联网的本质就是一系列的网络协议 2.2 osi七层协议 2.3 tcp/ip五层模型讲解 2.3.1 物理层 2.3.2 数据链路层 2.3.3 ...

  5. Oracle Fusion Middleware Supported System check,jdk,java .etc requirements

    http://www.oracle.com/technetwork/middleware/ias/downloads/fusion-certification-100350.html 在oracle官 ...

  6. 优秀 Java 程序员写代码的风格

    往 期 精 彩 推 荐    [1]Java Web技术经验总结 [2]15个顶级Java多线程面试题及答案,快来看看吧 [3]面试官最喜欢问的十道java面试题 [4]从零讲JAVA ,给你一条清晰 ...

  7. MySQL错误问题

    启动Tomcat的时候报错:no suitable driver,MySql更新使用com.mysql.cj.jdbc.Driver,废弃老的com.mysql.jdbc.Driver驱动,需要将D: ...

  8. AtomicInteger线程安全的计数器

    在多线程环境下计数的时候,++i和i++是不安全的,故而需要加锁机制,也可以使用volatile关键字进行修饰,但是更简单有效的方式是使用Atomic类

  9. vector size函数使用注意事项

    vector 的size函数返回vector大小,返回值类型为size_type,Member type size_type is an unsigned integral type,即无符号整数: ...

  10. JDBC(6)事务处理&批量处理

    事务处理就是当执行多个SQL指令,因某个指令有误,则取消执行所有的命令 它的作用是保证各项的完整性和一致性 JDBC的数据操作时 commit():提交事务 rollback():回退事务 绝位于ja ...