0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

嵌入式学习电路学习之gpio的那些事

5RJg_mcuworld 来源:互联网 作者:佚名 2017-11-16 09:46 次阅读

一、 什么是GPIO

GPIO,英文全称为General-Purpose IO ports,也就是通用IO口。在嵌入式系统中常常有数量众多,但是结构却比较简单的外部设备/电路,对这些设备/电路有的需要CPU为之提供控制手段,有的则需要被CPU用作输入信号。而且,许多这样的设备/电路只要求一位,即只要有开/关两种状态就够了,比如灯亮与灭。对这些设备/电路的控制,使用传统的串行口或并行口都不合适。所以在微控制器芯片上一般都会提供一个“通用可编程IO接口”,即GPIO。接口至少有两个寄存器,即“通用IO控制寄存器”与“通用IO数据寄存器”。数据寄存器的各位都直接引到芯片外部,而对这种寄存器中每一位的作用,即每一位的信号流通方向,则可以通过控制寄存器中对应位独立的加以设置。这样,有无GPIO接口也就成为微控制器区别于微处理器的一个特征。

二、 GPIO之LCD控制编程

S3C2440有130个I/O端口,分为A-J共9组:GPA、GPB、GPJ,可以通过设置寄存器来确定某个引脚用于输入、输出还是特殊功能。比如:可以设置GPH6作为输入、输出、或者用于串口。

1、通过寄存器来操作GPIO引脚

1)GPxCON寄存器它用于配置引脚的功能端口A与端口B-J在功能上有所不同,GPACON中每一位对应一根引脚(共23根引脚)当某位为0时,对应引脚为输出,此时在GPADAT中相应位写入0或1,让此引脚输出低电平或高电平;当某位被设为1时,对应引脚为地址线或用于地址控制,此时GPADAT保留不用。GPACON通常被设为全1,以便访问外部存储设备端口B-J在寄存器操作上完全相同,PxCon中每两位控制一根引脚,00表示输入,01表示输出,10表示特殊功能,11保留不用。

2)GPxDAT寄存器它用于读写引脚,当引脚被设为输入时,读此寄存器得到对应引脚的电平状态是高还是低;当引脚被设为输出时,写此寄存器相应位可令此引脚输出高低电平。

3)GPxUP寄存器GPxUP,某位为1时,相应引脚无内部上拉电阻;为1时,相应引脚使用内部上拉电阻上拉电阻、下拉电阻的作用在于,当GPIO引脚出于第三态(非高低电平,而是高阻态,即相当于没接芯片)时,它的电平状态由上拉电阻和下拉电阻确定。

GPIO控制LCD编程实例:

[cpp] view plain copy print?

#include

void delay(int TImes)

{

int i;

for(;TImes》0;TImes--)

for(i=0;i《400;i++);

}

int main(void)

{

int i;

GPBCON =10000000000; /*配置GPB5为输出 (参考图1)*/

GPBUP =~100000; /*配置GPB5上拉电阻使能(参考图2)*/

for(i=0;i《10000;i++)

{

/* LED1亮 */

GPBDAT = ~100000; /*GPB5低电平*/

delay(1000);

/* LED1灭 */

GPBDAT = 100000; /*GPB5高电平*/

delay(1000);

}

}

...

其实上面的例子存在一个非常重要的问题,就是在配置某引脚的时候把其他引脚的值也进行了修改。在实际应用中,有可能其他引脚正在执行某操作,而我们这样进行配置的时候,修改掉其他引脚可能引发不可收拾的后果,那我们应该如何操作呢?

三、 引脚配置的按位“与”和按位“或”操作

先来看看上述代码用按位“与”和按位“或”操作修改之后的效果再来讲解:

[cpp] view plain copy print?

#include

#define GPF5_out (1《《(5*2))

#define GPF5_msk (3《《(5*2))

void delay(int TImes)

{

int i;

for(;times》0;times--)

for(i=0;i《400;i++);

}

int main(void)

{

int i;

GPBCON &=~(GPF5_msk); /*GPB5数据清零*/

GPFCON |= GPF5_out; /*配置GPB5为输出 (参考图1)*/

for(i=0;i《10000;i++)

{

/* LED1亮 */

GPBDAT &= ~(1《《5); /*GPB5低电平*/

delay(1000);

/* LED1灭 */

GPBDAT |= (1《《5); /*GPB5高电平*/

delay(1000);

}

}

先来分析两个宏定义:

#define GPF5_out (1《《(5*2))

#define GPF5_msk (3《《(5*2))

分别将GPF5_out定义为1左移10、变为:1000,0000,000,GPF5_msk定义为3(即二进制11)左移10、变为:1100,0000,0000。

语句GPBCON &=~(GPF5_msk): /*GPB5数据清零*/:GPF5_msk进行非操作变成:0011,1111,1111,任何数与其进行与操作,最高两位(的出来的结果均为00xx,xxxx,xxxx,x为未知),这样就可以达到对应位清零效果。

语句GPFCON |= GPF5_out:任何数与GPF5_out(1000,0000,000)进行或操作,最高位必为1,变成1xxx,xxxx,xxx。加上前面未显示出来的0,就可以将该引脚的端口5配置为输入引脚即01。

同理,将GPBDAT配置为低电平可以使其与1左移5的非(100000 -》01111)进行与操作,就得到该端口的低电平,高电平也是一样的道理。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • GPIO
    +关注

    关注

    16

    文章

    1196

    浏览量

    51896

原文标题:嵌入式学习笔记之GPIO详解

文章出处:【微信号:mcuworld,微信公众号:嵌入式资讯精选】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    嵌入式系统的知识学习及误区

    本内容介绍了嵌入式系统的知识学习及误区,具体包括嵌入式系统的知识体系,嵌入式系统的学习误区,基础阶段的
    发表于 11-03 16:32 1944次阅读

    嵌入式C学习精华

    本帖最后由 zgzzlt 于 2012-8-16 13:18 编辑 嵌入式C学习精华
    发表于 08-12 10:20

    如何学习嵌入式系统

    。  (硬件篇)  1、基本电路知识  嵌入式硬件也是需要许多电路搭建起来的,学习嵌入式之前必须对电路
    发表于 08-17 10:18

    关于嵌入式学习计划资料分享

    进行实战,鉴于目前手头刚好有一台STM32F107VCT6,就选择它了,而且STM32F10x系列的设备资料也比较齐全。对于嵌入式设备的学习路线,首先学习使用固件库进行编程,学习的内容
    发表于 10-27 08:21

    如何学习嵌入式

    对于嵌入式,笔者研究十来年了。今天我们不讲嵌入式多好多好之类,也不讲技术本身有什么优劣势未来如何发展,我们就讲一下如何学习嵌入式。既然是谈嵌入式
    发表于 10-27 09:00

    嵌入式Linux学习路线

    学习方法】:【北京迅为】再谈Linux学习方法-框架学习法【Linux基础入门】:【北京迅为】嵌入式学习
    发表于 12-23 07:52

    [学习嵌入式]嵌入式系统学习方法,轻松入门嵌入式

    [学习嵌入式]嵌入式系统学习方法,轻松入门嵌入式
    发表于 03-28 15:29 79次下载

    学习嵌入式技术的重点分享

    很多人嵌入式学习都有些迷茫,不知道从哪里入手,不知道自己的水平位于哪个层次,不知道从哪方面提升,今天我们就从一个8年工作经验的嵌入式资深工程师的分享,来看一下嵌入式
    的头像 发表于 09-23 11:05 2748次阅读

    嵌入式系统应该学习那些知识

    嵌入式系统是当今的热门系统之一,在诸多领域,嵌入式系统都有所应用。为增进大家对嵌入式系统的认识,小编将为大家介绍嵌入式系统是一个什么样的专业,以及
    发表于 01-03 17:47 5146次阅读

    嵌入式学习计划

    进行实战,鉴于目前手头刚好有一台STM32F107VCT6,就选择它了,而且STM32F10x系列的设备资料也比较齐全。对于嵌入式设备的学习路线,首先学习使用固件库进行编程,学习的内容
    发表于 10-20 12:20 10次下载
    <b class='flag-5'>嵌入式</b><b class='flag-5'>学习</b>计划

    嵌入式学习路线怎么学,如何学习嵌入式系统

    随着互联网的快速发展,嵌入式也越来越火热,更多的人投入到嵌入式开发的行列中来,那么想要学习嵌入式,该从哪里入手学习,
    发表于 10-20 15:50 13次下载
    <b class='flag-5'>嵌入式</b><b class='flag-5'>学习</b>路线怎么学,如何<b class='flag-5'>学习</b><b class='flag-5'>嵌入式</b>系统

    嵌入式学习

    在论坛里面突然发现的一个大佬给的嵌入式学习的路线建议跟大家分享一下一:做任何事情都有一个循序渐进的过程,学习嵌入式linux也一样。在有了一定的嵌入
    发表于 10-20 16:21 14次下载
    <b class='flag-5'>嵌入式</b><b class='flag-5'>学习</b>

    哪些人适合嵌入式学习学习嵌入式的都是什么人?

    对于嵌入式,笔者研究十来年了。今天我们不讲嵌入式多好多好之类,也不讲技术本身有什么优劣势未来如何发展,我们就讲一下如何学习嵌入式。既然是谈嵌入式
    发表于 10-20 20:06 3次下载
    哪些人适合<b class='flag-5'>嵌入式</b><b class='flag-5'>学习</b>?<b class='flag-5'>学习</b><b class='flag-5'>嵌入式</b>的都是什么人?

    蓝桥杯嵌入式拓展板学习索引

    蓝桥杯嵌入式开发拓展板学习目录如果说你是刚开始准备学习拓展版,那就完全可以按着我这个顺序去学习。蓝桥杯嵌入式扩展板模块
    发表于 10-21 09:51 3次下载
    蓝桥杯<b class='flag-5'>嵌入式</b>拓展板<b class='flag-5'>学习</b>索引

    学习嵌入式的开发线路,新手怎么学习嵌入式

    作为新人,要如何学习嵌入式Linux?首先您要具备基本的C语言基础,然后,您要想好学习嵌入式Linux目标是什么,是想做底层系统、还是应用开发。如果是关于底层开发,是
    发表于 11-03 14:21 12次下载
    <b class='flag-5'>学习</b><b class='flag-5'>嵌入式</b>的开发线路,新手怎么<b class='flag-5'>学习</b><b class='flag-5'>嵌入式</b>?