江科大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