一、什么是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. Mac下安装及配置Appium环境

    candiceli   Mac下安装及配置Appium环境 我是小白,自己研究appium好几周了. 一开始按照同事这篇文章设置Mac下的环境,http://www.cnblogs.com/tangd ...

  2. SQL Sever提权

    前言:渗透测试中提权是较为重要的环节,若以低权限身份进行后渗透,测试出的问题相对于高权限的质量会低很多,从一个普通用户,通过手段让自己变为管理员,也可利用操作系统或者应用程序中的错误,设计缺陷或者配置 ...

  3. 32.qt quick-PathView实现好看的home界面

    pathView的使用类似与ListView,都需要模型(model)和代理(delegate),只不过pathView多了一个路径(path)属性,顾名思义路径就是item滑动的路径. 一个Path ...

  4. rabbitmqctl 命令整理

    虽然还有http 接口.web admin组件可以进行管理,但是rabbitmqctl 基本包含了 rabbitmq 的全部管理功能,更为全面. 所以将其使用方法总结于此. 一,命令格式 rabbit ...

  5. STP协议与MSTP协议

    STP协议与MSTP协议 目录 一.STP概述 1.1.交换网络环路的产生 1.2.STP简介 二.生成树算法 2.1.生成树算法的步骤 2.2.网桥 ID 2.3.选择根端口 2.4.选择指定端口 ...

  6. 一次 RocketMQ 顺序消费延迟的问题定位

    一次 RocketMQ 顺序消费延迟的问题定位 问题背景与现象 昨晚收到了应用报警,发现线上某个业务消费消息延迟了 54s 多(从消息发送到MQ 到被消费的间隔): 2021-06-30T23:12: ...

  7. JavaScript实现的7种排序算法

    所谓排序算法,即通过特定的算法因式将一组或多组数据按照既定模式进行重新排序.这种新序列遵循着一定的规则,体现出一定的规律,因此,经处理后的数据便于筛选和计算,大大提高了计算效率.对于排序,我们首先要求 ...

  8. Qt之先用了再说系列-串口通讯(单串口单线程)

    QT 串口通讯(单串口单线程) 串口通讯在我们写程序的时候或多或少会用到,借此在这记录一下QT是如何使用串口来通讯的.本次先侃侃在单线程下使用1个串口来通讯过程.好了,废话不多说,直接看步骤,我们的宗 ...

  9. Gerrit+replication 同步Gitlab

    配置环境:gerrit 192.168.1.100gitlab 192.168.1.1011.创建秘钥 [root@gerrit ~]# ssh-keygen -m PEM -t rsa 2.添加ho ...

  10. POJ 1696 Space Ant 点积计算夹角

    题意: 一只特别的蚂蚁,只能直走或者左转.在一个平面上,有很多株植物,这只蚂蚁每天需要进食一株,这只蚂蚁从起点为(0,miny)的点开始出发.求最多能活多少天 分析: 肯定是可以吃到所有植物的,以当前 ...