第四掌 STM8单片机的触角—IO口的应用 联系客服

发布时间 : 星期一 文章第四掌 STM8单片机的触角—IO口的应用更新完毕开始阅读68357e4fc850ad02de80419c

STM8单片机的触角——I/O口的应用

4.1 玩转 I/O口必备的“五器”

STM8S208RB单片机的I/O口分布情况如图4-1所示

图4-1 STM8S208RB管脚分布图

从图4-1中我们可以看到,STM8S208RB共有64个引脚,其中52个通用输入/输出口(GPIO),它们分别是PA1~PA6、PB0~PB7、PC1~PC7、PD0~PD7、PE0~PE7、PF0、PF3~PF7、PG0~PG7、PI0。其中,每个端口都有一个输出数据寄存器(ODR),一个输入引脚寄存器(IDR),一个数据方向寄存器(DDR),一个控制寄存器1(CR1),一个控制寄存器2(CR2),

这就是STM8单片机I/O的“五器”。“五器”到手了,该如何使用,如表4-1。

配置模式 数据方向寄存器 DDR 0 输入 0 0 0 1 1 输出 1 x 控制寄存器1 CR1 0 1 0 1 0 1 x x 表4-1 I/O口配置表

控制寄存器2 CR2 0 0 1 1 0 0 1 x 配置模式 悬浮输入 上拉输入 中断悬浮输入 中断上拉输入 开漏输出 推挽输出 输出(最快速度10MHz) 真正的开漏输出(特定引脚) 由表4-1中看出,当Px_DDRn为“1”,Pxn配置为输出,否则为输入。 当配置为输入时,若Px_CR1为“1”,上拉电阻使能,否则为悬浮输入。而Px_CR2为“1”时,开启当前I/O口的外部中断功能,为“0”时关闭外部中断功能。若想读取该I/O引脚上的数据,只需读取相应的Px_IDR寄存器即可。

当配置为输出时,若Px_CR1为“1”,Pxn配置为推挽输出,否则为开漏输出。而Px_CR2为“1”时,当前I/O口的最大输出速率为10MHz,否则最大输出速率为2MHz。想要某个I/O口输出高电平,则向Px_ODR中写入0xff,否则写入0x00;

注:针对STM8S208RB而言,x为A、B、C、D、E、F、G、I;n为0~7。

下面的例子演示了如何设置PB口低四位为推挽输出,最快速度10MHz,并输出高电平,高四位为上拉输入。

unsigned char i; …

/*设置输出高电平*/

PB_ODR = (1 << 3) | (1 << 2) | (1 << 1) | (1 << 0); /*设置端口方向*/

PB_DDR = (1 << 3) | (1 << 2) | (1 << 1) | (1 << 0); /*设置推挽输出和定义上拉电阻*/ PB_CR1 = 0xff;

/*设置端口最大速度和关闭中断*/

PB_CR2 = (1 << 3) | (1 << 2) | (1 << 1) | (1 << 0); /*读取端口输入数据*/ i = PB_IDR & 0xf0; …

4.1.1 悬浮与上拉

悬浮输入与上拉输入是两种输入方式,不同之处在于上拉输入时,引脚内部有个上拉电阻。当引脚悬空时,上拉输入的引脚电平是确定的,即高电平;而悬浮输入则不同,它的电平时不确定的,即使外部的一个很小的信号都会使其发生改变。

上拉输入最典型的应用就是外部按键,当按键未按下时,我们要保证它是高电平,当按键按下时才被拉低;而悬浮输入的典型应用就是模数转换,外部的任何一个小信号都要经过A/D采样转换为数字信号。

4.1.2 开漏与推挽

1. 开漏输出

说开漏输出之前,我们先来看看什么是集电极开路输出。

图4-2 集电极开路

集电极开路输出的结构图如图4-2所示,三极管Q1的集电极就是单片机的I/O口,什么都不接,所以叫做集电极开路。当控制端输入为“0”时,三极管Q2截止,及集电极与发射机之间断开,所以5V电压通过R1接到Q1的基级,Q1导通,即相当于管脚直接接地;当控制端输入“1”时,三极管Q2导通,Q1截止,输出引脚与地之间断开。我们将图4-2简化为图4-3所示。

图4-3 集电极开路简化图

图4-3中的开关受软件控制,“1”时断开,“0”时闭合。很明显可以看出,当开关闭合时,输出直接接地,所以输出低电平。而当开关断开时,则输出端悬空,即引脚为高阻态。这时电平状态未知,如果后面一个电阻负载(即使很轻的负载)到地,那么输出端的电平就