STM32标准库GPIO配置

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


简介

本文章主要分享了以STM32f103c8t6为例子,开发环境为keil5,配置GPIO的方法。


一、GPIO初始化格式

要配置GPIO主要分为四部分:

1.结构体定义;
2.时钟设置;
3.给结构体成员赋值;
4.GPIO初始化。

以下为实例代码:

	//结构体定义
	GPIO_InitTypeDef	GPIO_InitStruct = {0};
	//时钟设置
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
	//GPIO配置
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4;
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
	//GPIO使能
	GPIO_Init(GPIOB, &GPIO_InitStruct);

这里将PB3和PB4引脚设置为推挽输出,输出频率为50MHz。

二、标准库及代码分析

1.第一步——结构体的定义

在头文件导入#include "stm32f10x.h"之后,点开.c文件会发现里面有一个stm32f10x_gpio.h文件,里面包含了所有gpio的操作。

GPIO标准库文件
GPIO标准库函数

滑倒最底下会看到一堆对于GPIO操作所写的函数初始化,我们看到有4个有Init后缀的函数,我们使用的是GPIO_Init函数:

  • GPIO_DeInit是取消GPIO初始化恢复默认值函数
  • GPIO_AFIODeInit是取消GPIO映射配置,恢复到默认值(重新映射、中断配置)
  • GPIO_Init是根据GPIO结构体初始化外围GPIO设备
  • GPIO_StructInit是GPIO结构体初始化为默认值

右键跳转到GPIO_Init的实现我们可以看到需要传递两个参数,根据给出的注释,第一个参数传递的是GPIOx,x的取值范围是A~G,第二个参数传递的是GPIO_InitTypeDef这个结构体类型的地址,我们在初始化函数里定义一个GPIO_InitTypeDef类型的结构体。

void GPIO_Config(void)
{
	GPIO_InitTypeDef	GPIO_InitStruct = {0};
}

2.第二步——时钟的配置

因为STM32设计之初为了降低能耗,将所有的外设时钟都设为了不使能,所以当我们用到GPIO外设时需要将其使能。

打开标准库文件,时钟配置函数放置在stm32f10x_rcc.h文件,翻到最后。

rcc时钟

数据手册

根据数据手册我们可以知道GPIO搭载在APB2这条总线上,我们看到文件里有两个APB2字眼的函数,RCC_APB2PeriphResetCmd是重置APB2总线,所以我们使用RCC_APB2PeriphClockCmd。

在这里插入图片描述

跳转至函数,我们看到有两个参数,根据注释假如我们设置PB3引脚初始化,那么我们可以这么写:

void GPIO_Config(void)
{
	GPIO_InitTypeDef	GPIO_InitStruct = {0};
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
}

3.第三步——给结构体成员赋值

跳转至GPIO_InitTypeDef定义。

GPIO结构体定义

我们可以看到STM32F103C8T6的GPIO结构体有三个成员,分别是引脚,输出频率,模式。我们需要将结构体里的三个成员赋值,复制@ref后面的注释Ctrl+F可以查找相应的宏。

例如:复制GPIO_pins_define
查找GPIO_pins_define

GPIO引脚宏定义

我们可以看到标准库为我们贴心的宏定义好了所有的引脚地址,我们只需要将其赋值给相应的成员即可。 其余两个成员赋值如上。

如果要设置PB3为推挽输出即得出代码:

void GPIO_Config(void)
{
	GPIO_InitTypeDef	GPIO_InitStruct = {0};
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_3;
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
}

4.第四步——GPIO使能

准备好以上步骤之后我们需要将我们的GPIO外设设置成为我们配置好的样子,这时候就需要一开始我们找到的GPIO_Init函数了,查看他需要传递的参数。

GPIOInit

根据注释我们可以知道第一个需要传递的参数是第几组GPIO引脚(A~G),第二个参数是我们实例化后的结构体的地址。

实例代码:

void GPIO_Config(void)
{
	GPIO_InitTypeDef	GPIO_InitStruct = {0};
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_3
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;

	GPIO_Init(GPIOB, &GPIO_InitStruct);
}

GPIO初始化完成。

三、GPIO模式

GPIO输出内部原理图如下
GPIO输出内部电路图

1.推挽输出
推挽输出

当Output输出逻辑为0时P-MOS管导通,N-MOS管截止,输出高电平。
当Output输出逻辑为1时P-MOS管截止,N-MOS管导通,输出低电平。


**2.开漏输出**

> 在该模式下只有N-MOS管可用。
> 
> 逻辑为0时N-MOS管截止,IO口处于高阻态,可以外部外加一个上拉电阻从而决定他所输出的电压。
> 
> 逻辑为1时N-MOS管导通,通过上拉电阻,读取IO口电平就能知道外接的外设的电平是否改变(拉低或不变)。


以上内容为个人理解,如有不足之处敬请批评指正。
  • 12
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值