速通STM32-基础篇-GPIO
这是一篇针对电子类专业学生自学STM32嵌入式的入门指南。文章首先提供了Keli Arm+STM32cubeMX开发环境的下载链接,重点讲解了GPIO的基本概念和工作原理,包括8种工作模式(输出/输入模式、推挽/开漏模式等)及其应用场景。通过LED闪烁实验和按键控制LED实验的代码示例,帮助读者理解GPIO的基本操作。文中特别强调了对GPIO输出速度的选择原则,并推荐了B站铁头山羊老师的教学资源作
阅读小tips!(Look at my eyes!)
本篇基于电子类大学生自主学习嵌入式的学习总结,知识点理解输出较于浅显,只适用于深入学习stm32前的一些理解和引导,或是大学期末前一周速通,若要深入学习嵌入式,可借助阅读本篇来搭建一个入门嵌入式的框架,而后想深入可转战b站等学习网站,有更多的大牛在等待你!
一. 环境搭建
本篇学习使用市面上常用的KeliArm+STM32cubeMX!
博主已将下载链接放在下行,有需要自行下载!包括 isp,以及博主认为好用的串口助手 !
通过网盘分享的文件:环境
链接: https://pan.baidu.com/s/1kbvOHSh7MQoJGi6vWw9fSA?pwd=2weg 提取码: 2weg
下载方面的教程可自行移步到b站大学!博主(交学费版)在此感谢up主铁头山羊老师!
博主的学习笔记中摘取了铁头山羊老师的讲义,有需要可异步至b站听取老师视频教程!
二. GPIO
1. 什么是GPIO?
初学者总疑问GPIO到底代表什么?其实并没有那么深奥,就是简单的英文代称如下:

没错,就是这么简单直白,GPIO就是MCU上一种片上外设。初学者不妨先这么理解,CPU控制GPIO输入0/1,通过引脚向外界输出高电平或低电平,或通过外部信号输入至内部寄存器。
2. GPIO的八种工作模式

八种工作模式:

输出模式:
通用模式:如下图,通过CPU直接输出0/1,控制引脚输出高低电平。
复用模式:如下图,通过其他片上外设来控制引脚输出高低电平。

推挽模式:

提示:Vdd(voltage drain drain)- 高电压,此处为3.3V
Vss(voltage source source)- 此处为GND
推挽模式中 :P-MOS 与 N-MOS 交替导通!!!
推(推出)模式中:
CPU输出1,内置P-MOS导通,N-MOS断开,电流从Vdd输入,IO口连接高电压,输出高电平。
挽(挽留)模式中:
CPU输出0,内置P-MOS断开,N-MOS导通,电流流向Vss,IO口连接GND,输出低电平。
开漏模式:
为何称为开漏?
如下图中,IO口连接 P-MOS 源极与 N-MOS 漏极,在此模式下,P-MOS 恒断开,由于IO口
连接 N-MOS 漏极,即称为开漏模式。

开漏模式:

当CPU输出0,内置P-MOS断开,N-MOS导通,电流流向Vss,IO口连接GND,输出低电平。
当CPU输出1,内置P-MOS断开,N-MOS断开,IO口上无电流,此时R无穷大,称为高阻态。
输入模式:

外界方波信号通过IO口输入至内部经过施密特触发器(想学的深入数字电路)将高电平转化为1,将低电平转化为0,不过不用担心,在这里可以将施密特触发器看做无穷大电阻,电流趋近于0。
输入上拉:
IO口输入高电平,经过转换,向输入数据寄存器中写1 。
输入下拉:
IO口输入低电平,经过转换,向输入数据寄存器中写0 。
保护二极管作用:
防止静电,当外部输入携带正电荷时,电流从IO口通过上方二极管流向Vdd。
当外部输入携带负电荷时,电流从Vss通过下方二极管流向IO口。
上拉电阻和下拉电阻:
当IO口为输入浮空状态时,若上拉电阻使能,给电路提供默认高电压,将施密特触发器看做无穷大电阻,则此处分得高电压,将此处电压转化为1,写入输入数据寄存器。
若下拉电阻使能,给电路提供默认低电压,同理此处分得低电压,将此处电压转化为0,写入输入数据寄存器。
3.GPIO的最大输出速度
什么是IO的最大输出速度呢?

理想如图所示,但现实情况并非如此。

在实际的向IO写0/1时,电压并不能瞬间从3.3V切换至0V,而是有上升时间,下降时间,以及真正有效的电压转换的保持时间。上升时间与下降时间越短,IO的最大输出速度也就越大。
如下图所示中:

但随着上升时间下降时间的变短,上升下降坡度越来越陡,保持时间趋向0时,则不能采集到实际的电压变化,在保持时间内电压状态才能正常采集。
STM32中共有三种输出速度:
低速 = 1/(125+250+125)ns = 2MHz
中速 = 1/(25+50+25)ns = 10MHz
高速 = 1/(5+10+5)ns = 50MHz

提示:在配置输出速度时,并不是速度越快越好,而是要选取满足要求的最小值
这是由于
过于陡峭的边沿会增加功耗(耗电过大),并引入EMI问题(对其他电子元器件产生电磁干扰)。
GPIO的输出实验
基于标准库实现,LED灯的闪烁实验:


LED灯的推挽接法 LED灯的开漏接法
限流电阻的作用:
通过发光二级管的电流通常为2-10mA,限流电阻将电流控制在此范围内,保护二极管。
LED实验代码部分(main)
模版链接:https://pan.baidu.com/s/1kcKd063anDtFZ1gG97cOKg?pwd=3kvt 提取码:3kvt
tips:铁头山羊老师的模版,应用标准库,另添加了PAL库。
LED原理图如下:

伪代码:
//1.开启GPIOC时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
为何要开启GPIOC的时钟?
MCU为节省功耗,默认情况下,部分片上外设时钟处于关闭状态,需要手动使能。
//2.初始化IO引脚,PC13通用输出开漏模式
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_OD;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOC,&GPIO_InitStruct);
LED间隔0.1s闪烁
#include <delay.h> //PAL库
while(1)
{
GPIO_WriteBit(GPIOC,GPIO_Pin_13,Bit_RESET);//亮
Delay(100);
GPIO_WriteBit(GPIOC,GPIO_Pin_13,Bit_SET);//灭
Delay(100);
}
GPIO的输入实验
基于标准库实现,通过按钮控制LED亮灭。采用上方LED,此处默认LED已初始化。

//1.开启GPIOA时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);

//2.初始化IO引脚,PA1采用输入上拉模式
//GPIO_InitTypeDef GPIO_InitStruct = {0};//可省略
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;
//GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOA,&GPIO_InitStruct);
按键主函数,按下点亮,松开熄灭
while(1)
{
if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_1)==Bit_RESET)//按下
{
GPIO_WriteBit(GPIOC,GPIO_Pin_13,Bit_RESET);//亮
}
else
{
GPIO_WriteBit(GPIOC,GPIO_Pin_13,Bit_SET);//灭
}
}
创作不易,请多多点赞,收藏,转发,您的支持,是我创作最大的动力!
内容若有误,在所难免,还望指出,定会积极订正,不胜感激,还望海涵!
更多推荐



所有评论(0)