一、什么是GPIO?

  GPIO的英文全称是General-Purpose IO ports,也就是通用输入输出口。

  在嵌入式系统中,经常需要控制许多结构简单的外部设备或者电路,这些设备有的需要通过CPU控制,有的需要CPU提供输入信号。并且,许多设备或电路只要求有开/关两种状体就够了,比如LED的亮与灭。对这些设备的控制,使用传统的串口或者并口就显得比较复杂,所以,在嵌入式微处理器上通常提供了一种“通用可编程I/O端口”,也就是GPIO。

  一个GPIO端口至少需要两个寄存器,一个做控制用的“通用IO端口控制寄存器”,还有一个是存放数据的“通用I/O端口数据寄存器”。数据寄存器的每一位是和GPIO的硬件引脚对应的,而数据的传递方向是通过控制寄存器设置的,通过控制寄存器可以设置每一位引脚的数据流向。

二、STM32中关于GPIO口的介绍

  在STM32中每个GPI/O端口有两个32位配置寄存器(GPIOx_CRL,GPIOx_CRH),两个32位数据寄存器(GPIOx_IDR和GPIOx_ODR),一个32位置位/复位寄存器(GPIOx_BSRR),一个16位复位寄存器(GPIOx_BRR)和一个32位锁定寄存器(GPIOx_LCKR)。

  根据数据手册中列出的每个I/O端口的特定硬件特征, GPIO端口的每个位可以由软件分别配置成多种模式。

     ─ 输入浮空

     ─ 输入上拉

     ─ 输入下拉

       ─ 模拟输入

     ─ 开漏输出

     ─ 推挽式输出

     ─ 推挽式复用功能

     ─ 开漏复用功能

三、常用GPIO口寄存器描述

  1、端口配置寄存器(GPIOx_CRL,GPIOx_CRH)

    GPIOx_CRL和GPIOx_CRH分别对应GPIO口的低8位和高8位输入输出口,每个寄存器的4位对应GPIO口的一个端口的配置模式,其中4位中的低两位代表配置为输入还是输出模式,记为MODEy[1:0],具体的模式配置情况如下:

   00:输入模式(复位后的状态)

     01:输出模式,最大速度10MHz

     10:输出模式,最大速度2MHz

11:输出模式,最大速度50MHz

 高两位通常对应于什么输入输出方式,记为CNFy[1:0],具体的模式配置情况如下:

   在输入模式(MODE[1:0]=00):

     00:模拟输入模式

     01:浮空输入模式(复位后的状态)  

       10:上拉/下拉输入模式

       11:保留

   在输出模式(MODE[1:0]>00):

       00:通用推挽输出模式

       01:通用开漏输出模式

       10:复用功能推挽输出模式

       11:复用功能开漏输出模式

  2、端口输入数据寄存器(GPIOx_IDR)

      位31:16 保留,始终读为0。

      位15:0   端口输入数据,这些位为只读并只能以字(16位)的形式读出。读出的值为对应I/O口的状态。

  3、端口输出数据寄存器(GPIOx_ODR)

     位31:16 保留,始终读为0。

      位15:0   端口输出数据,这些位可读可写并只能以字(16位)的形式操作。

  4、端口位设置/清除寄存器(GPIOx_BSRR)

  

  5、端口位清除寄存器(GPIOx_BRR)

  

四、一个简单的关于寄存器的操作

  MiniSTM32关于状态指示灯的连接

  由图示可以看出DS0和DS1分别接在GPIOA8和GPIOD2上,由此可以对寄存器的操作来实现流水灯实验

  void LED_Init(void)
  {
    RCC->APB2ENR |= 1 << 2; //使能PORTA时钟
    RCC->APB2ENR |= 1 << 5; //使能PORTB时钟
    GPIOA->CRH &= 0xFFFFFFF0;//清空PA8
    GPIOA->CRH |= 0x00000003;//将PA8设置成通用推挽输出模式
    GPIOA->ODR |= 1 << 8;       
    GPIOD->CRL &= 0xFFFFF0FF;//清空PD2
    GPIOD->CRL |= 0x00000300;//将PD2设置成通用推挽输出模式
    GPIOD->CRL |= 1 << 2;
  }

  int main(void)
  {
    Stm32_Clock_Init(9);     //初始化时钟
    delay_init(72);       //延时初始化
    LED_Init();               //配置相应寄存器

    while(1)
    {
      LED0 = 0;      //点亮DS0
      LED1 = 1;
      delay_ms(500);
      LED0 = 1;             //点亮DS1
      LED1 = 0;           
      delay_ms(500);
    }

  }

  

关于GPIO口的一些概念性问题的更多相关文章

  1. STM32f10xxx 之 GPIO口配置

    背景 配置stm32f103使其完成PWM输出的过程中,在配置GPIO口的时候,按照习惯配置GPIO口的speed为50MHZ,突然就意识到,为什么大部分例程习惯配置为50MHZ,而不是其它值,即有了 ...

  2. android gpio口控制

    android gpio口控制  GPIO口控制方式是在jni层控制的方式实现高低电平输出,类似linux的控制句柄方式,在linux系统下将每个设备看作一个文件,android系统是基于linux内 ...

  3. Silicon C8051F340之GPIO口配置与使用

    一.背景: 很久前用过C8051,现在有相关需求需要重新使用C8051,然后发现一年前开发的相关经验都忘得 基本上差不多了.连最基本的GPIO口配置还得重新来看手册,所以有此文,做个记录,以备下次快速 ...

  4. linux驱动初探之杂项设备(控制两个GPIO口)

    关键字:linux驱动.杂项设备.GPIO 此驱动程序控制了外接的两个二极管,二极管是低电平有效. 上一篇博客中已经介绍了linux驱动程序的编写流程,这篇博客算是前一篇的提高篇,也是下一篇博客(JN ...

  5. 基于boa服务器的web控制mini2440的GPIO口

    win7 系统  虚拟机:ubuntu12.04 开发板:mini2440 上一篇已经详细的讲解了如何配置boa服务器,在这里我们就要利用boa服务器带来的便利,利用web控制开发板上的GIPO口,这 ...

  6. STM32的GPIO口的输出开漏输出和推挽输出

    本文来自cairang45的博客,讲述了STM32的GPIO口的输出开漏输出和推挽输出, 作者博客:http://blog.ednchina.com/cairang45 本文来自: 高校自动化网(Ww ...

  7. ARM Cortex M3系列GPIO口介绍(工作方式探讨)

    一.Cortex M3的GPIO口特性    在介绍GPIO口功能前,有必要先说明一下M3的结构框图,这样能够更好理解总线结构和GPIO所处的位置. Cortex M3结构框图     从图中可以看出 ...

  8. STM32单片机在Keil5下仿真的问题解决及GPIO口初始化、使用

    STM32单片机在Keil5下仿真的问题解决及GPIO口初始化.使用 最近看了视频,里面有仿真,可以清楚看到GPIO口的数据变化,也想尝试下,DUG时却出现*** error 65: access v ...

  9. 51单片机GPIO口模拟串口通信

    51单片机GPIO口模拟串口通信 标签: bytetimer终端存储 2011-08-03 11:06 6387人阅读 评论(2) 收藏 举报 本文章已收录于:   分类: 深入C语言(20) 作者同 ...

随机推荐

  1. 【NX二次开发】批量数字签名的方法,解决自己电脑编译的dll在用户正版NX无法使用的问题

    在UG5.0开始,所有开发的DLL都要"签名"后才能被客户端上正版的NX调用. 1. 如果是基于c++开发的dll,使用如下方法可以顺利签名成功(这里借用网上现有的文字和图片) 1 ...

  2. 【C++】类

    一个简单例子: 1 //c++ 类 2 #include<iostream> 3 using namespace std; 4 class Point 5 { 6 private: 7 i ...

  3. 06:JS(02)

    对象 一切皆对象 数组(类似于python里面的列表) [] var l = [11,22,33,44,55] typeof l "object" var l1 = [11,'sd ...

  4. v-for和v-if不能同时使用

    如果使用v-for遍历数据时,想筛选出URL不为空的项并进行渲染 <ul> <li v-for="(item,index) in list" v-if=" ...

  5. Linux命令大全之基本命令

    命令提示符中:    ~:表示家目录   #:表示超级用户   $:表示普通用户 命令 [选项] [参数] ls(list):查询目录中的内容 ls  [选项]  [文件或目录] -a:显示所有文件, ...

  6. 使⽤Swagger2构建强⼤的RESTful API⽂档

    使⽤Swagger2构建强⼤的RESTful API⽂档 导语: 由于Spring Boot能够快速开发.便捷部署等特性,相信有很⼤⼀部分Spring Boot的⽤户会⽤来构建RESTful API. ...

  7. excel VBA中正则模块vbscript.regexp的用法

    一.是一个对象,用于执行 正则表达式! 二.有三个属性:      1. Global属性: True or False, 指明模式是匹配整个字符串中所有与之相符的地方还是只匹配第一次出现的地方.默认 ...

  8. Linux云计算-02_CentOS Linux 7.X系统管理

    Linux系统安装完毕,需要对Linux系统进行管理和维护,让Linux服务器能真正应用于企业中. 本章介绍Linux系统32位与64位区别.内核命名规则.引导原理.启动流程.TCP/IP协议概述.I ...

  9. ansible 配置详解

    ansible 安装方式 ansible安装常用两种方式,yum安装和pip程序安装.下面我们来详细介绍一下这两种安装方式. 使用 pip(python的包管理模块)安装 首先,我们需要安装一个pyt ...

  10. AcWing 1143. 联络员

    Tyvj已经一岁了,网站也由最初的几个用户增加到了上万个用户,随着Tyvj网站的逐步壮大,管理员的数目也越来越多,现在你身为Tyvj管理层的联络员,希望你找到一些通信渠道,使得管理员两两都可以联络(直 ...