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

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

3天内不再提示

通过寄存器来操作GPIO引脚

GReq_mcu168 来源:未知 作者:龚婷 2018-03-13 15:14 次阅读

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引脚出于第三态(非高低电平,而是高阻态,即相当于没接芯片)时,它的电平状态由上拉电阻和下拉电阻确定。

图1 GPBCON引脚配置

图2 GPBDAT引脚配置

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)进行与操作,就得到该端口的低电平,高电平也是一样的道理。

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

    关注

    5

    文章

    346

    浏览量

    30259
  • 寄存器
    +关注

    关注

    30

    文章

    5032

    浏览量

    117746
  • GPIO
    +关注

    关注

    16

    文章

    1135

    浏览量

    50580
  • gpio引脚
    +关注

    关注

    0

    文章

    6

    浏览量

    2612

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

文章出处:【微信号:mcu168,微信公众号:硬件攻城狮】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    【NXP LPC54110试用体验】3:GPIO寄存器介绍

    有一个输出位,对GPIO引脚进行写操作就是对这个输出位进行操作,驱动这个输出位必须满足以下两个条件:1:必须通过IOCON
    发表于 08-21 21:49

    嵌入式学习笔记之GPIO详解

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

    在PORT寄存器GPIO引脚的LAT寄存器上进行读写操作的利弊?

    大家好,谁能建议一下在PORT寄存器GPIO引脚的LAT寄存器上进行读写操作的利弊?非常感谢你的帮助。
    发表于 03-11 10:43

    怎样通过寄存器操作GPIOGPIO有哪些操作实例?

    GPIO是什么?怎样通过寄存器操作GPIOGPIO有哪些
    发表于 06-28 07:34

    寄存器操作GPIO口的介绍

    寄存器操作GPIO口1.ARM 介绍2.开发板的介绍2.1软件安装2.2工程建立总线架构和时钟树GPIO口使用寄存器
    发表于 12-10 06:32

    GPIO寄存器相关操作相关资料分享

    入门篇-GPIO寄存器相关操作1、芯片管脚以及功能2、GPIO 输入与输出3、寄存器的地址4、对寄存器
    发表于 01-13 07:14

    为什么要麻烦的使用寄存器设置引脚的输入输出呢

    的话很不方便,所以当我们被要求速度快的情况下,最好的办法就是直接操作寄存器。那该怎么配置寄存器呢?接下来我们通过STM32L031F4P6单片机举例子来看看怎么配置我们首先找到芯片的参
    发表于 02-25 06:33

    关于STM32的GPIO口的寄存器相关操作

    STM32 的寄存器,使用库函数开发人员得以脱离最底层的寄存器操作(不用天天去查中文参考手册,只需要知道需要配置哪些寄存器,然后直接在库种调用即可),使用库函数开发有开发快速、可移植性
    发表于 03-01 07:27

    STM32使用BSRR和BRR寄存器快速操作GPIO端口

    STM32的每个GPIO端口都有两个特别的寄存器,GPIOx_BSRR和GPIOx_BRR寄存器通过这两个寄存器可以直接对对应的GPIOx
    发表于 11-26 11:50 1次下载

    STM32单片机GPIO寄存器的功能解析

    对于GPIO端口,每个端口有16个引脚,每个引脚的模式由寄存器的四个位控制,每四位又分为两位控制引脚配置(CNFy[1:0]),两位控制
    发表于 12-04 14:54 1.2w次阅读
    STM32单片机<b class='flag-5'>GPIO</b><b class='flag-5'>寄存器</b>的功能解析

    GPIO寄存器

    ,一般高16位保留BSRR寄存器32位分为低16位BSRRL和高16位BSRRH,BSRRL配置一组IO口的16个IO口的状态(1),BSRRH配置复位状态(0)。每组GPIO端口的寄存器包括:4个32位配置
    发表于 12-08 17:06 5次下载
    <b class='flag-5'>GPIO</b><b class='flag-5'>寄存器</b>

    stm32是如何将寄存器通过标准库写入寄存器的?

    GPIO_Init函数3.总结0. 前言在平时的学习和工作中,可能很少有人会实际去操作寄存器,但是去了解库函数是如何去操作寄存器是很有必要
    发表于 12-16 16:58 18次下载
    stm32是如何将<b class='flag-5'>寄存器</b>值<b class='flag-5'>通过</b>标准库写入<b class='flag-5'>寄存器</b>的?

    STM32通过寄存器实现IO口取反

    通过按位异或,写ODR寄存器,如:GPIOB->ODR ^= GPIO_Pin_5; //对PB5 IO口取反在官方给的固件库中,有#define GPIO
    发表于 12-24 19:35 4次下载
    STM32<b class='flag-5'>通过</b><b class='flag-5'>寄存器</b>实现IO口取反

    操作寄存器设置引脚的输入输出

    的话很不方便,所以当我们被要求速度快的情况下,最好的办法就是直接操作寄存器。那该怎么配置寄存器呢?接下来我们通过STM32L031F4P6单片机举例子来看看怎么配置我们首先找到芯片的参
    发表于 01-12 20:36 3次下载
    <b class='flag-5'>操作</b><b class='flag-5'>寄存器</b>设置<b class='flag-5'>引脚</b>的输入输出

    【STM32】GPIO的相关配置寄存器、库函数、位操作

    STM32的每组GPIO口包括7个寄存器。也就是说,每个寄存器可以控制一组GPIO的16个GPIO口。这
    发表于 02-10 10:24 5次下载
    【STM32】<b class='flag-5'>GPIO</b>的相关配置<b class='flag-5'>寄存器</b>、库函数、位<b class='flag-5'>操作</b>