一.GPIO的简介
GPIO (general purpose input output)是通用输入输出端口的简称,简单来说就是软件可控制的引脚
,STM32芯片的GPIO引脚与外部传感器连接起来,从而实现与外部通讯、控制以及数据采集的功能。
1.引脚全是GPIO?
答案是否定的,不是所有引脚都是GPIO。
STM32 芯片的 GPIO 被分成很多组,每组有 16 个引脚,如型号为 STM32F103c8T6 型号的芯片有 GPIOA、GPIOB至共 5两组 GPIO,例如GPIOA(PA0~PA15 16个引脚)芯片,一共 48个引脚,其中GPIO 就占了一大部分,所有的 GPIO 引脚都有基本的输入输出功能。此外还有晶振引脚,电源引脚,复位引脚。如图:(最小系统板自带晶振。)
系统结构图如下:可以看出GPIOA,GPIOB都在APB2总线上。因此使用GPIOA等时需要打开该时钟线。
2.GPIO的输入输出模式
GPIO可配置8种模式
输出模式下可控制端口的输出高低电平,可用于驱动板子外的外设。
输出模式:通过CPU输出指令到GPIO口,用于驱动板子外的外设。
输入模式下GPIO口可读取端口上的外设(传感器)的高低电平或电压,用于读取输入,外接模块电平信号输入到CPU。
1.推挽输出:
当输出寄存器输出高电平,则引脚也输出高电平。
当输出寄存器输出低电平,则引脚也输出低电平。
2.开漏输出
当输出寄存器输出高电平,则引脚输出高阻态。(开漏输出和推挽输出的区别最普遍的说法就是开漏输出无法真正输出高电平,即高电平时没有驱动能力,需要借助外部上拉电阻完成对外驱动)
当输出寄存器输出低电平,则引脚输出低电平。
高阻态说明:百度百科解释:高阻态是一个 数字电路 里常见的术语,指的是 电路 的一种输出状态,既不是高电平也不是低电平,如果高阻态再输入下一级电路的话,对下级电路无任何影响,和没接一样,如果用万用表测的话有可能是高电平也有可能是 低电平 ,随它后面接的东西定的。(无驱动能力的悬空)。
4.复用功能推挽开漏输出
复用功能模式中,输出使能,输出速度可配置,可工作在开漏及推挽模式, 输出信号源于其它片上外设
输出数据寄存器 GPIOx_ODR 无效,如图示意;输入可用,可通过输入数据寄存器可获取 I/O 实际状态,但一般直接用外设的寄存器来获取该数据信号。
复用功能的含义是:输出不来源于输出数据寄存器了,而是其它片上外设。或者输入模式下的输入寄存器。
现在演示闪烁一个LED的代码学习:GPIO口的初始化模块(就是使用GPIO端口)。以及和系统架构的APB2线使用。
#include "stm32f10x.h" // Device header
#include "Delay.h"
int main(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//打开APB2线上的GPIOA线时钟使能
//GPIO口结构体初始化模块
GPIO_InitTypeDef GPIO_InitStructure; //GPIO口结构体
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//输出模式为推挽输出。
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;//打开GPIO_A0口
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//给个频率,不用管
GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化这个GPIO_A0口,即为PA0端口。
while (1)
{
GPIO_ResetBits(GPIOA, GPIO_Pin_0); //低电平
Delay_ms(500);
GPIO_SetBits(GPIOA, GPIO_Pin_0); //高电平
Delay_ms(500);
GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_RESET);//写入低电平
Delay_ms(500);
GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_SET); //写入高电平
Delay_ms(500);
GPIO_WriteBit(GPIOA, GPIO_Pin_0, (BitAction)0); //写入低电平
Delay_ms(500);
GPIO_WriteBit(GPIOA, GPIO_Pin_0, (BitAction)1); //写入高电平
Delay_ms(500);
}
}
说明: