GPIO的8种工作模式

在这里插入图片描述

GPIO 输出部分

[GPIO]LED闪灯实验

本实验采用CPU直接控制GPIO的PC13引脚,向输出数据寄存器写0/1来控制GPIO_PIN_13输出低/高电压(平),PC13控制的板载LED相应的会亮起或熄灭。
实验原理图:
在这里插入图片描述
由于PC13是板载LED,根据STM32F103C8T6原理图可知它采用的是开漏接法

在这里插入图片描述

一、初始化参数配置

引脚:GPIO_Pin_13
工作模式:采用开漏输出(OD)
输出速度:低速2MHz (板载LED的频率一般为100Hz)

二、GPIO的四个编程接口

GPIO编程接口
GPIO初始化:
在这里插入图片描述
向IO写0/1:
在这里插入图片描述

读取IO值:
在这里插入图片描述

三、编程实现

1.先开启GPIOC的时钟 (时钟就相当于心跳,负责供血,开启时钟后,GPIO模块才能正常控制运行)

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);

2.初始化一个结构体

// #2.初始化IO引脚,PC13通用输出开漏模式  2MHz
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);

3.在while循环中向IO写0/1控制LED的亮灭(闪烁)

while(1)
{
	GPIO_WriteBit(GPIOC,GPIO_Pin_13,Bit_RESET);//亮
	Delay(100); //延迟100ms
	GPIO_WriteBit(GPIOC,GPIO_Pin_13,Bit_SET);//熄灭
	Delay(100); //延迟100ms
}

完整实现代码:
在这里插入图片描述补充:LED的亮灭也可以进行宏定义,直接调用LED1_ON();或者LED1_OFF();即可。

#define LED1_ON  GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_SET)
#define LED1_OFF GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_RESET)

GPIO的输入部分

GPIO的输入部分

保护二极管

作用:防止静电,保护芯片,保护电路不受静电影响。
保护二极管

保护二极管的工作原理:

保护二极管的工作原理
当静电为正值时,比如10000V,电压由高压流向低压,上方3.3V的保护二极管导通,保护电路

保护二极管工作原理
当静电为负值时,比如-10000V,下方二极管导通
注意:二极管是单向导通

GPIO的四种输入模式

输入上拉(闭合开关,使能上拉电阻)
输入下拉(闭合开关,使能上拉电阻)
输入浮空(两个开关都断开)
模拟模式(ADC,DAC)

上拉电阻与下拉电阻

上拉电阻与下拉电阻的作用:起一个稳定的作用,为IO引脚提供默认的电压
上拉电阻可以为IO引脚提供一个默认的高电压
下拉电阻可以为IO引脚提供一个默认的低电压
上拉电阻与下拉电阻
1.向IO输入低电压时:
在这里插入图片描述
2.向IO输入高电压时:
在这里插入图片描述
3.当IO引脚悬空时:
在这里插入图片描述
当IO引脚悬空时,易受外界的电磁波干扰,导致输入数据寄存器读入的值一会儿是0,一会儿是1,电路不稳定
因此,我们为防止这种不稳定情况的发生,我们增加了上拉电阻下拉电阻

上拉电阻原理

当我们闭合上拉电阻开关时,上拉电阻会为IO引脚提供一个默认的高电压。
此情况下,1.若IO引脚不悬空,向IO输入一个3V3,输入数据寄存器读到的数为1,
​ 向IO输入一个0V,输入数据寄存器读到的数为0。
所以,IO引脚不悬空时,默认的高电压对转换结果无影响。
在这里插入图片描述
2.当IO悬空时,上拉电阻会把IO引脚拉成高电压(给IO引脚提供一个默认的高电压),此时输入数据寄存器会读到一个稳定的1。
在这里插入图片描述
下拉电阻原理与之相同,此处不再赘述。

施密特触发器

作用:对连续变化的模拟输入电平整形,输出标准数字高低电平(逻辑 0/1),具备滞回回差特性,拥有上升、下降两套不同翻转阈值电压,能抑制信号毛刺抖动干扰
输入电流特性:
CMOS 工艺施密特:栅极输入漏电流极小,近似无直流输入电流,TTL 工艺施密特:存在毫安级输入电流,不可忽略。
典型应用波形整形机械按键消抖RC 多谐振荡电路抗干扰电平检测

在这里插入图片描述

按钮实验

1.LED的接线方法:
按钮实验图
在这里插入图片描述

在板载LED闪灯实验时,我们采用的是开漏接法,本次实验我们选用推挽接法
LED阳极接PA0,阴极接地。
2.按钮的接线方法:
按钮的一端接IO引脚,另一端接地。把IO引脚设置成输入上拉模式。
在这里插入图片描述
按钮电路图

编程实现

在这里插入图片描述
1.先开GPIOA的时钟

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

2.初始化LED

GPIO_InitTypeDef GPIO_InitStruct={0};//定义一个结构体
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_0;//引脚
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;//推挽模式
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_2MHz;//2MHz
GPIO_Init(GPIOA,&GPIO_InitStruct);//初始化IO (PA0)

3.初始化按键

GPIO_InitStruct.GPIO_Pin=GPIO_Pin_1;//引脚
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPU;//输入上拉模式
//输入不需要设置速度
GPIO_Init(GPIOA,&GPIO_InitStruct);//初始化IO (PA1)
	

4.按键控制LED

while(1)
	{
	
	if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_1)==Bit_RESET)//当按键按下
	{
		LED1_ON();
	}
	else
	{
		LED1_OFF();
	}

在这里插入图片描述

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐