一、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);
}