1.3 通用I/O口
STM8S单片机的I/O口又称通用输入/输出口(General purpose I/O port,GPIO),用于芯片和外部进行数据传输。STM8S208RB单片机有8组I/O端口,完整的一组I/O端口由8个引脚构成,每个引脚可以被独立编程,作为数字输入或者数字输出使用,部分接口还可以编程为模拟输入、外部中断、片上外设的输入/输出等复用功能。这里需要说明的是,一个引脚虽然具有多个功能,但在同一时刻只能使用其中的一个功能。
1.3.1 GPIO的特点
STM8S208RB单片机的每组端口都分配有专用的输出数据寄存器、输入引脚寄存器、数据方向寄存器、选择寄存器和配置寄存器。STM8S系列单片机I/O口的输入、输出状态是由数据方向寄存器决定的,在使用时需要进行单独设定,这一点和51单片机是不同的。STM8S208RB单片机GPIO的主要特点如下:
·当引脚被配置成输入模式时,有浮动输入或上拉输入两种选择。
·当引脚被配置成输出模式时,可选择推挽输出或开漏输出模式。
·数据输入和输出采用独立的寄存器。
·端口的外部中断可以单独使能或关闭。
·可编程输出摆率控制,可以减少EMC噪声。
·作为模拟输入时,可以关闭输入施密特触发器以降低功耗。
STM8S208RB单片机引脚的内部结构如图1-7所示。每一组端口都有一个输出数据寄存器(ODR)、一个引脚输入寄存器(IDR)、一个数据方向寄存器(DDR)与之对应。另外还有控制寄存器1(CR1)和控制寄存器2(CR2)用于对端口的输入/输出模式进行配置。ODR、DDR、CR1和CR2寄存器的每一位都与相应的I/O口相对应,任何一个I/O引脚可以通过对这些寄存器的相应位进行编程来配置。
我们来简单分析一下I/O口的工作原理。当I/O口被设置成输出状态时,数据总线上的输出数据被放置于ODR寄存器中。当ODR寄存器的对应位为0时,I/O口的输出端P沟道场效应管截止,而N沟道场效应管导通,引脚输出低电平。当ODR寄存器的对应位为1时,I/O口的输出端P沟道场效应管导通,而N沟道场效应管截止,引脚输出高电平。引脚内部的两个保护二极管用于保护内部电路不会因过压而损坏。
当引脚被设置成输入状态时,分两种情况:一种情况是该引脚与模拟输入复用,当工作于模拟状态时,引脚上的模拟电压会被直接送入片内A/D转换通道,用于对模拟电压进行采样。另一种情况是引脚被设置为数字输入,引脚上的数字电压信号被送入施密特触发器,用于判定输入数据的状态(0或1),之后数据被放置于IDR寄存器中等待读取。ADC_TDR寄存器用于在A/D转换器工作时关闭施密特触发器以降低功耗。

图1-7 引脚内部结构
1.3.2 GPIO的配置
GPIO的配置是通过DDR、CR1和CR2三个寄存器来完成的,其配置方式详见表1-7。
1.输入模式
将DDR寄存器的相应位清零可以选择输入模式。在该模式下,读IDR寄存器的位将返回对应I/O引脚上的电平值。当I/O引脚被配置成输入时,可以通过软件配置CR1和CR2寄存器,得到4种不同的输入模式:悬浮不带中断输入、悬浮带中断输入、上拉不带中断输入和上拉带中断输入。这里需要特别说明的是:不是所有的端口都具有外部中断能力和上拉功能,这一点需要在应用时灵活掌握。
2.输出模式
将DDR寄存器的相应位置1可以选择输出模式。在该模式下,向ODR寄存器的位写入数据将会通过锁存器输出对应数字值到I/O口上。此时读IDR寄存器同样会将对应I/O引脚上的电平值读回。通过软件配置CR1、CR2寄存器可以得到两种不同的输出模式:推挽输出和开漏输出模式。在推挽输出模式时,P沟道和N沟道两个场效应管都参与工作;而在开漏输出时,P沟道场效应管是关闭的,这种状态通常用于与外部器件形成线与的关系。
当单片机复位时,为了避免I/O口内部输入施密特触发器持续工作从而消耗更多的电流,所有I/O口都会被配置成悬浮输入模式,对于没有使用的引脚,应当连接到一个固定的电平值上,上拉或者是下拉。
3.摆率控制
输出摆率是GPIO口的驱动电路响应速度,可以通过软件配置CR2寄存器的相应位控制。清0 CR2位时,相应I/O口输出频率为2MHz,置位CR2相应位时输出频率为10MHz。
表1-7 GPIO的配置方式

1.3.3 GPIO的寄存器
GPIO的寄存器都是与端口相对应的,每一个端口寄存器位驱动相应的端口引脚。
1.端口x输出数据寄存器(Px_ODR)
Px_ODR寄存器:端口x输出数据寄存器

bit 7:0 ODR7:ODR0:端口输出数据寄存器位。
在输出模式下,写入寄存器的数值通过锁存器施加到相应的引脚上。读ODR寄存器,返回之前锁存的寄存器值。在输入模式下,写入ODR的值将被锁存到寄存器中,但不会改变引脚状态。ODR寄存器在复位后总是为0。
2.端口x输入寄存器(Px_IDR)
Px_IDR寄存器:端口x输入寄存器

bit 7:0 IDR7:IDR0:端口输入数据寄存器位。
无论引脚是输入还是输出模式,都可以通过该寄存器读入引脚状态值,该寄存器为只读寄存器。
0:引脚上为逻辑低电平。
1:引脚上为逻辑高电平。
3.端口x数据方向寄存器(Px_DDR)
Px_DDR寄存器:端口x数据方向寄存器

bit 7:0 DDR7:DDR0:数据方向寄存器位
这些位可通过软件置1或清0,用于设定引脚为输入或输出。
0:输入模式。
1:输出模式。
4.端口x控制寄存器1(Px_CR1)
Px_CR1寄存器:端口x控制寄存器1

bit 7:0 C17:C10:控制寄存器位
这些位可通过软件置1或置0,用来在输入或输出模式下选择不同的功能,具体配置方式详见表1-7。
在输入模式时(DDR=0)如下。
0:浮空输入。
1:带上拉电阻输入。
在输出模式时(DDR=1)如下。
0:模拟开漏输出(不是真正的开漏输出)。
1:推挽输出(由CR2相应位输出摆率控制)。
5.端口x控制寄存器2(Px_CR2)
Px_CR2寄存器:端口x控制寄存器2

bit 7:0 C27:C20:控制寄存器位
相应的位通过软件置1或置0,用来在输入或输出模式下选择不同的功能。在输入模式下,由CR2相应的位使能中断,如果该引脚无中断功能,则对该引脚无影响。在输出模式下,置位将提高I/O速度。
在输入模式时(DDR=0)如下。
0:禁止外部中断
1:使能外部中断
在输出模式时(DDR=1)如下。
0:输出速度最大为2MHz。
1:输出速度最大为10MHz。
本章回顾
在这一章中我们了解了意法公司的MCU产品线,对STM8S系列单片机的功能、引脚、I/O口的设定有了一些基本的认识,同时也学习了多个与I/O口相关的控制寄存器。这些都是将来操控STM8S单片机的基础。