作者:李老师,华清远见嵌入式学院讲师。

GPIO控制技术是接口技术中最简单的一种。本章通过介绍S5PV210芯片的GPIO控制方法,让读者初步掌握控制硬件接口的方法。本章的主要内容:

GPIO功能介绍。

S5PV210芯片的GPIO控制器详解。

S5PV210的GPIO应用。

1.1 GPIO功能介绍

首先应该理解什么是GPIO。GPIO的英文全称为General-Purpose IO ports,也就是通用IO接口。在嵌入式系统中常常有数量众多,但是结构却比较简单的外部设备/电路,对这些设备/电路,有的需要CPU为之提供控制手 段,有的则需要被CPU用做输入信号。而且,许多这样的设备/电路只要求一位,即只要有开/关两种状态就够了。比如,控制某个LED灯亮与灭,或者通过获 取某个引脚的电平属性来达到判断外围设备的状态。对这些设备/电路的控制,使用传统的串行口或并行口都不合适。所以在微控制器芯片上一般都会提供一个“通 用可编程IO接口”,即GPIO。接口至少有两个寄存器,即“通用IO控制寄存器”与“通用IO数据寄存器”。数据寄存器的各位都直接引到芯片外部,而对 这种寄存器中每一位的作用,即每一位的信号流通方向,则可以通过控制寄存器中对应位独立地加以设置。比如,可以设置某个引脚的属性为输入、输出或其他特殊 功能。

在实际的MCU中,GPIO是有多种形式的。比如,有的数据寄存器可以按照位寻址,有些却不能按照位寻址, 这在编程时就要区分了。比如传统的8051系列,就区分成可位寻址和不可位寻址两种寄存器。另外,为了使用的方便,很多MCU的 GPIO接口除必须具备两个标准寄存器外,还提供上拉寄存器,可以设置IO的输出模式是高阻,还是带上拉的电平输出,或者不带上拉的电平输出。这在电路设 计中,外围电路就可以简化不少。

1.2 S5PV210芯片的GPIO控制器详解

1.2.1 特性

S5PV210的GPIO特性包括如下几点:

146个可中断通用控制I/O。

32个可控外部中断。

237个多路复用I/O口

睡眠模式引脚状态可控(除了GPH0、GPH1、GPH2和GPH3)。

1.2.2 GPIO分组预览

GPA0:8 in/out port – 2xUART 带控制流

GPA1:4 in/out port – 2xUART 不带控制流或1xUART 带控制流。

GPB:8 in/out port – 2x SPI总线接口。

GPC0:5 in/out port – I2S总线接口,PCM接口,AC97接口。

GPC1:5 in/out port – I2S总线接口,SPDIF接口,LCD_FRM接口。

GPD0:4 in/out port –PWM接口。

GPD1:6 in/out port – 3xI2C总线接口,PWM接口,IEM接口。

GPE0,1:13in/out port –摄像头接口。

GPF0,1,2,3:30 in/out port – LCD 接口。

GPG0,1,2,3:28 in/out port – 4xMMC通道。

GPH0,1,2,3:32 in/out port –键盘,最大支持32位的睡眠可中断接口。

GPI:低功率I2S,PCM、低功耗PDN配置(通过AUDIO_SS PDN寄存器配置)。

GPJ0,1,2,3,4:35 in/out port–Modem IF, CAMIF, CFCON, KEYPAD, SROM ADDR[22:16]

MP0_1,2,3: 20 in/out port – EBI信号控制 (SROM, NF, OneNAND)

MP0_4,5,6,7: 32 in/out memory port – EBI

MP1_0~8: 71 DRAM1 ports

MP2_0~8: 71 DRAM2 ports

ETC0, ETC1, ETC2, ETC4(ETC3保留): 28 in/out ETC ports - JTAG, Operating Mode, RESET, CLOCK

1.2.3 S5PV210的GPIO常用寄存器分类

(1) 端口控制寄存器(GPA0CON-GPJ4CON)

在S5PV210中,大多数的引脚都可复用,所以必须对每个引脚进行配置。端口控制寄存器(GPnCON)定义了每个引脚的功能。

(2) 端口数据寄存器(GPA0DAT-GPJ4DAT)

如果端口被配置成了输出端口,可以向GPnDAT的相应位写数据。如果端口被配置成了输入端口,可以从GPnDAT的相应位读出数据。

(3) 端口上拉寄存器(GPA0PULL - GPJ4PULL)

端口上拉寄存器控制了每个端口组的上拉/下拉电阻的使能/禁止。根据对应位的0/1组组合,设置对应端口的上拉/下拉电阻功能是否使能。如果端口的上拉电阻被使能,无论在哪种状态(输入、输出、DATAn、EINTn等)下,上拉电阻都起作用。

1.2.4 GPIO功能描述

GPIO功能概括图如图所示。


图 GPIO功能概括图

在S5PV210中,输出端口被分为如表所示的种类。

I/O类型 I/O端口 描述
A GPA0, GPA1, GPC0, GPC1, GPD0, GPD1, GPE0, GPE1, GPF0, GPF1,
GPF2, GPF3, GPH0, GPH1, GPH2, GPH3, GPI, GPJ0, GPJ1, GPJ2, GPJ3, GPJ4
标准I/O
(3.3V I/O)
OSC_A ETC4[5](XrtcXTI/XrtcXTO) 快速I/O (3.3V I/O)
C MP1,MP2 DRAM I/O (1.8V I/O)

提示:GPxCON、GPxDAT、GPxPUD和GPxDRV工作在普通模式,GPxPDNCON、GPxPDNPULL工作在低功耗模式。

1.2.5 S5PV210I/O接口常用寄存器详解

对于GPIO控制寄存器,现在来看一下每一组IO的详细功能描述,考虑到GPIO的寄存器很多,这里只列出与后面GPIO示例有关的寄存器,如表所示。

表GPC0CON控制寄存器(可读/可写 Address = 0xE0200060)

GPC0CON 描述 初始状态
GPC0CON[4] [19:16] 0000 = 输入,0001 = 输出, 0010 = I2S_1_SDO,0011 = PCM_1_SOUT,
0100 = AC97SDO,0101 ~ 1110 = 保留, 1111 = GPC0_INT[4]
0000
GPC0CON[3] [15:12] 0000 = 输入,? 0001 = 输出,? 0010 = I2S_1_SDI ,? 0011 = PCM_1_SIN
0100 = AC97SDI,? 0101 ~ 1110 = Reserved ,? 1111 = GPC0_INT[3]
0000
GPC0CON[2] [11:8] 0000 = 输入,? 0001 = 输出,? 0010 = I2S_1_LRCK ,? 0011 = PCM_1_FSYNC
0100 = AC97SYNC ,? 0101 ~ 1110 = Reserved ,? 1111 = GPC0_INT[2]
0000
GPC0CON[1] [7:4] 0000 = 输入,? 0001 = 输出,? 0010 = I2S_1_CDCLK ,? 0011 = PCM_1_EXTCLK
0100 = AC97RESETn ,? 0101 ~ 1110 = Reserved ,? 1111 = GPC0_INT[1]
0000
GPC0CON[0] [3:0] 0000 = 输入,? 0001 = 输出,? 0010 = I2S_1_SCLK ,? 0011 = PCM_1_SCLK
0100 = AC97BITCLK ,? 0101 ~ 1110 = Reserved ,? 1111 = GPC0_INT[0]
0000

GPIO数据寄存器

GPIO数据寄存器如表所示。

表GPC0DAT数据寄存器(可读/可写 Address = 0xE0200064)

GPC0CON 描述 初始状态
GPC0DAT[4:0] [4:0] 该寄存器决定了输入或者输出的电平状态 0x00

1.3 实验5 GPIO控制实验

通过第4章的介绍,读者了解了GPIO的功能,以及S5PV210芯片GPIO控制器的配置方法。本章通过一个简单示例说明S5PV210的GPIO接口的应用。

1.3.1 实验目的

示例将利用S5PV210的GPC0_3、GPC0_4这2个I/O引脚控制2个LED发光二极管,使其有规律地闪烁。

1.3.2 实验原理

如图所示,LED1~LED2分别与GPC0_3、GPC0_4相连,通过GPC0_3、GPC0_4引脚的高低电平来控制三极管的导通性,从而控制LED的亮灭。


图LED接线原理图

因此,当这几个引脚输出高电平时发光二极管点亮;反之,发光二极管熄灭。

1.3.3 实验内容

(1) 寄存器设置

为了实现控制LED的目的,需要通过配置GPC0CON寄存器将GPC0_3、GPC0_4设置为输出属性。通过设置GPC0DAT寄存器实现点亮与熄灭LED。

对于本例来说,GPC0上拉寄存器可以不用设置。

(2) 程序编写

相关代码如下:

/*相关GPIO端口的功能设定*/
        /*GPC0控制寄存器*/
        volatile unsigned int *GPC0CON = (volatile unsigned int *) 0xE0200060;
        /*GPC0数据寄存器*/
        volatile unsigned int *GPC0DAT = (volatile unsigned int *) 0xE0200064;

/*延时函数的实现*/
        void delay()
        {
                int i = 0x100000;
                while (i--);
        }

int main(void)
        {
                int i = 0;

/* GPC0CON:GPC0CON[4]、GPC0CON[3]引脚设为输出模式 */

*GPC0CON &= ~0xff000;
                *GPC0CON |= 0x11000;

while (1)
                {
                        /*
                        * i's bit3 => GPC0DAT[3] => GPG3_1 => LED1
                        * i's bit4 => GPC0DAT[4] => GPG3_2 => LED2
                        */
                        *GPC0DAT &= ~(3 << 3);
                        *GPC0DAT |= i << 3;
                        i++;
                        if (i == 16)
                        i = 0;
                        delay();
                }
                return 0;
        }

1.3.4 实验步骤

(1) 按照实验1的步骤,连接好开发板及FS-JTAG仿真器,并且连接好配线。

(2) 打开串口终端并配置。

(3) 启动开发板,在串口终端中输入任意按键讲开发板系统停在u-boot的位置。

(4) 打开FS-JTAG工具软件,点击“Connect”按钮连接仿真器,如下图所示即连接成功。如连接不成功请检查连线及步骤(3)。

注意:确定FS-JTAG驱动已经安装成功,USB线已经如第(1)步连接上。点击“Connect”出现
如想Error表示连接成功。反之,出现Info等信息,1、有可能是FS-JTAG问题。2、核心板有问题。3、大多数是eclipse工具处理
Debug状态,关闭或删除Debug(Terminate And Remove)。

(5) 打开eclipse软件,导入实验目录下的实验4“GPIO控制实验”。

   

(6) 选择菜单下“Run -> Debug Configurations”,双击左侧“Zylin Embedded debug(Native)”。

(7) 填写此程序的elf文件到“Main”菜单下的“C/C++ Application”下。

(8) 选择LED.elf文件

(9) 填写GCC工具集中的GDB工具路径到“Debugger”菜单下的“GDB debugger”下。

(10) 填写仿真器的配置文件到“Debugger”菜单下的“GDB command file”下。

(11) 填写初始化命令到“Commands”菜单下的“ ‘Initialize’ commands”中。

(12) 执行Debug后,eclipse进入Debug调试界面,可以看到程序停在reset的位置。

(13) 点击全速运行,可以看到开发板LED等闪烁。


注意:Debug时只能有一项,不可以多对象存在。如图所示:

1.3.5 实验现象

用FS-JTAG仿真器仿真程序,可以看到LED灯有规律的闪动。

文章来源:华清远见嵌入式学院原文地址:http://www.embedu.org/Column/Column882.htm

更多相关嵌入式免费资料查看华清远见讲师博文>>

GPIO裸机编程的更多相关文章

  1. 从裸机编程到嵌入式Linux编程思想的转变------分而治之:驱动和应用程序

    笔者学习嵌入式Linux也有一段时间了,很奇怪的是很多书讲驱动编程方面的知识,也有很多书将ARM9方面的知识,但是从以前51形式的(对寄存器直接操作,初始化芯片的功能模块)编程方法,和思维模式,变换为 ...

  2. TQ210裸机编程(3)——按键(查询法)

    首先查看TQ210的底板原理图 这次编程只操作KEY1和KEY2,在TQ210核心板原理图中搜索XEINT0 可以看出KEY1和KEY2分别接在S5PV210的GPH0_0和GPH0_1引脚. 这次编 ...

  3. S5PV210(TQ210)裸机编程

    本文很多其它的是教会大家怎样学习. 4.1    汇编学习 4.1.1 基础知识     4.1.2 ARM模拟器 4.2    S5PV210启动流程 4.3    点亮一个LED 4.4    串 ...

  4. 裸机编程与OS环境编程的有关思考

    这里的所谓的裸机编程指的是为“无OS支持的硬件系统编程”,而实际的编程工作肯定需要一个环境,通常这样的情况中,编程和编译的环境叫做“宿主机”,最终的程序在“目标机”上运行(交叉编译).而OS环境编程指 ...

  5. STM32F407 GPIO 库函数编程套路(led与beep总结) 个人笔记

    本文由正点原子STM32F407探索者开发板的led和beep实验,总结了gpio编程的套路. 下文中以hardware 来称呼可能的硬件外设,如led或beep等. 新建项目后主要用到三个文件:ha ...

  6. NanoPC-T3 64位裸机编程 —— 启动和运行状态切换

    参考: https://github.com/metro94/s5p6818_spl https://github.com/trebisky/Fire3/tree/master/Boot_NSIH h ...

  7. SPI总线介绍和裸机编程分析

    一.SPI总线结构 SPI(Serial Peripheral Interface)串行外设接口,是一种高速的,全双工,同步的通信总线.采用主从模式(Master Slave)架构,支持多个slave ...

  8. TQ210裸机编程(4)——按键(中断法)

    S5PV210有4个向量中断控制器(VIC),每个向量中断控制器包含32个中断源. 当某个中断源产生中断时,CPU会自动的将VICxVECTADDRy(x=0,1,2,3,y=0-31)寄存器的值赋给 ...

  9. TQ210裸机编程(2)——LED流水灯

    两个文件start.S和led.c start.S .global _start                @声明一个全局的标号 _start:     bl main               ...

随机推荐

  1. JavaScript中判断对象类型方法大全1

    我们知道,JavaScript中检测对象类型的运算符有:typeof.instanceof,还有对象的constructor属性: 1) typeof 运算符 typeof 是一元运算符,返回结果是一 ...

  2. 正则表达式在JS中的应用

    JavaScript表单验证email,判断一个输入量是否为邮箱email,通过正则表达式实现.//检查email邮箱function isEmail(str){       var reg = /^ ...

  3. 攻城狮在路上(壹) Hibernate(十三)--- Hibernate的检索方式(上)

    Hibernate提供了以下几种检索对象的方式: A.导航对象图检索方式. B.OID检索方式.Session.get() load(); C.HQL检索方式.Query. D.QBC检索方式.Que ...

  4. Jenkins搭建

    1.添加仓库: sudo wget -O /etc/yum.repos.d/jenkins.repo \ http://jenkins-ci.org/redhat/jenkins.repo sudo ...

  5. Oracle【IT实验室】数据库备份与恢复之五:Flashback

    Flashback在开发环境(有时生产环境的特殊情况下)是很有用的一个工具.     5.1 9i Flashback 简介     5.1.1  原理 当数据  update  或  delete  ...

  6. PMP 第三章 单个项目的项目管理标准

    1 项目管理五大过程组分别是什么? 启动过程组 规划过程组 执行过程组 监控过程组 收尾过程组 2 启动项目组是干什么?包含哪些过程?每个阶段都需要启动吗? 启动过程组:获得授权,定义一个新项目或现有 ...

  7. APP设计师拿到APP产品原型开始,七步搞定APP设计(转)

    任何一款成功的APP都需要以坚实的产品概念作为基础,因为概念决定了产品最终完成的潜力. 一般情况下,交到app设计师手里的都是移动app产品原型图.当然这个是在移动产品经理反复斟酌,并且与大家开会讨论 ...

  8. ubuntu kylin中如何截图

    windows操作系统中,我通常使用的截图工具是QQ的“ctrl+alt+a”快捷键.但是在ubuntu中,linux qq常年不更新,我也就彻底放弃了使用了,反正ubuntu通常只是拿来开发.其实没 ...

  9. Codeforces Round #370 (Div. 2) D. Memory and Scores DP

    D. Memory and Scores   Memory and his friend Lexa are competing to get higher score in one popular c ...

  10. Vue入门笔记#数据绑定语法

    #数据绑定语法# #文本: 数据绑定的基础表型形式,使用“Mustache”语法(双大括号)(特意查了一下Mustache同“moustache”释义为:髭:上唇的胡子,小胡子,最起码我觉得挺形象的) ...