1.什么是GPIO
GPIO 的全称是 General-Purpose Input/Output,中文翻译为 “通用型输入输出”。
顾名思义,它是一个可以被程序控制作为输入或输出使用的数字信号引脚。它没有预先设定的、固定的用途(比如专门用于USB或视频输出),其功能完全由连接到它的软件来决定。
你可以把它想象成一块空白的画布或一个万用接口,是微控制器(如 Arduino)、单片机(如 STM32)、单板计算机(如树莓派 Raspberry Pi)与外部物理世界进行交互的最基本、最核心的方式。
2.GPIO 的八种模式
4 种输入模式:
输入浮空
输入上拉
输入下拉
模拟输入
4 种输出模式:
通用推挽输出
通用开漏输出
复用功能推挽输出
复用功能开漏输出
3.IO 口的基本结构
3.1输入浮空/上拉/下拉配置
在电路中,施密特触发器等模块参与信号处理。当 I/O 口没有外接高电平或低电平时,处于浮空状态,此时内部上拉 / 下拉电阻会发挥作用,让 I/O 口得到明确的高电平或低电平状态;可要是 I/O 口本身已有明确的高电平或低电平,内部上拉 / 下拉就不起作用了。另外,当配置 I/O 口为浮空输入时,I/O 口必须有明确的外部高电平或低电平输入,不然输入状态可能不确定。同时要注意,像标有VDD_IO的特殊 5 伏兼容 I/O 脚,和一般的VDD是不同的。
3.2模拟输入配置
3.3推挽输出 1
推挽输出是对外输出数字信号(即要么高电平,要么低电平)。
3.4推挽输出 0
3.5开漏输出 1
开漏输出的是低电平或高阻抗,高阻抗时芯片内部与外部视为断开,芯片对 IO 口没有影响。
3.6开漏输出 0
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灯熄灭。
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
|
|