stm32cubemx hal学习记录:GPIO输入输出

一、GPIO

1、为何需要IO:开关

2、为何需要不同的模式:让IO可以适配更多应用场景

3、IO输入模式

①模拟模式:即为输入模拟信号 ADC

②浮空输入:I/O口的状态是不确定的,完全由外部输入决定,如外部KEY有上下拉

③下拉输入:在没有信号输入的时候默认输入低电平 外部KEY接VCC

④上拉输入:在没有信号输入的时候默认输入高电平 外部KEY接GND

4、IO输出模式

①开漏输出:IO输出0接GND,IO输出1,悬空,需要外接上拉电阻,才能实现输出高电平。当输出为1时,IO口的状态由上拉电阻拉高电平,但是由于是开漏输出模式,这样IO口就可以由外部电路改变为低电平或不变。可以读IO输入电平变化,实现IO双向共嗯那个,模拟IIC

②推挽输出:IO输出0-接GND,IO输出1-接VCC,读输入值是未知的

③复用功能的推挽输出AF_PP:片内外设功能(IIC的SDA、SCL)

④复用输出的开漏输出AF_OD:片内外设功能(MOSI、MISO、SCK、SS)

5、如何使用

①作为普通GPIO输入使用:根据需要配置的引脚,同时不要使能该引脚的所有复用功能模块

②作为普通模拟输入:配置该IO口为模拟输入模式,同时不要使能该引脚对应的所有复用功能模块

③作为内置外设的输入的设置:根据需要配置该引脚为浮空输入带弱上拉输入或者带弱下拉输入,同时使能该引脚对应的某个复用功能模块

④作为内置外设输出:根据需要配置该引脚为复用推挽输出或者复用开漏输出,同时使能该引脚对应的复用功能模块。

6、用途

①按键信号

②继电器

③IO输入量传感器

二、GPIO输出 LED BEEP

1、单片机原理图

 蜂鸣器输出接口随便选一个,选PB4,在cubemx中将引脚设置为输出,为了使灯在初始化后不亮,将初始电平设置为高电平。

三、GPIO输入 KEY

由原理图可知,KEY_UP按下时为高电平,KEY0和KEY1按下时为低电平。在cubemx中将这三个引脚设置为输入模式。

四、GPIO输入 读取高低电平

选取PB5,将PB5设置为输入模式

五、初始化串口

六、设置时钟

七、代码编写

1、LED、BEEP

void LED_Proc(void)
{
	HAL_GPIO_WritePin(GPIOF,GPIO_PIN_9,GPIO_PIN_RESET);
	HAL_GPIO_WritePin(GPIOF,GPIO_PIN_10,GPIO_PIN_RESET);
	HAL_Delay(1000);
	HAL_GPIO_WritePin(GPIOF,GPIO_PIN_9,GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOF,GPIO_PIN_10,GPIO_PIN_SET);
	HAL_Delay(1000);
}
void BEEP_Proc(void)
{
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_SET);
	HAL_Delay(1000);
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_RESET);
	HAL_Delay(1000);	
}

2、KEY读取

uint8_t KEY_Read(void)
{
	uint8_t value=0;
	
	if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_8)==0)
	{
		HAL_Delay(10);
		if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_8)==0)
		{
			value=1;
		}
	}
	
	if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_9)==0)
	{
		HAL_Delay(10);
		if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_9)==0)
		{
			value=2;
		}
	}
	
	if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==0)
	{
		HAL_Delay(10);
		if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==0)
		{
			value=3;
		}
	}

	return value;
}

uint8_t ucKey=0;
void KEY_Proc(void)
{
	uint8_t key_value=0;
	key_value=KEY_Read();
	if(key_value!=ucKey)
		ucKey=key_value;
	else
		key_value=0;
	
	switch(key_value)
	{
		case 1:
			HAL_GPIO_WritePin(GPIOF,GPIO_PIN_9,GPIO_PIN_RESET);
		break;
		
		case 2:
			HAL_GPIO_WritePin(GPIOF,GPIO_PIN_9,GPIO_PIN_SET);
		
		break;
		
		case 3:
			HAL_GPIO_TogglePin(GPIOF,GPIO_PIN_9);
		break;
	}
}

3、GPIO读取高低电平

uint8_t GPIO_Read(void)
{
	return HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_5);
}

  • 0
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值