1.GPIO 简述:

  通用输入输出(General Purpose Input Output)的简称,就是芯片引脚可以通过他们输出高电平或者低电平,也可以通过他们读取引脚的电平状态。

  以STM32F407ZGT6芯片为例(后面都是以这种芯片为例),这种芯片共有112个I/O口,共7组,每组16个引脚(0~15),可以通过配置寄存器来确定某个引脚用于输入、输出还是其他特殊功能。想要什么功能,使用之前先配置,其中默认为输入浮空模式。

在一个芯片内部,CPU通过地址来设别片内外设。分配给每个硬件外设的地址就是外设的寄存器地址。CPU通过寄存器操作片内外设。GPIO口对应的地址如下图:

寄存器:是一个存储器,它存储了控制硬件怎么运行、硬件运行的状态。

变量:当我们定义一个变量的时候,编译器会帮我们在RAM中申请一个存储空间。

变量和寄存器的不同点:变量的意义由程序员决定,而寄存器每一位代表的意义由设计芯片的人决定。  

  每个通用 I/O 端口包括 4 个 32 位配置寄存器(GPIOx_MODER、 GPIOx_OTYPER、GPIOx_OSPEEDR 和 GPIOx_PUPDR)、 2 个 32 位数据寄存器(GPIOx_IDR 和GPIOx_ODR)、 1 个 32 位置位/复位寄存器 (GPIOx_BSRR)、 1 个 32 位锁定寄存器(GPIOx_LCKR) 和 2 个 32 位复用功能选择寄存器(GPIOx_AFRH 和 GPIOx_AFRL)。 

2.GPIO主要特性

  (1)每组GPIO口都有16个端口,端口编号为0~15。

  (2)在输出状态下可设置成推挽输出或开漏输出,以及根据需要决定是否开启上拉/下拉功能。

  (3)每个GPIO端口都可以设置成通用模式和复用模式。

  (4)每个GPIO端口可以配置不同的输出速度。

  (5)在输入状态下,可设置为浮空输入、上拉/下拉输入以及模拟输入。

  (6)可以利用置位和复位寄存器(GPIOx_BSRR)对输出数据寄存器(GPIOx_ODR)进行按位写操作。

  (7)可以利用端口配置寄存器(GPIOx_LCKR)对GPIO端口进行冻结配置。

  (8)通过复用功能输入/输出选择寄存器可以设置GPIO端口的复用功能。

3.GPIO每个端口都可以由软件配置成如下几种模式:

  1. 输入浮空:在浮空输入状态下,GPIO的电平状态是不确定的,完全由外部输入确定。如果在悬空状态下读取GPIO口,得到将是一个不确定的电平值。一般用于处理信号方面。
  2. 输入上拉:在没有外界输入的情况下,能够让GPIO口在没有连接信号的时候有一个确定的高电平信号。一般用于对输入的电平信号进行检测。
  3. 输入下拉:在没有外界输入的情况下,能够让GPIO口在没有连接信号的时候有一个确定的低电平信号。一般用于对输入的电平信号进行检测。
  4. 模拟功能:芯片内部ADC或DAC的专用功能
  5. 具有上拉或下拉功能的开漏输出:开漏输出也叫断开输出。可以正常的输出低电平(0),但是没有输出高电平(1)的能力。如果需要输出1,则需要配置成上拉功能的开漏输出。注意:芯片内部的上拉属于弱上拉,驱动能力很小,如果要获得较强的驱动能力,需要在芯片外部外接上拉电阻。
  6. 具有上拉或下拉功能的推挽输出推挽输出即可以输出高电平(1),也可以输出低电平(0)
  7. 具有上拉或下拉功能的复用功能推挽:当GPIO口做为第二功能时配置层推挽输出模式。复用功能是指GPIO端口的第二功能,也就是片内外设模块的管脚专用功能。
  8. 具有上拉或下拉功能的复用功能开漏:当GPIO口做为第二功能时配置层开漏输出模式。

4. 5 V 容忍 I/O 端口位的基本结构

  需要配置什么功能,要结合实际外部电路图来分析

5.GPIO端口位配置表(查数据手册所得)

6.GPIO输入配置

  对IO端口配置为输入时,TTL施密特触发器被打开,输出缓冲器被关闭(也就是输出电路管脚断开),根据GPIOx_PUPD寄存器(并结合实际电路)决定是否打开上/下拉(需要有明确的电平),对输入数据寄存器只有读操作。

7.输出配置

  配置IO口为普通功能输出时,输出缓冲器被打开(注意:开漏模式时,输出寄存器中的‘0’可激活N-MOS,‘1’会使端口保持高阻态,基本没作用,P-MOS始终不激活;推挽模式时,输出寄存器的‘0’激活N-MOS,‘1’激活P-MOS),施密特触发器也会被打开,用于监控管脚的实际电平状态,根据实际情况决定是否需要上下拉,输入寄存器仍然可读

8.复用功能配置

  IO配置为复用功能时,可将输出缓冲器配置为开漏或者推挽,输出缓冲器来自外设的信号驱动,施密特触发器也被打开(但是输入输出是独立存在的),可根据实际情况配置上下拉,可对输入数据寄存器读取IO状态。

9.模拟功能

输出缓冲器被禁止,施密特触发器输入停用, I/O 引脚的每个模拟输入的功耗变为零。施密特触发器的输出被强制处理为恒定值 (0)。弱上拉和下拉电阻被关闭。对输入数据寄存器的读访问值为“ 0”。

10.配置示范

    如果GPIO要配置成推挽式输出功能,速度为50M,则对应的位配置为:

MODER[1:0]

OTYPER

OSPEEDR[B:A]

PUPDR[1:0]

01

0

10

00

    如果GPIO要配置成输入功能,则对应的位配置为:

MODER[1:0]

OTYPER

OSPEEDR[B:A]

PUPDR[1:0]

00

/

/

01/10

    如果GPIO要配置成复用功能,则对应的位配置为:

MODER[1:0]

OTYPER

OSPEEDR[B:A]

PUPDR[1:0]

10

/

/

/

11.需要配置相关寄存器

  (1)  RCC AHB1外设时钟使能寄存器(RCC_AHB1ENR):配置IO功能模式时,先使能对应时钟,相关GPIO位置1使能

      如果使能GPIOB组时钟,则寄存器配置为:

      RCC->AHB1ENR |= 1x01 << 1;   //使能GPIOB组时钟

  (2)GPIO 端口模式寄存器 :配置IO工作模式(2位控制一个IO管脚):先对操作的位清零,再置相关的值

    例如把GPIOB的端口8配置成复用模式,则寄存器配置为:

    GPIOB->MODER &= ~(3 << 16);    //把MODER寄存器的16,17位清零

    GPIOB->MODER |= 2 << 16;       //把端口8设置成复用模式

  (3)GPIO 端口输出类型寄存器 (GPIOx_OTYPER) :0:推挽输出、1:开漏输出

        例如把GPIOA的端口8输出方式位开漏输出,则寄存器配置为:

        GPIOA->OTYPER |= 1x01 << 8;

  (4)GPIO 端口输出速度寄存器 (GPIOx_OSPEEDR)

  (5)GPIO 端口上拉/下拉寄存器 (GPIOx_PUPDR)

  (6)GPIO 端口输入数据寄存器 (GPIOx_IDR):对其只有读操作

    用于读取对应的GPIO口输入的高低电平。一个位对应于一组 IO 中的一个引脚。读取结果是 1,表示该 IO 引脚是高电平,结果是 0,则表示对应 IO 引脚是低电平。

  (7)GPIO 端口输出数据寄存器 (GPIOx_ODR)(x = A~G)

  (8)GPIO 端口置位/复位寄存器 (GPIOx_BSRR)(x = A~G):

      注意:当一个端口同时设置了置1位和清零位,那么置1位有效,对相关为写1以后,相应的功能实现后,自动清除。

输出寄存器(GPIOx->ODR)和置位/复位寄存器 (GPIOx_BSRR)区别:

         例:在GPIOB的端口7输出高电平

1)    使用ORD寄存器

GPIOB->ODR |= 1 << 7;

程序执行步骤:

①   读取ODR寄存器的值

②   把读出来的值和1 <<7进行按位或运算

③   把计算后的值再写入ODR寄存器

2)    使用BSRR寄存器

GPIOB->BSRRL = 1 << 11;

程序执行步骤:

把1<<7的值写入BSRR寄存器

  (9)GPIO 端口配置锁定寄存器 (GPIOx_LCKR)(x = A~G):起到锁定某个管脚的模式、输出类型、输出速度、上下拉的作用,当模块复位后锁定会被取消

  (10)GPIO 复用功能低位寄存器 (GPIOx_AFRL)  :需要查相关复用功能对应的值

  (11)GPIO 复用功能高位寄存器 (GPIOx_AFRH)

对寄存器的计算,可画出来理解:

  GPIOF->MODER  &=  (~(0X03<<12));

---->

  GPIOF->MODER  =  GPIOF->MODER  &  (~(0X03<<12));

  XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX

  1111 1111 1111 1111 1100 1111 1111 1111

  XXXX XXXX XXXX XXXX XX00 XXXX XXXX XXXX

  GPIOF->MODER  |=   0X01<<12;

--->

  GPIOF->MODER =  GPIOF->MODER | 0X01<<12;

  XXXX XXXX XXXX XXXX XX00 XXXX XXXX XXXX

  0000 0000 0000 0000 0001 0000 0000 0000

  XXXX XXXX XXXX XXXX XX01 XXXX XXXX XXXX

12.GPIO口初始化步骤:(以LED1 、4灯为例):由电路图分析,可知LED4由PC0管脚控制,并且是不用上下拉的推挽输出模式

void Led_Init(void)

{

/* 1.使能GPIO口时钟 */

    RCC->AHB1ENR |= 1 << 2 ;          /* 使能GPIOC端口时钟 */

/* 设置GPIO工作模式 */

  GPIOC->MODER &= ~(3 << (0 * 2));   /* 把MODER寄存器0,1位清零 */

  GPIOC->MODER |= 1 << (0 * 2);        /* PC0设置成通用输出模式 */

/* 设置GPIO输出方式 */

  GPIOC->OTYPER &= ~(1 << 0);        /* PC0输出方式为推挽输出 */

/* 设置GPIO输出速度 */

  GPIOC->OSPEEDR &= ~(3 << (0 * 2));   /* 把OSPEEDR寄存器12,13位清零 */

  GPIOC->OSPEEDR |= 2 << (0 * 2);      /* PC6输出速度50M */

/* 设置上下拉模式 */

  GPIOF->PUPDR &= ~(3 << (0 * 2));     /* PC0不需要无上/下拉 */

/* 设置GPIO初始输出 */

  GPIOC->ODR |= 1 << 0;             /* GPIOC.0初始化状态为输出高电平 */

}

转载于:https://www.cnblogs.com/qingbangbang/p/m4_GPIO_bangbang.html

M4——GPIO配置相关推荐

  1. DSP 28335中GPIO配置

    F28335有三种32位的I/O口,依次PORTA(GPIO0-GPIO31),  PORTB(GPIO32-GPIO63),  PORTC(GPIO64-GPIO87),这些口都可以配置为普通的数字 ...

  2. MTK 驱动开发(2)---GPIO 配置

    1.GPIO 配置 拿到一个手机项目,GPIO 总是和MTK 提供的默认的代码的GPIO 的使用不一样,需要根据原理图进行修改GPIO配置,配置GPIO 需要使用MTK 提供的工具DrvGen.exe ...

  3. GPIO 配置之ODR, BSRR, BRR 详解

    STM32 GPIO 配置之ODR, BSRR, BRR 详解 用stm32 的配置GPIO 来控制LED 显示状态,可用ODR,BSRR,BRR 直接来控制引脚输出状态. ODR寄存器可读可写:既能 ...

  4. STM32F1模拟iic的GPIO配置(小总结)

    最近学习,发现需要总结一下模拟iic的gpio配置,相信你懂得,但是最好还是需要理解清楚. 1.初始化GPIO void IIC_Init(void) { GPIO_InitTypeDef GPIO_ ...

  5. 国民技术GPIO配置推挽输出模式

    GPIO配置是在开发单片机常用的.下面就来介绍如何将GPIO配置推挽输出模式. typedef enum {GPIO_Mode_Input = 0x00000000, /*!< Input Fl ...

  6. STM32CubeMX——GPIO配置

    STM32CubeMX--GPIO配置 说明 GPIO-output 配置部分 新建工程 配置系统时钟 配置GPIO引脚(以PB15为例) 配置时钟树 项目文件设置 代码部分 函数说明 应用举例 GP ...

  7. 【SemiDrive源码分析】【驱动BringUp】13 - GPIO 配置方法

    [SemiDrive源码分析][驱动BringUp]13 - GPIO 配置方法 一.Android Linux 下 GPIO 配置方法(AP1 Domain - 6 * A55) 1.1 Kerne ...

  8. TMS320F283743之GPIO配置

    介绍 TMS320F28374S具有12路独立外设接口可供CPU的GPIO使能端口控制,每个端口都可以被外设或者位两个CPU中的主机控制,以下位具体端口: • Port A consists of G ...

  9. STM32编程(一)STM32 GPIO配置的4大步骤

    GPIO配置的4大步骤 前言:只要初始化了GPIO完成后 在主函数中调用GPIO_SetBits(xxxx),GPIO_ResetBits(xxxx)就可以控制它的引脚了. 1  定义GPIO引脚的结 ...

最新文章

  1. 算法设计与分析 搜索第k元
  2. python 回溯法 01背包问题_Python回溯法解决01背包问题
  3. 二叉树的先序线索化、中序线索化、后序线索化的对比
  4. 丁丁打折网卷能用吗_跳槽频繁的人能用吗?
  5. 使用ngModel创建组件
  6. 京东炸年兽活动一键做任务工具v1.7
  7. java list 对象 json字符串_Java中Json字符串直接转换为对象的方法(包括多层List集合)...
  8. (12)Verilog HDL变量:reg型
  9. UVA454 Anagrams【set+排序】
  10. @font-face 字体图标的应用
  11. Docker 学习5 Docker容器网络
  12. MyBatis自动生成步骤
  13. 计算机专业代码qian,专业分类号及学科代码对照表.doc
  14. 推荐 10 款适合 C/C++ 开发人员的 IDE
  15. pythonnumpy官网_Numpy安装
  16. android弹窗不能手动关闭_如何检测弹窗、并关闭相应的安卓弹窗
  17. ADS,AXD基本使用说明
  18. 室内导航html,室内定位导航地图一体化设计
  19. PHP做大转盘抽奖的思路,PHP实现大转盘抽奖算法(代码实例)
  20. meo学习笔记2:函数重载(C++)

热门文章

  1. groupadd命令详解
  2. 面向对象 之 设计模式
  3. 【娱乐】王者荣耀·[优选秘宝]抽奖模拟程序
  4. 牛客网题库分享--final byte
  5. html5水滴动画,HTML5 TweenMax.js 水珠滴落动画
  6. 个人笔记:算法讲座3.2——魔法石(棋盘最优路径)
  7. 查看mysql数据库容量大小
  8. 第四课 cocosCreator基础与开发环境
  9. Linux 创建用户和权限
  10. [转贴]一个老程序员的心里话