11.1 GPIO 介绍

11.1.1 GPIO 管脚

GPIO 即是输入输出端口,S3C2440A 包含了 130 个多功能输入/输出口引脚并且它们为如下显示的八个端口:

  • 端口 A(GPA):25 位输出端口
  • 端口 B(GPB):11 位输入/输出端口
  • 端口 C(GPC):16 位输入/输出端口
  • 端口 D(GPD):16 位输入/输出端口
  • 端口 E(GPE):16 位输入/输出端口
  • 端口 F(GPF):8 位输入/输出端口
  • 端口 G(GPG):16 位输入/输出端口
  • 端口 H(GPH):9 位输入/输出端口
  • 端口 J(GPJ):13 位输入/输出端口

GPIO 的功能即是用于 CPU 采集外设信号(INPUT),CPU 输出控制信号(OUTPUT),还有一种功能称为管脚复用功能,即是 GPIO 用于其他信号功能,比如地址,串口等共呢个,GPIO 属于 SOC 的内部外设。

GPIO 的使用需要寄存器配置。

11.1.2 GPIO 寄存器

  • 端口配置寄存器:GPACON --- GPJCON,即配置输入或是输出,还是配置为第三功能
  • 端口数据寄存器:GPADAT---GPJDAT,用于数据的写入或读取
  • 端口上拉寄存器:GPBUP---GPJUP,端口上拉寄存器控制每个端口组的使能/禁止上拉电阻。
    • 当相应位为 0 时使能引脚的上拉电阻。当为 1 时禁止上拉电阻。
    • 如果使能了上拉电阻,那么上拉电阻与引脚的功能设置无关(输入、输出、DATAn、EINTn 等等)
  • 杂项控制寄存器:
    • 此寄存器控制睡眠模式,USB 引脚和 CLKOUT 选择的数据端口上拉电阻。
  • 外部中断控制寄存器:
    • 24 个外部中断由各种信号方式触发。
    • EXTINT 寄存器为外部中断请求配置信号触发方式为低电平触发、高电平触发、下降沿触发、上升沿触发或双边沿触发。
    • 由于每个外部中断引脚包含一个数字滤波器,中断控制可以确认请求信号是否长于 3 个时钟。

11.2 GPIO 控制 LED

11.2.1 原理图

  

  

  • 从原理图上可以看出,三个灯的控制是由 GPF4 - GPF6 控制的。
  • 由于 LED 由 3.3V 高电平供电,则 GPF4- GPF6 引脚必须要设置为低电平,形成压差点亮 LED

11.2.2 GPF 控制寄存器

  • GPF 主要涉及到三个寄存器:

    • GPFCON:端口配置寄存器,配置各个 I/O 管脚是输入/输出功能,还是第三功能,此寄存器的地址是 0x56000050
    • GPFDAT:数据寄存器,用于管脚发送或是接收数据,地址是 0x56000054
    • GPFUP:上拉寄存器,地址为 0x56000058,需要才用这个寄存器
  • 注意 GPF 控制器的复位值,初始化值即是此值。
  • 具体配置查看芯片手册

11.3 汇编控制 LED

  • 指令的执行时间:

    • 一般单片机指令执行时间是固定的,参考手册,而在高性能的嵌入式 SOC 中,指令执行时间与各方面的因素有关,比如:缓存,内存,硬盘上的传输开销,指令开销,所以在高性能 SOC 上讨论指令的执行时间没有意义。
    • 考虑到多发射、超标量、超流水线、乱序执行、追踪缓存等设计越来越复杂,仅评价单条指令耗时比单片机要困难得多
    • 更由意义的指标是经过统计分析的 CPI、MIPS 数据。
    • 1MHz = 1us
    • 1GHz = 1ns
  • 一般情况下,裸机中精确延时采用定时器,如果延时在 20 us 下的话,定时器不是太合适,需要汇编辅助完成
  • 如果更小的时间要求,那么表示硬件无法满足当前需求

11.4 C语言控制 LED

makefile

 # 获取当前工作目录
CURRDIR = $(shell pwd) # 头文件所在目录
INCDIR = $(CURRDIR) # 交叉编译工具链的绝对路径
CROSS_COMPILE = ~/work/s3c2440/tools/gcc-3.4.-glibc-2.3./bin/arm-linux- # 编译器工具
AS = $(CROSS_COMPILE)as
LD = $(CROSS_COMPILE)ld
CC = $(CROSS_COMPILE)gcc
CPP = $(CC) -E
AR = $(CROSS_COMPILE)ar
NM = $(CROSS_COMPILE)nm
STRIP = $(CROSS_COMPILE)strip
OBJCOPY = $(CROSS_COMPILE)objcopy
OBJDUMP = $(CROSS_COMPILE)objdump # 编译器标识位设置
CFLAGS :=
AFLAGS :=
LDFLAGS :=
CFLAGS :=
AFLAGSL := # 目标文件设置
objs := startup.o led.o all: clean s3c2440.bin # 执行编译的过程
s3c2440.bin: $(objs)
$(LD) -Ttext 0x00000000 -o s3c2440_elf $^
$(OBJCOPY) -O binary -S s3c2440_elf $@
$(OBJDUMP) -D -m arm s3c2440_elf > s3c2440.dis %.o:%.c
$(CC) -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -ffreestanding -c -o $@ $< %.o:%.S
$(CC) -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -ffreestanding -c -o $@ $< clean:
rm -f *.bin *_elf *.dis *.o

startup.S

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

led.c

 /**
* 将0x56000050 强转为 unsigned long 型指针,并取这个地址的值
* volatile 关键字:防止编译器优化,在应用层上多线程变量,在嵌入式中外设寄存器
*/
#define GPFCON (*(volatile unsigned long *)0x56000050)
#define GPFDAT (*(volatile unsigned long *)0x56000054)
#define GPFUP (*(volatile unsigned long *)0x56000058) /** 设置 GPFCON 的 4 5 6 引脚为输出 */
#define GPF4_OUT (1 << (4 * 2))
#define GPF5_OUT (1 << (5 * 2))
#define GPF6_OUT (1 << (6 * 2)) static void delay_ms(unsigned long ms); int main(void)
{
/** 将LED1-3对应的GPF4/5/6三个引脚设为输出 */
GPFCON = GPF4_OUT | GPF5_OUT | GPF6_OUT; unsigned long i = ;
while(){
delay_ms();
GPFDAT = (~(i<<)); // 根据i的值,点亮LED1,2,4
if(++i == )
i = ;
}
} static void delay_ms(unsigned long ms)
{
unsigned int i; while(ms--) {
for(i = ; i < ; i++);
}
}

十一、S3C2440 裸机 — GPIO的更多相关文章

  1. 【转载】s3c2440裸机开发调试环境(MDK4.6,Jlink v8,mini2440)

    用于arm裸机程序开发的IDE基本有 以下3个:MDK,IAR,还有ADS.具体它们的具体情况在这里我就不多说了,百度一下就明白了.由于之前开发c51,stm32时候都使用了MDK开发环境,而且MDK ...

  2. linux上使用J-Link调试S3C2440裸机代码

    linux上使用J-Link调试S3C2440裸机代码 工具: segger的jlink仿真器 segger的jlink for linux 交叉编译工具链里面的arm-xx-linux-xx-gdb ...

  3. s3c2440裸机-时钟编程(二、配置时钟寄存器)

    s3c2440裸机编程-时钟编程(二.配置时钟寄存器) 1.2440时钟时序 下图是2440时钟配置时序: 1.上电后,nRESET复位信号拉低,此时cpu还无法取指令工作. 2.nRESET复位信号 ...

  4. S3C2440的GPIO编程

    一.初步认识S3C2440A [S3C2440A简介] S3C2440A是三星公司推出的基于ARM920t内核的32/16位RISC微处理器.主要用于手持设备和中高端电子产品中.它内部集成16k数据c ...

  5. s3c2440的GPIO驱动

    多个通用的GPIO,同时这些端口也拥有一些复用功能(如ADC输入),有部分端口只能输入,有部分端口只能输出,今天我们来看看如何设置一个GPIO的输出电平以及如何获取一个端口的GPIO电平 对GPIO进 ...

  6. s3c2440裸机-内存控制器(一、内存控制器的原理)

    1.内存接口概念 S3C2440是个片上系统,有GPIO控制器(接有GPIO管脚(GPA-GPH)),有串口控制器 (接有TXD RXD引脚),有memory controller内存控制器,有Nan ...

  7. s3c2440裸机-时钟编程(一、2440时钟体系介绍)

    1.总线框架 下图是2440的总线框架,其中有AHB(Advanced High performance Bus)高速总线,APB(Advanced Peripheral Bus)外围总线. 不同总线 ...

  8. 十三、S3C2440 裸机 — 初始化代码及MMU

    13.1 NOR FLASH 搬运 把程序从 nor flash 上搬运到 SDRAM 中 程序存储在 nor flash 上,运行时将程序搬运到 SDRAM 中运行 nor flash 启动:nor ...

  9. S3C2440 裸机程序之音频

     mini2440之Main分析 2012-03-17 20:51:29 分类: 嵌入式 /****************************************************** ...

随机推荐

  1. xcode dyld: Library not loaded: @rpath/libswiftCore.dylib问题解决

    app安装好了之后就报这个错误,这个时候可以将xcode工程clear一下,删除已经安装好的app,再重新安装即可

  2. [Nova] Failed to get shared "write" lock Is another process using the image?

    目录 文章目录 目录 问题 解决 问题 [root@overcloud-compute-0 ~]# /usr/bin/python2 -m oslo_concurrency.prlimit --as= ...

  3. 阶段3 2.Spring_03.Spring的 IOC 和 DI_1 ioc的概念和作用

    IOC的含义 new的方式创建对象,是主动去找对象.对我的资源独立就变的很难,因为这有明显的依赖关系 第二种方式创建对象.app断开了和资源的联系,.而是去找工厂要一个资源.由工厂负责和资源去的联系, ...

  4. 英特尔® Open Image Denoise 库有助于节省时间,提高质量

    在使用光线跟踪增强真实性与沉浸感时,游戏开发人员面临复杂的权衡.为了克服一系列挑战,英特尔创建了使用光线跟踪进行图像渲染的一整套解决方案,包含高性能开源滤波器.该解决方案已发布测试版,被集成至 Uni ...

  5. 配置java开发环境,存在多个版本JDK时,怎样让所需版本生效

    我本地有个1.7.0的java版本,后来我新装了一个13的版本,但是命令行查java版本的时候,生效的还是1.7.0的版本,经过资料查询以及自身亲测,现将过程记录如下: 1.电脑右键选择--属性--高 ...

  6. magento下载地址

    https://download.magentochina.org/magento/2/ https://www.magentochina.org/blog/download-install-mage ...

  7. netcore 实现一个简单的Grpc 服务端和客户端

    参考资料,和详细背景不做赘述. 首先定义prop 文件 syntax ="proto3"; package RouteGrpc; service HelloWorld{ rpc S ...

  8. C#动态调用带有SoapHeader验证的WebServices

    http://blog.csdn.net/u012995964/article/details/54573143 本文记录C#中通过反射动态的调用带有SoapHeader验证的WebServices服 ...

  9. 最长上升(不下降)子序列(LIS) 不同求解方法(动规、贪心)

    给定一个序列,求出它的最长上升子序列或者是最长不下降子序列的长度 或者输出这个子序列 一.动态规划 O(n^2) 1.求长度 首先来讨论最长上升子序列的情况,即子序列是严格上升的 假如我们以dp[i] ...

  10. Java 创建bat命令文件运行可执行jar包

    在可执行jar包所在文件夹下创建txt文件(必须在同一文件夹目录下),打开创建的txt文件输入如下内容并保存: @echo off java -jar 包名.jar pause 如下图所示: 然后将后 ...