一、什么是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. 【SQLite】教程09-VBA读取SQLite数据之ODBC,及中文乱码问题

    VBA使用ODBC Driver for SQLite读SQLite 如下图有这么一个SQlite数据库,我们要读取它 需要先安装ODBC,可以从这里下载: SQLite 3 ODBC Driver ...

  2. 如果你这么去理解HashMap就会发现它真的很简单

    Java中的HashMap相信大家都不陌生,也是大家编程时最常用的数据结构之一,各种面试题更是恨不得掘地三尺的去问HashMap.HashTable.ConcurrentHashMap,无论面试题多么 ...

  3. Scala语言笔记 - 第三篇(容器方法篇)

    Scala语言笔记 - 第三篇(容器方法篇) 目录 Scala语言笔记 - 第三篇(容器方法篇) map和flapMap方法: ​ 最近研究了下scala语言,这个语言最强大的就是它强大的函数式编程( ...

  4. IDEA拷贝类路径

    1.方法一 1.1.鼠标右击需要复制的类 1.2.点击 Copy Reference 2.方法二 快捷键:Ctrl + Alt + Shift + C

  5. Netty 框架学习 —— 单元测试

    EmbeddedChannel 概述 ChannelHandler 是 Netty 程序的关键元素,所以彻底地测试它们应该是你的开发过程中的一个标准部分,EmbeddedChannel 是 Netty ...

  6. url参数接收的一些安全应用场景

    越权漏洞,从原来的修改id越权到后面的自己加参数,减参数越权,到现在的加特殊字符.攻击手段在进步: 以php和java为例,聊聊参数接收的最大接受能力,可以插入哪些脏数据? demo1.php: &l ...

  7. OSPF多区域原理与配置

    OSPF多区域原理与配置 目录 一.OSPF多区域生成 1.1.生成OSPF多区域的原因 二.OSPF的三种通信量 2.1.域内通信量 2.2.域间通信量 2.3.外部通信量 三.OSPF的路由器类型 ...

  8. external-provisioner源码分析(3)-组件启动参数分析

    更多ceph-csi其他源码分析,请查看下面这篇博文:kubernetes ceph-csi分析目录导航 external-provisioner源码分析(3)-组件启动参数分析 本文将对extern ...

  9. Typecho 安装教程 -- Linux

    1.下载宝塔面板 1 使用 SSH 连接工具,如堡塔SSH终端连接到您的 Linux 服务器后,挂载磁盘,根据系统执行相应命令开始安装(大约2分钟完成面板安装): 2 Centos安装脚本 yum i ...

  10. css角标

    HTML: <div class='card-wrap'> <div class='news1'> <div class='ribbon'> <div cla ...