注:鄙人在学习过程中发现参考手册抑或是开发攻略的文字解释都太过繁琐,故在学习过程中写下此简单理解版本,如有纰漏错误之处,还望指出,感谢!
- GPIO含义:通用输入输出端口
- 作用:STM32通过GPIO引脚与外设连接,进行输入输出,从而实现数据收集、控制等功能。
芯片上的引脚并非都是GPIO口
- 引脚分类:
- (1)电源引脚(V开头的标记,如VSS、VDD、VREF+、VREF-等等)
- (2)晶振引脚。可作普通引脚使用(OCS_IN ,OCS_OUT标记)
- (3)复位引脚。不做其他功能使用(NRST标记)
- (4)BOOT引脚。用来控制STM32启动模式。
- (6)GPIO引脚。GPIO引脚也分不同功能,具体参考自己对应的芯片手册。
GPIO工作模式
输入模式
- 上拉输入(GPIO_Mode_IPU):IO口在无输入的情况下,保持高电平。
- 下拉输入(GPIO_Mode_IPD):IO口在无输入的情况下,保持低电平。
- 浮空输入(GPIO_Mode_IN_FLOATING):浮空输入状态下,IO的电平完全由外部输入决定,在无外部输入时,读取该端口的电平是不确定的。
- 模拟输入(GPIO_Mode_AIN):输入信号不经施密特触发器直接接入,输入信号为模拟量而非数字量,(其余输入方式输入数字量)。
输出模式:
- 推挽输出(GPIO_MODE_OUTPUT_PP):
- 直接输出高电平(与VCC电压相同)或低电平(与GND电压相同,即接地)
- (这里可以理解为该IO口直接与VCC或GND相连)。
- 开漏输出(GPIO_MODE_OUTPUT_OD):
- 输出低电平与高阻态。
- 一般配合一个上拉电阻,工作在电压不匹配的情景。
- 当输出高阻态时(芯片既不输出高电平,也不输出低电平),即表现为上拉电阻的电压;当输出为低电平时,即表现为低电平(0V)
- 复用推挽输出(GPIO_MODE_AF_PP) 与 复用开漏输出(GPIO_MODE_AF_OD):
- 将输出引脚与内部外设相连,直接输出内部外设的数据信号。
- 具体用复用的哪个模式输出,需要根据具体内部外设决定。
- (可配置输出速度,不考虑功耗情况下,直接选最快即可)
- (在输出模式时,同时也可以输入)
GPIO常用库介绍
常见库文件
- GPIO外设库文件 : stm32f10x_gpio.c、stm32f10x_gpio.h
- RCC外设库文件: stm32f10x_rcc.c、stm32f10x_rcc.h
常用库函数:(图片来自普中开发教程)
- 点亮一颗LED实验步骤:
- 初始化系统时钟(库函数已封装好,直接调用即可)
- 使能对应GPIO时钟,初始化对应参数
- 点亮LED
初始化的伪代码
void LED_Init(void);
{
时钟初始化使能;
定义一个结构体;
配置结构体(下面内容可以直接结构体“.”引用出来,不用特别记忆)
配置mode模式;
配置pin管脚;
配置speed速度;
初始化该结构体;
设置默认电平(拉高或拉低);
}
初始化代码示例:
void LED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;//定义结构体变量
RCC_APB2PeriphClockCmd(LED1_PORT_RCC|LED2_PORT_RCC,ENABLE);
GPIO_InitStructure.GPIO_Pin=LED1_PIN; //选择你要设置的IO口
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; //设置推挽输出模式
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //设置传输速率
GPIO_Init(LED1_PORT,&GPIO_InitStructure); /* 初始化GPIO */
GPIO_SetBits(LED1_PORT,LED1_PIN); //将LED端口拉高,熄灭所有LED
GPIO_InitStructure.GPIO_Pin=LED2_PIN; //选择你要设置的IO口
GPIO_Init(LED2_PORT,&GPIO_InitStructure); /* 初始化GPIO */
GPIO_SetBits(LED2_PORT,LED2_PIN); //将LED端口拉高,熄灭所有LED
}