[GPIO]的输入与输出模式(stm32学习)
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初始化:
向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的输入部分

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

当静电为正值时,比如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();
}

更多推荐



所有评论(0)