提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
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操作所写的函数初始化,我们看到有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文件,翻到最后。
根据数据手册我们可以知道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定义。
我们可以看到STM32F103C8T6的GPIO结构体有三个成员,分别是引脚,输出频率,模式。我们需要将结构体里的三个成员赋值,复制@ref后面的注释Ctrl+F可以查找相应的宏。
例如:复制GPIO_pins_define
我们可以看到标准库为我们贴心的宏定义好了所有的引脚地址,我们只需要将其赋值给相应的成员即可。 其余两个成员赋值如上。
如果要设置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函数了,查看他需要传递的参数。
根据注释我们可以知道第一个需要传递的参数是第几组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输出内部原理图如下
1.推挽输出
当Output输出逻辑为0时P-MOS管导通,N-MOS管截止,输出高电平。
当Output输出逻辑为1时P-MOS管截止,N-MOS管导通,输出低电平。
**2.开漏输出**
> 在该模式下只有N-MOS管可用。
>
> 逻辑为0时N-MOS管截止,IO口处于高阻态,可以外部外加一个上拉电阻从而决定他所输出的电压。
>
> 逻辑为1时N-MOS管导通,通过上拉电阻,读取IO口电平就能知道外接的外设的电平是否改变(拉低或不变)。
以上内容为个人理解,如有不足之处敬请批评指正。