江科大stm32笔记——3.GPIO

GPIO是stm32的通用功能IO,有以下的特点。

1.作为通用输入输出接口,可以配置8种输入输出模式

2.引脚电平为3.3v,部分引脚可以容忍5v

3.输出模式下的引脚可以输出高低电平,用于驱动LED、蜂鸣器、模拟通信协议等等

4.输入模式下的引脚可以读取高低电平,可以读取按键输入,外界模块电平信号的输入,ADC电压的采集

GPIO的基本结构

 下图可以看到,GPIOA和GPIOB都是APB2总线上的外设。

GPIO的八种输入输出模式

推挽输出与开漏输出

下图是推挽输出的电路图,推挽输出有两个mos管或两个三极管构成。工作时一个导通,一个截止。

推挽输入最大的特点就是:可以真正的输出高低电平,并且对高低电平都有驱动能力。

驱动能力就是输出电流的能力。

下图是开漏输出的电路图

当mos管打开时,开漏输出电路输出高电平,电流流向是从V流经上拉电阻R,留进负载,最后进入GND。

开漏输出特点:

1.方便调节输出的电平,因为输出的电平完全由上拉电阻连接的电源电压决定。所以在需要进行电平转换的地方很适合开漏输出。

2.可以实现“线与”功能,多根信号线连接在一起的时候,只有所有信号全部为高电平时,合在一起的总线才为高电平,只要有任何一根线是低电平,那么总线就是低电平。(推挽输出不行,高低电平连接在一起,可能导致器件烧毁)

浮空/上拉/下拉输入

浮空/上拉/下拉输入三种输入模式配置的区别主要体现在“输入驱动器”中两个开关的配置

浮空输入:上拉电阻和下拉电阻均不使用

上拉输入:连接上拉电阻,引脚默认为高电平,有低电压的时候触发

下拉输入:连接下拉电阻,引脚默认为低电平,有高电压的时候触发

模拟输入

上下拉的电阻关闭,信号直接连接进入了片上外设。

推挽/开漏输出

输出驱动器通过输出控制来配置是高电平还是低电平。

复用推挽/开漏输出

在推挽/开漏输出的基础上,复用了片上外设的输出。

LED闪烁代码编写

接线图

LED灯负极连接到板子PA0引脚,正极连接到3.3v

编写前准备步骤

 1.复制2_1项目工程,更改名称为3_1LED闪烁。新建工程后可以连续使用,不用每一次都新建项目

2.创建System文件夹,并且将Delay.h和Delay.c文件复制到System文件夹中

3.点击Manage Project Items选项

在Groups中添加System组,并且将System文件中的Delay.h和Delay.c文件添加到Files中

4.点击魔术棒——>c/c++,将System文件添加到Include Paths目录中。

上述步骤完成后后,可以看到如下的目录结构,其中出现了System组。

代码

下面代码为main文件中的代码

#include "stm32f10x.h"                  // Device header
#include "Delay.h"

int main(){
    
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);

	while(1){
	 
        
        GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_RESET);
        Delay_ms(500);
        GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_SET);
        Delay_ms(500);
        
//        GPIO_SetBits(GPIOA,GPIO_Pin_0);
//        Delay_ms(500);
//        GPIO_ResetBits(GPIOA,GPIO_Pin_0);
//        Delay_ms(500);
	}
}

上面的函数可以在各自的库文件中找到

代码解析

RCC_APB2PeriphClockCmd函数解析

在stm32f10x_rcc.h中,常用的还有RCC_AHBPeriphClockCmd、RCC_APB1PeriphClockCmd函数。

跳转到函数实现,可以看到参数1的取值,表示APB2总线上的外设。参数2的取值表示使能或失能。

GPIO_Init函数解析

下面是GPIO的库函数,主要关注以下函数,主要是GPIO_Init初始化函数,GPIO_SetBits GPIO_ResetBits GPIO_WriteBit等设置端口高低电平的函数。

下面是GPIO_Init函数的参数,第一个参数选择GPIO引脚,从A到G。第二个参数是传递一个结构体

下面是结构体内部的成员,分别是选择GPIO引脚,运行速度,输出模式(八种输入输出模式)

继续搜寻成员变量的取值,GPIO_Pin的取值:从0到15,还有ALL的选择。

GPIO_Speed的取值:这里选择50MHz的,一般都使用这个。

GPIO_Mode的取值:这里是八种输入输出模式

GPIO_SetBits函数解析

将端口设置为高电平输出,第一个参数选择GPIOA到G,第二个参数选择GPIO_Pin_0到GPIO_Pin_15

GPIO_ResetBits函数参数与GPIO_SetBits相同,区别是GPIO_ResetBits将端口设置为低电平输出。

GPIO_WriteBit

这个函数也是指定端口输出高低电平,前两个参数和GPIO_SetBits一样。第三个参数是设置端口新的状态

新状态是一个枚举类型,选择有下面两个,其实就是设置端口为0或者1。

总结

GPIO这个主要是了解端口的输出模式,设置端口高低电平。从一开始的总线上的外设选择,了解到总线的概念,参看函数的取值可以确定外设在AHP还是APB1、2上的外设。然后设置对应端口初始化的函数,先设置结构体,将结构体成员里面的变量赋值,然后将结构体地址传递给GPIO_Init初始化函数。到这里就可以正常使用设置端口位高低电平来设置端口的输出了。

江科大的stm32教程中还有两个案例,本质都是GPIO引脚输出的拓展,这里不做详细解释。

作者:Ronronner_w

物联沃分享整理
物联沃-IOTWORD物联网 » 江科大stm32笔记——3.GPIO

发表回复