目录
STM32介绍:
STM32单片机作为一款十六为的单片机,它的功能是毋庸置疑的,寄存器不是一般的多,但是官方给的库函数对开发者来说,无疑是很好的一种使用手段。
在入门哪一款单片机,都是先操作它的GPIO,来达到控制的目的。今天我们就来了解STM32的GPIO的使用,利用库函数把LED灯点亮。GPIO的库函数有很多,我在这里尽量把所有的,库函数的用法给解释出来;
GPIO基本结构
(我参考的是普中科技的ppt,如有侵权,请及时联系我,会立即处理)
在这之前,先给大家看一下STM32的GPIO有哪些功能(模式)
GPIO一共有八种模式:输入四种,输出四种;
GPIO的模式:
输入模式:
- 输入浮空: GPIO_Mode_IN_FLOATING
- 输入上拉: GPIO_Mode_IPU
- 输入下拉 :GPIO_Mode_IPD
- 模拟输入 :GPIO_Mode_AIN
输出模式
- 开漏输出 GPIO_Mode_Out_OD
- 推挽输出 GPIO_Mode_Out_PP
- 复用功能推挽 GPIO_Mode_AF_PP
- 复用功能开漏 GPIO_Mode_AF_OD
GPIO的模式图形理解:
1、输入浮空模式
2、输入上拉模式
3、输入下拉模式
4、模拟输入模式
5、开漏输出模式
6、开漏复用输出模式
7、推挽输出模式
8、 推挽复用输出模式
因为我用的普中科技的STM32单片机,讲师用的这个,感觉总结的很好,就拿来分享一下如果涉及侵权行为,请及时联系我,我会及时做出处理。
GPIO的各种配置函数
下面是STM32F103VET6的库函数:
STM32F103VET6是一款高储存,管脚较多的一款,管脚数144个;
GPIO有96个表示方法:
GPIOx:GPIO的分类,分成六类 ,x:A~F;
GPIO_Pin_n:每类GPIO的个数,n:0~15;
库函数有很多,有很多用不到,下面就解释了一部分,都是最常用的
函数名 | 作用 | 参数1 | 参数2 |
GPIO_Init | 初始化GPIO,设置GPIO的模式,速度,引脚数 | 此引脚挂接的GPIOx | 对应的引脚(0~15) |
GPIO_ReadInputDataBit | 读取一位GPIO的输入数据 | 此引脚挂接的GPIOx | 对应的引脚(0~15) |
GPIO_ReadInputData | 读取GPIOx的输入数据 | GPIOx的选择(x表示A~F) | |
GPIO_ReadOutputDataBit | 读取一位GPIO的输出数据 | 此引脚挂接的GPIOx | 对应的引脚(0~15) |
GPIO_ReadOutputData | 读取GPIOx的输出数据 | GPIOx的选择(x表示A~F) | |
GPIO_SetBits | 使GPIO设置为高电平,课一起设置多,也可以设置一个 | GPIOx | 对应的引脚(0~15) |
GPIO_ResetBits | 使GPIO设置为高电平,课一起设置多,也可以设置一个 | GPIOx | 对应的引脚(0~15) |
GPIO_WriteBit | 设置GPIO的一个管脚 | GPIOx | 参数:2:选择哪个管脚 参数3:选择高/低电平 |
GPIO_Write | 设置GPIOx全部管脚 | GPIOx | 选择高/低电平 |
GPIO的各个模式,都知道了,直接上程序和现象
程序里面也有相对应的注释
1、设置GPIOC,GPIO_Pin_0管脚为低电平
#include "stm32f10x.h"
void Led_Init(void)//LED引脚GPIO初始化
{
GPIO_InitTypeDef GPIO_InitStruct;//定义一个结构体变量,来初始化GPIO的各个参数
RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOC,ENABLE);//因为led在GPIOC上,需要开启相对应的时钟信号
GPIO_InitStruct.GPIO_Mode =GPIO_Mode_Out_PP;//定义GPIO的模式
GPIO_InitStruct.GPIO_Pin =GPIO_Pin_0 ;//定义GPIO的哪个管脚(0~15)All表示全部
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz ;//定义GPIO的时钟速度
GPIO_Init(GPIOC,&GPIO_InitStruct);//这个结构体以地址形式传出去,因为是个指针变量
}
int main()
{
Led_Init();
while(1)
{
GPIO_ResetBits (GPIOC,GPIO_Pin_0);
}
}
现象
2、设置GPIOC,GPIO_Pin_All全部的管脚为低电平
#include "stm32f10x.h"
void Led_Init(void)//LED引脚GPIO初始化
{
GPIO_InitTypeDef GPIO_InitStruct;//定义一个结构体变量,来初始化GPIO的各个参数
RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOC,ENABLE);//因为led在GPIOC上,需要开启相对应的时钟信号
GPIO_InitStruct.GPIO_Mode =GPIO_Mode_Out_PP;//定义GPIO的模式
GPIO_InitStruct.GPIO_Pin =GPIO_Pin_All ;//定义GPIO的哪个管脚(0~15)All表示全部
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz ;//定义GPIO的时钟速度
GPIO_Init(GPIOC,&GPIO_InitStruct);//这个结构体以地址形式传出去,因为是个指针变量
}
int main()
{
Led_Init();
while(1)
{
GPIO_ResetBits (GPIOC,GPIO_Pin_All);
}
}
现象