一、GPIO界定
GPIO,即通用性输入输出端口号General Purpose Input Output的简称。
GPIO端口号可以根据程序流程配备成输入端口号或输出端口号。
二、GPIO的IO模式
STM8的GPIO边有12种模式设定,在其中输入4种,输出8种:
1、GPIO_Mode_In_FL_No_IT悬空输入无终断
2、GPIO_Mode_In_PU_No_IT上拉输入无终断
3、GPIO_Mode_In_FL_IT悬空输入有终断
4、GPIO_Mode_In_PU_IT 上拉输入有终断
5、GPIO_Mode_Out_OD_Low_Fast
开漏-输出低-快速 Output open-drain, low level, 10MHz
6、GPIO_Mode_Out_PP_Low_Fast
推挽电路-输出低-快速 Output push-pull, low level, 10MHz
7、GPIO_Mode_Out_OD_Low_Slow
开漏-输出低-低速档 Output open-drain, low level, 2MHz
8、GPIO_Mode_Out_PP_Low_Slow
推挽电路-输出低-低速档 Output push-pull, low level, 2MHz
9、GPIO_Mode_Out_OD_HiZ_Fast
开漏-输出高阻-快速 Output open-drain, high-impedance level, 10MHz
10、GPIO_Mode_Out_PP_High_Fast
推挽电路-输出高-快速 Output push-pull, high level, 10MHz
11、GPIO_Mode_Out_OD_HiZ_Slow
开漏-输出高阻-低速档 Output open-drain, high-impedance level, 2MHz
12、GPIO_Mode_Out_PP_High_Slow
推挽电路-输出高-低速档 Output push-pull, high level, 2MHz
或是如下图所显示:
因此大家就是要搞懂的主要是输入二种模式(上拉和悬空)及其输出的二种模式(推挽电路和开漏),剩余的仅仅在这里四种模式下依据基本参数不一样进一步区划。
1、上拉输入模式
说白了上拉模式,即设定输入模式时,接一个上拉电阻器,大约如下图所显示:
图中是STM8设定GPIO为上拉模式时的端口号內部电源电路示意图,R1經典取值范围为30k~80k,典型值为55k。(弱上拉)
注:上拉电阻器R越大,上拉功效越小,则为弱上拉;相反,R越小,上拉功效越大,则为强上拉。外界上拉电阻器选值经验为4.7k~10k。
左右2个二极管具有一个维护电源电路的功效,避免外界输入工作电压太高或太低。这一维护电源电路可以将外界过高电压降至3.8~4.1V,还可以将外界过低压上升到-0.6V,进而维护內部电源电路。
上拉输入模式可以将不确定性的悬空端口号数据信号维持在一个上拉电阻,是最常见的GPIO输入模式。
1、悬空输入模式
悬空模式和上拉模式较大的差异便是沒有上拉电阻器:
这类构造的输入特性阻抗较高,能最真正地体现外界输入数据信号,关键用以ADC(数学模型转换)的场所。
1、推挽电路输出模式
推挽电路(PP)输出模式如下图所显示:
简易而言,MOS管Q1和Q2,在输出多少电平常各自起功效。 输出上拉电阻的情况下,Q1通断,Q2截至;输出低电频的情况下,Q1截至,Q2通断。总而言之,Q1与Q2在作业时一直维持在一个导通与另一个截至的情况。推挽电路输出模式的特点是耗损小,高效率。
1、开漏输出模式
开漏(OD)输出模式,说白了即漏极短路的输出模式,如下图所显示:
开漏输出模式和推挽电路输出模式较大差别取决于沒有Q1,只有输出低电频情况“0”,而不可以立即输出上拉电阻情况“1”。务必外接上拉电阻器,才可以输出“1”。这实际上跟51单片机设计的P0口是一样的。
开漏输出模式的特性:
(1)开漏模式须外接上拉电阻器才可以输出上拉电阻,工作电压大部分是由外界开关电源通过上拉电阻器提供,单片机设计內部一般只要给予很小的栅压操纵电流量就可以。减少单片机设计功能损耗。
(2)开漏模式可用以脉冲信号数据信号规范的变换。外界上拉电阻器另加的电源电压可以是5V还可以是3.3V(STM8端口号最大可承担5V工作电压),开漏构造可以灌进比较大电流量(20mA),间接性完成TTL电平系列产品或CMOS脉冲信号系列产品的变换。
(3)开漏模式可用以I²C系统总线,完成“线与”作用。
(4)开漏模式应用另加上拉电阻器,则上拉电阻器小,上拉功效强,上升沿时间较短,速度更快;上拉电阻器大,上拉功效小,上升沿时间长,速率缓。
注:STM8单片机设计“真真正正的”开漏输出模式內部电源电路:PE1/I²C_SCL与PE2/I²C_SDA(沒有联接VDD的维护二极管)
三、GPIO的存储器设定
GPIO的5个存储器:
1.输出寄存器地址ODR;
2.脚位输入存储器IDR;
3.数据信息方位存储器DDR;
4.操纵存储器CR1;
5.操纵存储器CR2;
模式结构图,如下图所显示
STM8根据DDR、CR1和CR2三个存储器来配备不一样的输入输出模式。用ODR储存要输出的数据信号,用IDR来载入相匹配端口号的数据信号。之上5种存储器全是8位,相匹配值STM8每一组GPIO相匹配的8个端口号(7:0)。
根据存储器实际操作GPIO的实例:
int ** in(void)
{
/*设定內部快速数字时钟16M为主导数字时钟*/
CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);
GPIOB->DDR = 0x20;//配备GPIOB的方位存储器,设定pin5为输出模式
GPIOB->CR1 = 0x20;//配备GPIOB_5为推挽电路输出
GPIOB->CR2 = 0x00;
while(1)
{
GPIOB->DDR = 0x20;//GPIOB_5输出上拉电阻,亮
delay();
GPIOB->DDR = 0x00;//GPIOB_5输出低电频,暗
delay();
}
}
四、GPIO的函数库完成。
说白了函数库,实际上便是官方网做的驱动软件库,将对存储器用框架图一一对应并封裝起來,并出示了主要的配备涵数。大家只需应用官方网的函数库就就可以了,无需再花大精力科学研究存储器的配备。
简易举例子:
GPIO_Init(LED1_PORT,LED1_PIN,GPIO_MODE_OUT_PP_HIGH_FAST );
GPIO_Init这一指令是设定换句话说界定教导模式的,上边这条命令的意思便是LED1意味着的教导设定为推挽电路输出模式,原始上拉电阻,快速模式。
注:LED1_PORT和LED1_PIN应当在相应的库函数或是其他地方已注解,如
#define LED1_PIN GPIO_PIN_5
#define LED1_PORT GPIOB
GPIO_WriteLow(LED1_PORT,LED1_PIN);
在LED1这一引脚输出低电频;
GPIO_WriteHigh(LED1_PORT,LED1_PIN);
在LED1这一引脚输出上拉电阻;
GPIO_WriteReverse(LED1_PORT,LED1_PIN);
旋转LED1这一引脚的脉冲信号情况;