一、什么是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. python学习笔记04-了解操作符与条件分支

    先来了解一下条件操作符: 运算符 描述 示例 == 检查两个操作数的值是否相等,如果是则条件变为真. 如a=3,b=3则(a == b) 为 true. != 检查两个操作数的值是否相等,如果值不相等 ...

  2. Spring Boot WebFlux-02——WebFlux Web CRUD 实践

    第02课:WebFlux Web CRUD 实践 上一篇基于功能性端点去创建一个简单服务,实现了 Hello.这一篇用 Spring Boot WebFlux 的注解控制层技术创建一个 CRUD We ...

  3. Windows10无线能连上但没有网络

    解决思路:重置widows10网络配置 步骤: 1.win+X键 2.在命令提示符窗口中,输入命令行:netsh winsock reset 3.然后按下回车键,这时就会提示重置Winsock目录成功 ...

  4. 最强阿里巴巴历年经典面试题汇总:C++研发岗

    (1).B树.存储模型 (2).字典树构造及其优化与应用 (3).持久化数据结构,序列化与反序列化时机(4).在无序数组中找最大的K个数? (4).大规模文本文件,全是单词,求前10词频的单词 (5) ...

  5. 40、Nginx 配置支持 WAF

    40.1 waf说明 1 WAF(Web Application Firewall),中文名叫做"Web应用防火墙". 2 WAF的定义是这样的:Web应用防火墙是通过执行一系列针 ...

  6. 初探 Redis 客户端 Lettuce:真香!

    一.Lettuce 是啥? 一次技术讨论会上,大家说起 Redis 的 Java 客户端哪家强,我第一时间毫不犹豫地喊出 "Jedis, YES!" "Jedis 可是官 ...

  7. yum安装GitLab-v11.11.8(git私服)

    GitLab 是一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,并在此基础上搭建起来的web服务.(跟github.gitee类似) 1. 安装依赖软件 $ yum -y install ...

  8. 暑假自学java第二天

    今天学习了一些java规则 一个java源文件的公开类只能有一个,而且必学和源文件名相同. 了解到java的标识符规范,这对以后的团队协作有很大作用. 标识符规则和c++还是很相似的 java中的字面 ...

  9. Linux:监测收集linux服务器性能数据工具Sysstat的使用与安装

    Sysstat是一个工具集,包括sar.pidstat.iostat.mpstat.sadf.sadc.其中sar是其中最强大,也是最能符合我们测试要求的工具,同时pidstat也是非常有用的东东,因 ...

  10. docker搭建数据库高可用方案PXC

    前言 本方案主要目的是学习, 该方案不太合适于企业项目 是什么? 白话点, 是个提供了必要环境的虚拟机(类似于java的导入部分包一样和c++的头文件差不多), 所以它比普通的VMWare或者Virt ...