[应用相关] STM32标准库GPIO初始化

[复制链接]
428|0
晓伍 发表于 2025-9-9 09:07 | 显示全部楼层 |阅读模式
1.什么是GPIO
GPIO 的全称是 General-Purpose Input/Output,中文翻译为 “通用型输入输出”。

顾名思义,它是一个可以被程序控制作为输入或输出使用的数字信号引脚。它没有预先设定的、固定的用途(比如专门用于USB或视频输出),其功能完全由连接到它的软件来决定。

你可以把它想象成一块空白的画布或一个万用接口,是微控制器(如 Arduino)、单片机(如 STM32)、单板计算机(如树莓派 Raspberry Pi)与外部物理世界进行交互的最基本、最核心的方式。

2.GPIO 的八种模式
4 种输入模式:

输入浮空

输入上拉

输入下拉

模拟输入

4 种输出模式:

通用推挽输出

通用开漏输出

复用功能推挽输出

复用功能开漏输出

3.IO 口的基本结构

4862268bf7dceae01e.png

3.1输入浮空/上拉/下拉配置

3359868bf7dc8302aa.png

在电路中,施密特触发器等模块参与信号处理。当 I/O 口没有外接高电平或低电平时,处于浮空状态,此时内部上拉 / 下拉电阻会发挥作用,让 I/O 口得到明确的高电平或低电平状态;可要是 I/O 口本身已有明确的高电平或低电平,内部上拉 / 下拉就不起作用了。另外,当配置 I/O 口为浮空输入时,I/O 口必须有明确的外部高电平或低电平输入,不然输入状态可能不确定。同时要注意,像标有VDD_IO的特殊 5 伏兼容 I/O 脚,和一般的VDD是不同的。

3.2模拟输入配置

1144968bf7d9dea3db.png

3.3推挽输出 1
推挽输出是对外输出数字信号(即要么高电平,要么低电平)。

3349868bf7d982eff8.png

3.4推挽输出 0

2702468bf7d93a04da.png

3.5开漏输出 1
开漏输出的是低电平或高阻抗,高阻抗时芯片内部与外部视为断开,芯片对 IO 口没有影响。

6878868bf7d8e9c1f9.png

3.6开漏输出 0

5268168bf7d897aed3.png

4.通过初始化IO口来控制LED灯的亮灭
1,查看原理图
通过哪个 IO 口控制LED灯?如何打开如何关闭?

查看原理图得: LED B与 PC6 连接 ,LED G与 PC7 连接,LED R与 PC8 连接。

其中LED灯与3.3V相连,所以当IO口PC6 PC7 PC8输出低电平的时候就有电流流过LED灯,LED灯点亮。当当IO口PC6 PC7 PC8输出高电平的时候没有电流流过LED灯,LED灯熄灭。

9009268bf7d8427e70.png

2899468bf7d7fac113.png

2.代码
//初始化PC6 PC7 PC8
void MX_GPIO_Init(void)
{
        GPIO_InitTypeDef GPIO_InitStruct;
       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);//使能GPIOC
       
        GPIO_InitStruct.GPIO_Mode   =GPIO_Mode_Out_PP;//推挽输出模式
        GPIO_InitStruct.GPIO_Pin    =GPIO_Pin_6 |GPIO_Pin_7 |GPIO_Pin_8;
        GPIO_InitStruct.GPIO_Speed  =GPIO_Speed_50MHz;//翻转速度
       
       
        GPIO_Init(GPIOC, &GPIO_InitStruct);
       
        GPIO_WriteBit(GPIOC, GPIO_Pin_6 |GPIO_Pin_7 |GPIO_Pin_8, Bit_SET);//默认输出高电平
       
}



同学,咱们来一步步看这段代码哈,就像搭积木一样,把每个部分搞明白~

### 第一步:函数的作用 `MX_GPIO_Init` 这个函数,是用来**初始化 GPIO 口**的,也就是给 PC6、PC7、PC8 这几个引脚“设定规则”,让它们能按照咱们的需求工作。

### 第二步:定义结构体 ```c GPIO_InitTypeDef GPIO_InitStruct; ``` `GPIO_InitTypeDef` 是一个结构体类型,你可以把它想象成一个“配置模板”。就好比你要定制一个玩具,这个结构体就是用来填“玩具是什么形状、什么颜色、多大尺寸”这些信息的,这里就是用来填 GPIO 引脚的工作模式、要初始化的引脚、速度这些配置的。

### 第三步:使能时钟 ``` RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); ``` GPIO 引脚要工作,得先给它“通电”,`RCC_APB2Periph_GPIOC` 就是 GPIOC 端口的时钟。这行代码就是打开 GPIOC 端口的时钟,相当于给 GPIOC 这个“区域”供电,这样 PC 组的引脚才能干活。

### 第四步:配置结构体成员 - **模式配置**: ```c GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; ``` `GPIO_Mode_Out_PP` 表示**推挽输出模式**。推挽输出就像有两个“开关”,一个负责输出高电平,一个负责输出低电平,能很稳定地输出信号。 - **引脚配置**: ```c GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8; ``` 这里是指定要初始化 GPIOC 的 **Pin6、Pin7、Pin8** 这三个引脚,用“|”(或操作)把这三个引脚选上,就像同时选三个玩具零件一样。 - **速度配置**: ```c GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; ``` `GPIO_Speed_50MHz` 是设置 GPIO 引脚的**翻转速度**,也就是引脚在高低电平之间切换的快慢,50MHz 表示切换速度比较快,能满足很多场景的需求。

### 第五步:初始化 GPIO ```c GPIO_Init(GPIOC, &GPIO_InitStruct); ``` 这行代码是把前面填好的“配置模板”(`GPIO_InitStruct`)应用到 GPIOC 上,相当于告诉单片机:“GPIOC 的 Pin6、Pin7、Pin8 这几个引脚,按照刚才设定的推挽输出、50MHz 速度来工作哈~” ### 第六步:设置初始电平 ```c GPIO_WriteBit(GPIOC, GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8, Bit_SET); ``` `Bit_SET` 表示设置为**高电平**。这行代码就是让 GPIOC 的 Pin6、Pin7、Pin8 这三个引脚,一开始就输出高电平,就像打开灯的开关,让灯一开始就亮着。 这样整个流程走下来,PC6、PC7、PC8 这三个引脚就被配置成推挽输出模式,速度是 50MHz,并且初始输出高电平啦~是不是像给引脚“定制”了一套工作规则,让它们按咱们的想法干活~

最后在main.c文件加入以下

MX_GPIO_Init();//GPIO初始化


在while中加入

GPIO_WriteBit(GPIOC, GPIO_Pin_6|GPIO_Pin_7 , Bit_RESET);//输出低电平


示例代码是打开PC6和PC7连接的灯。想要什么灯亮就在此处修改代码。
————————————————
版权声明:本文为CSDN博主「「嵌入式系统札记」」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_73884920/article/details/151119415

您需要登录后才可以回帖 登录 | 注册

本版积分规则

101

主题

4362

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部