STM8-认识GPIO及输入输出模式

本文对STM8单片机进行简要介绍,并对GPIO输入输出模式进行介绍,对GPIO的相关寄存器配置进行介绍。

本STM8系列实验基于STM8S105C6芯片。相关参考手册可以访问ST官网获取。

GPIO简介

GPIO(General purpose input/output ports),即通用输入/输出口,用于芯片与外部的数据传输。一个I/O端口包含8个引脚,每个引脚可以被独立配置为数字输入或数字输出,部分引脚有模拟输入,外部中断等功能。打个也许不太恰当的比方,当我们的手接近火焰时会有缩手反射的现象,这个过程需要神经中枢的参与,手就像是外设,而单片机就像是神经中枢,手对于外界火焰的感知就好比输入,而神经中枢对输入的处理就好比单片机的软件处理,神经中枢所产生的神经冲动而导致缩手反射就好比输出。一个强大的系统离不开输入输出和中枢系统的协调配合。GPIO的配置是单片机编程中最基本,最常用的配置。LQFP48(7×7)封装的STM8S105C6可用I/O端口共38个(参考STM8/STM32选型手册)。不同型号的STM8芯片的可用I/O端口数量不一样,更多的I/O端口可以连接更多的外设,但也不要盲目求多,适用即可,比所用的预留一些即可,过多也是资源的浪费。

输入模式

STM8S系列芯片的GPIO输入模式有四种:

  • 悬浮不带中断输入
  • 悬浮中断输入
  • 上拉不带中断输入
  • 上拉中断输入

这里中断我们暂且不提,将输入方式分为悬浮输入和上拉输入。区分方式是从GPIO的内部结构来划分。

悬浮输入

悬浮输入,也叫浮空输入,顾名思义,即引脚悬空。这种方式的输入阻抗很高。当悬浮输入的引脚上加上信号时,单片机所得到的信号并不确定是高电平或是低电平,是一个不确定的信号。因而常用于模拟信号转换为数字信号的信号输入方式,例如ADC。

上拉输入

上拉输入也很好理解,即在引脚处接一个上拉电阻到内部电源。这种方式的优点是可以增强驱动能力,增强抗干扰性,同时上拉电阻也起到了一个限流的作用。根据ST官方提供的STM8S105XX系列数据手册,内部电源$ V_DD $ 通常为5.0V,在此条件下,上拉电阻的取值最小为30kΩ,最大为80kΩ,典型值为55kΩ(不知道为什么中文版的数据手册典型值为45kΩ)。可以计算得出此时电流的大小是μA级别,这是因为我们的上拉电阻取值很大,所以限流作用就相对较小,这也被称之为弱上拉输入模式,即Weak Pull-up(WPU)。

输出模式

STM8S系列输出模式有两种:

  • 推挽输出
  • 开漏输出

推挽输出

推挽输出(Push-pull output),也称为互补输出,推拉式输出。推挽输出模式导通损耗小,效率高。在此模式下,N-MOS、P-MOS两个MOS均被接入电路,通过输出控制寄存器控制两个MOS管的导通或关闭。正常工作状态下,仅有一个MOS管导通,另一个MOS管截止,从而可以自如地控制高低数字信号的输出。

开漏输出

开漏输出(Open drain output),有时简称为OD输出。相比推挽输出,GPIO结构中的P-MOS管没有被接入,无法输出高电平状态,需要外接上拉电阻。在没有外接上拉电阻,引脚悬空的状态下,端口引脚状态将不确定。上拉电阻阻值的大小会引起输出信号上升沿时间的变化,上拉电阻越小,上升沿时间越短,速度越快。开漏输出模式吸收电流能力强(一般在20mA以内),适用于电流型驱动。用作电流型驱动时,驱动电流由外部电源经上拉电阻给引脚连接的电路或器件,单片机内部几乎不需要提供驱动电流,减少了单片机自身功耗。利用开漏输出模式通过上拉电阻外接不同的电源还可以实现电平信号标准的转换。将多个开漏模式引脚连在一起,可以构成线与结构。

需要注意的是,有部分引脚具有“真正的”开漏输出功能。所谓“真正的”开漏输出指的是除了无P-MOS以外,也没有连接电源的保护二极管,即不存在任何电路连接到内部电源。在此模式下,必须加上拉电阻。

补充:保护二极管

GPIO引脚内部通常还会有一对反向连接电源地的保护二极管。以防止外部管脚输入电压过高或过低损坏引脚电路。通常为锗二极管,肖特基势垒二极管。

输入输出寄存器配置

简单地了解了输入输出模式,接下来我们将介绍如何配置相应的输入输出模式。查阅对应芯片系列的Reference manual(建议看原版,或者中英对照),查阅GPIO章节,与之相关的几个寄存器分别是Px_DDR,Px_IDR,Px_ODR,Px_CR1,Px_CR2,手册中详细地描述了每个寄存器的配置过程及功能。

  • 输出数据寄存器 ODR
  • 数据方向寄存器 DDR
  • 控制寄存器 CR1
  • 控制寄存器 CR2
  • 输入寄存器 IDR

如果我们需要IO输出一个低电平,需要如何操作呢?

  • 将DDR置1选择输出模式
  • 配置CR1,CR2选择输出模式
    • CR1:选择开漏输出或是推挽输出(有些翻译为上拉输出)
    • CR2:配置输出速率
  • 写ODR寄存器,STM8将通过锁存器输出对应的数值到I/O