GPIO通用输入输出端口

GPIO概述

GPIO的定义

  • 单片机的GPIO资源是实现单片机信号发生、接收或控制的一种资源

  • STM8的通用输入输出端口用于芯片和外部设备或电路进行数据传输

    一组GPIO端口可以包含8个引脚,每个引脚可以被独立配置为数字输入或者输出口

  • 通过对单片机编程就可以控制相关的GPIO资源,实现不同的功能

    比如,要某引脚作为外部模拟信号的输入通道,就应该配置为悬浮输入模式

    具体的配置方法见下文 GPIO配置流程

GPIO的引脚说明

  • 要先了解当前使用的单片机的GPIO引脚资源,这需要查阅数据手册的 储存器与寄存器映像
  • 比如:STM8S105 采用 LQFP48 封装形式,表示该单片机有48个引脚,查阅引脚说明 可知道各个引脚的 管脚名称、类型、主功能(复位后)与默认复用功能

GPIO的分组

  • 单片机具备的端口可以分为几组GPIO端口,分别是:PA/PB/PC/PE/PF……有的型号引脚较多,可以分为更多组

    每组最多有8个引脚,标号为Px0~Px7(但不一定都有8只)

  • 相同端口组的GPIO在芯片引脚上的顺序未必是连续的,需要注意标识以免连错


GPIO的功能

GPIO输入功能

  • 悬浮输入模式

    又称浮空输入,这种结构下引脚电平状态不确定,会受到外部信号干扰而改变

    输入抗阻很高,可用于模拟信号转数字信号,对引脚电压量进行采集等

  • 中断悬浮输入模式

    启用中断的悬浮输入

  • 上拉输入模式

    上拉,即将引脚上不确定(端口悬空或处在高阻态)的电平信号通过一个上拉电阻到高电平,这个电阻同时起到限流的作用(下拉同理)

    上拉作用的强度 和 施加在上拉电阻端电压大小 与电阻阻值有关:电压一定情况下,上拉电阻阻值越大,上拉作用就越弱

  • 中断上拉输入模式

    启用中断的上拉输入

GPIO输出功能

  • 推挽输出模式

    又称互补输出或推拉式输出,推挽电路由两个三极管或MOS管构成,电路工作时两个对称的开关管只有一个导通,所以导通损耗小、效率高

    两个MOS管以推挽方式存在于电路中,如需输出高电平,则内部输出控制电路会控制P沟道MOS管导通而N沟道MOS管关闭,输出低电平则相反

    这种结构既可以向负载提供驱动电流,也可以从负载吸入电流。一方面提高了电流负载能力,另一方面也提高了开关速度

    这种情况下适用推挽输出:

    • 当单片机的IO口资源充足,不需要将多个输出端连接在一起时。
    • 当单片机需要直接驱动负载,且负载不需要太高的电流。
    • 当设计的电路不需要实现线与(wire-and)功能时。
  • 开漏输出模式

    单片机端口内部道路实现是由三极管组成且三极管的集电极为开路状态,则称该电路结构为开集结构,缩写OC;而由MOS管实现且漏极为开路状态,则称该电路结构为开漏结构,缩写OD

    开漏结构输出与开集输出都无法输出高电平状态,若要得到确定的高电平状态则需要外接上拉电阻,否则引脚电平状态不确定;吸收电流能力较强(20mA以内)

    这种情况下适用开漏输出:

    • 当单片机的IO口驱动能力有限,需要外部上拉电阻来提高电流驱动能力时:开漏输出依靠外接上拉电阻才能输出高电平,驱动电流大多由外部电源经过上拉电阻提供给引脚所连电路或器件的,减少了单片机自身功耗
    • 用于电平信号标准的转换,外部上拉电阻的外加电压不确定,也可以灌入较大的电流,间接实现电平转换
    • 需要线与功能时:多个开漏模式引脚连在一起,可以实现“与”逻辑,无论端口电平怎么变,只要一个为低电平,则线路上电平为0,除非所有端口都是高电平才能为1
    • 需要额外的灵活性时:通过改变上拉电阻可以调节电路,上拉电阻阻值大小可以引起输出信号上升沿时间的变化:阻值小,上拉作用强,上升速度快;阻值大,上拉作用弱,上升时间长

    STM8大部分引脚都可以配置为开漏输出,但只有少数引脚是真正的开漏输出(引脚内部不存在上拉至数字电源的P沟道MOS管,也没有与数字电源相连的保护二极管,即这种引脚不能被配置为推挽输出)

GPIO引脚功能复用

  • 部分端口可能还有如模拟输入、外部中断、片上外设输入输出等复用功能,但同一时刻仅有一个复用功能可以映射到引脚上

    在单片机的手册中可以查阅引脚功能,例如STM8S208MB单片机的第10引脚说明为PA4/UART1_RX,表示PA端口组4号引脚与串口资源1的数据接收引脚是同一引脚

  • 通过配置相关资源寄存器可以启用复用功能

  • 部分GPIO端口可以用作复用输入功能,复用的输入功能不会自动选择,需通过写相应的外设寄存器控制位来选择复用功能:必须通过配置对应端口引脚的数据方向寄存器和控制寄存器,将对应的GPIO引脚设置为悬浮输入模式上拉输入模式

  • 复用输出功能可以是推挽输出开漏输出模式,具体配置取决于外设本身的功能需求和端口引脚相关寄存器(包括端口引脚控制寄存器1 Px_CR1与控制寄存器2 Px_CR2的值)

  • 对于多个复用功能的映射则通过选项字节控制

    某些存在两种或以上功能的引脚为多重功能复用,此情况经常用到选项字节对相关的选项位进行配置

GPIO引脚外部中断

  • 单片机中断处理机制

    在实际应用中可以获取GPIO电平状态,然后根据程序逻辑控制GPIO输出

    但获取状态必须先将GPIO引脚设置为输入模式,再读取输入寄存器,如此不断地判断与查询非常占用CPU资源

    为此引入中断机制,让引脚在发生某动作事件时才通知CPU处理

  • 配置外部中断功能

    在配置GPIO引脚为输入模式时,设置控制寄存器2(Px_CR2)中相应位来启用或关闭某GPIO引脚外部中断功能。

    配置完成后,当GPIO引脚上出现了特定的边沿或电平状态时就会产生一个中断请求给CPU

    在启用引脚外部中断功能后,再配置外部中断控制寄存器(EXT1_CR1或EXT1_CR2)中相关位将中断向量进行独立编程,从而满足不同要求的触发

    只有引脚被设置为输入模式时(悬浮输入或弱上拉输入模式)外部中断功能才有效,在复位和上电时外部中断功能默认为禁止状态

GPIO引脚电气性能

  • GPIP功能由内部电路结构控制和实现,具备相关的电气性能,了解其电气特性后可以准确选型和进行外设电路的搭建

  • 查阅数据手册 电气特性

  • 绝对电气特性

    绝对最大额定值,包括多种电压与电流特性,施加在单片机上的载荷超过此值将造成损坏,但在不超过的情况下长期在此值下工作也会影响器件

  • GPIO内部保护二极管:保护GPIO端口引脚可以承受5V电压而不至于芯片烧毁

  • 静态电气特性

    包括输入低电平、高电平、上拉电阻、上升沿与下降沿的时间等特性

  • 电流电气特性

    输出驱动电流的的特性:包括标准端口、大电流端口、真正的开漏端口


GPIO配置流程

GPIO相关寄存器

每个GPIO端口(设其标号为端口x)都分配有以下寄存器:

  • 输出数据寄存器Px_ODR

    在对应GPIO配置为输出模式时,用这个寄存器存放要输出的信号

  • 输入数据寄存器Px_IDR

    在对应GPIO配置为输入模式时,用这个寄存器存放被输入的信号

  • 数据方向寄存器Px_DDR

    用来控制引脚用于输入或输出,引脚对应位配置为0则输入,1为输出

  • 控制寄存器Px_CR1/2

    CR1用于控制引脚的模式,在输入模式下CR2用于控制引脚中断的启用

  • GPIO功能配置和寄存器相关功能位对应关系如下:

  • 注意:当启用片内模拟/数字转换ADC功能时,可以选择指定的GPIO引脚作为模拟信号的输入通道,配置方式如下:

  • 在实际编程中欲使用GPIO端口,需要在工程文件中编写相关GPIO资源的初始化函数,可以自定义函数名称为GPIO_init(),函数中对相应的寄存器进行配置,以确定GPIO引脚的输入/输出方向,输入/输出模式、是否启动外部中断与端口输出速率,具体流程如下:

配置方法

  • 使用C语言配置

    使用C语言编写程序,直接使用16位数配置端口,而若欲改变端口中的某几位,可使用C的按位与&以及按位或|操作,如下:

    PB_DDR |= 0x44;
    //原先PB_DDR为0000 0000,0x44对应二进制0100 0100
    //按位或运算使得两个十六进制数中其中一个有1则那位变为1
    //结果是配置PB6和PB2为1输出,其它为0输入
    
  • 配置使用的数据类型
    • 对于8位单片机,寄存器含有8个二进制位,常使用一个无符号8位整数类型(范围是0-255)进行定义和操作,这个类型是uint8_t,同理有uint16_tuint32_t
    • 需要包含头文件#include "stdint.h"
    • 这些类型在C99中定义,实际上并非新类型,而是使用typedef为无符号整数命名(比如uint8_t实际上是char,直接输出得到的是字符而非数字),由于不同平台字长不同,为了跨平台方便使用预编译和typedef保证类型一致
    • 为了使用方便,往往将uint8_t再次使用typedef命名为u8

代码实现

  • GPIO输入功能配置
    //例如:将PB组端口设置高4位中断悬浮输入,低4位不带中断上拉输入
    PB_DDR = 0x00;//0000 0000,全部为0,输入
    PB_CR1 = 0x0F;//0000 1111,高四位为0悬浮输入,低四位为1上拉输入
    PB_CR2 = 0xF0;//1111 0000,高四位为1启用中断,低四位为0禁用中断
    

    完成配置后,就可以读入端口输入数据数据寄存器Px_IDR中的内容

    x = PB_IDR;//在完成上述配置后,读取端口的状态赋值给变量x
    
  • GPIO输出功能配置
    //PB组设置为高4位开漏2MHz速率输出,低四位10MHz推挽输出
    PB_DDR = 0xFF;//1111 1111,全部为1,输出
    PB_CR1 = 0x0F;//0000 1111,高四位为0开漏输出,低四位为1推挽输出
    PB_CR2 = 0x0F;//0000 1111,高四位为0 2MHz速率,低四位为1 10MHz速率
    

    完成配置后,就可以将欲输出的内容写入端口输出数据寄存器Px_ODR

    PB_ODR = 0x57;//0101 0111,用户自定义输出,1为低电平,0为高电平
    

posted on 2024-11-16 21:47  无术师  阅读(38)  评论(0编辑  收藏  举报