STM32笔记(第6天)——按键控制详解

目录

一、按键硬件图

1、硬件原理

2、输入方式选择

二、功能实现

1、按键GPIO配置

2、按键扫描函数

3、LED翻转宏定义

4、主程序

参考



一、按键硬件图

1、硬件原理

        按键的硬件原理图如图,右侧接3.3V,有电容并联作为硬件消抖,非按下状态时PA0接地为低电平,按下状态时导通接高电平。

2、输入方式选择

        GPIO端口基本结构如图,共有四种输入类型:模拟输入、浮空输入、上拉输入、下拉输入。

        模拟输入:外部的电压真实的读取到单片机的AD模块,我们既不能闭合上拉和下拉的开关,也不能让信号经过施密特触发器。

        浮空输入:VDD和VSS所在路径的两个开关同时断开,通过施密特触发器读取数字信号,此时没有上拉和下拉的情况,所以当IO口没有接输入的时候,此时的电平会是一个不确定的值,也就是我们所说的浮空。电平会处于一个跳变的状态,一会高,一会低。只有输入了一个高/低电平才会确定下来。因此一般有外部电路时使用浮空输入,比如此次用到的按键电路。

        上拉输入:VDD的开关闭合,VSS的开关断开,没有输入信号时一直读取到高电平。输入高电平,读取仍然是高电平,输入低电平时,由于上拉电阻存在,读取到低电平。好处是输入的电平不会上下浮动而导致输入信号不稳定,没有输入时稳定在高电平。

        下拉输入:VDD的开关断开,VSS的开关闭合,原理与上拉相反,用来读取高电平。好处也是不会受浮动影响,没有输入时稳定在低电平。

 

二、功能实现

1、按键GPIO配置

        与LED的GPIO配置函数相同,对于按键1对应的PA0口也需要进行GPIO的初始化配置,包括初始化结构体变量、开启RCC对应APB2的时钟、引脚号配置、端口输入输出模式配置、最后调用初始化函数。

void Button_GPIO_Config(void)
{
	GPIO_InitTypeDef GPIO_InitStruct;					//初始化结构体变量
	RCC_APB2PeriphClockCmd(BUTTON_GPIO_CLK, ENABLE);    //RCC时钟使能
	GPIO_InitStruct.GPIO_Pin = BUTTON_GPIO_PIN;			//引脚
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;  //浮空输入
	GPIO_Init(BUTTON_GPIO_PORT, &GPIO_InitStruct);		//初始化函数调用
}

2、按键扫描函数

        此处用到while函数作为松手检测,按下时PA0为1,不松手则退不出while循环,松手后退出循环返回1。

uint8_t Button_scan(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin)
{
	if(GPIO_ReadInputDataBit(GPIOx, GPIO_Pin) == KEY_ON)
	{
		//松手检测
		while(GPIO_ReadInputDataBit(GPIOx, GPIO_Pin) == KEY_ON);
		return KEY_ON;
	}
	else return KEY_OFF;
}

3、LED翻转宏定义

        和0异或保持不变,和1异或翻转,因为LED_G_GPIO_PIN的宏定义就是0x0001,利用这点,把ODR和引脚号异或,可以实现翻转操作。

#define LED_G_TOGGLE        {LED_G_GPIO_PORT->ODR ^= LED_G_GPIO_PIN;}

4、主程序

int main(void)
{
	Button_GPIO_Config();
	LED_GPIO_Config();
	GPIO_SetBits(GPIOB, GPIO_Pin_0);
	
	while(1)
	{
		if(Button_scan(BUTTON_GPIO_PORT,BUTTON_GPIO_PIN))
		LED_G_TOGGLE;
	}
}

参考

[野火®]STM32库开发实战指南——基于野火指南者开发板 — [野火]STM32库开发实战指南——基于野火指南者开发板 文档

物联沃分享整理
物联沃-IOTWORD物联网 » STM32笔记(第6天)——按键控制详解

发表评论