嵌入式学习笔记之GPIO详解
duyiwuer11
duyiwuer11 Lv.5
2017年11月18日 11:06:56
来自于制冷技术
只看楼主

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

一、 什么是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编程实例:
  cppview plain copy print
  #include
  void delayint TImes
  {
  int i;
  for;TImes0;TImes--
  fori=0;i400;i++;
  }
  int mainvoid
  {
  int i;
  GPBCON =10000000000; /*配置GPB5为输出 (参考图1*/
  GPBUP =~100000; /*配置GPB5上拉电阻使能(参考图2*/
  fori=0;i10000;i++
  {
  /* LED1*/
  GPBDAT = ~100000; /*GPB5低电平*/
  delay1000;
  /* LED1*/
  GPBDAT = 100000; /*GPB5高电平*/
  delay1000;
  }
  }
...
 
其实上面的例子存在一个非常重要的问题,就是在配置某引脚的时候把其他引脚的值也进行了修改。在实际应用中,有可能其他引脚正在执行某操作,而我们这样进行配置的时候,修改掉其他引脚可能引发不可收拾的后果,那我们应该如何操作呢?
三、 引脚配置的按位“与”和按位“或”操作
先来看看上述代码用按位“与”和按位“或”操作修改之后的效果再来讲解:
cppview plain copy print
  #include
  #define GPF5_out 1《《(5*2))
  #define GPF5_msk 3《《(5*2))
  void delayint TImes
  {
  int i;
  for;times0;times--
  fori=0;i400;i++;
  }
  int mainvoid
  {
  int i;
  GPBCON &=~GPF5_msk; /*GPB5数据清零*/
  GPFCON |= GPF5_out; /*配置GPB5为输出 (参考图1*/
  fori=0;i10000;i++
  {
  /* LED1*/
  GPBDAT &= ~1《《5; /*GPB5低电平*/
  delay1000

免费打赏

相关推荐

APP内打开