赞
踩
我们在上一节已经知道了点灯操作,相当于是学会了GPIO输出的配置,接下来是GPIO输入完成按键扫描的操作。
前期准备
同样的我们先来看看按键模块的原理图部分:
当按键没有按下时,按键部分相当于断路,PC13的电压相当于电容两端电压为3.3V。
当按键按下时,按键部分相当于短路(即一根导线),PC13的电压和GND地相连为0V。
所以按键从未按下到按下相当于是一个高电平到低电平的跳变,简称为下降沿。
搜索或者筛选芯片后,点击Start Project成功创建一个项目。
点击RCC进入时钟配置,配置高速时钟为外部晶振,软件自动配置了两个晶振的引脚如图PD0和PD1
这里我们还是一样配置为最高的时钟频率72M,在对应的框中输入72,按下回车即可见到如下两图的变化。按下回车前如图:
按下回车后如图:
同样的我们填写好工程名KEY,选择好文件路径,以及所用的IDE以及版本号即可
代码生成选择好这两个后点击右上角按钮,产生代码:
我们再来看看GPIO模块对应的API函数:
/* 初始化和删除初始化函数, HAL_GPIO_Init:cubemx生成代码后自动调用初始化函数 HAL_GPIO_DeInit:解除初始化,不想使用时可以主动使用*/ void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init); void HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin); /* 操作GPIO的函数,包括读取,写入,翻转,加锁,中断服务函数以及回调函数 HAL_GPIO_ReadPin:读取引脚电平 返回值为(GPIO_PIN_RESET/GPIO_PIN_SET) HAL_GPIO_WritePin:写入引脚电平 HAL_GPIO_TogglePin:翻转引脚电平 HAL_GPIO_LockPin:所以引脚当前电平,将无法改变 HAL_GPIO_EXTI_IRQHandler:引脚的中断服务函数 HAL_GPIO_EXTI_Callback:引脚的中断回调函数 */ GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin); void HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState); void HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin); HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin); void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin); void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin);
我们可以在main.h中看到之前定义的用户标签,如下:
/* Private defines -----------------------------------------------------------*/
#define KEY2_Pin GPIO_PIN_13
#define KEY2_GPIO_Port GPIOC
#define LED1_Pin GPIO_PIN_14
#define LED1_GPIO_Port GPIOC
#define LED2_Pin GPIO_PIN_15
#define LED2_GPIO_Port GPIOC
#define KEY1_Pin GPIO_PIN_12
#define KEY1_GPIO_Port GPIOC
下面是mian()函数:
int main(void) { /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ /* MCU Configuration--------------------------------------------------------*/ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); /* USER CODE BEGIN Init */ /* USER CODE END Init */ /* Configure the system clock */ SystemClock_Config(); /* USER CODE BEGIN SysInit */ /* USER CODE END SysInit */ /* Initialize all configured peripherals */ MX_GPIO_Init(); /* USER CODE BEGIN 2 */ /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { //有按键1按下 if(HAL_GPIO_ReadPin(KEY1_GPIO_Port,KEY1_Pin) == GPIO_PIN_RESET) { /* 软件消抖 */ HAL_Delay(20); /* 翻转LED1 */ HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin); /* 等待按键1松开 */ while(HAL_GPIO_ReadPin(KEY1_GPIO_Port,KEY1_Pin) != GPIO_PIN_SET); } //有按键2按下 if(HAL_GPIO_ReadPin(KEY2_GPIO_Port,KEY2_Pin) == GPIO_PIN_RESET) { /* 软件消抖 */ HAL_Delay(20); /* 翻转LED2 */ HAL_GPIO_TogglePin(LED2_GPIO_Port,LED2_Pin); /* 等待按键2松开 */ while(HAL_GPIO_ReadPin(KEY2_GPIO_Port,KEY2_Pin) != GPIO_PIN_SET); } /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ } /* USER CODE END 3 */ }
下载代码到板子中,我们按下不同的按键不同的LED对应的进行电平的翻转操作。
好啦,GPI按键输入就是这么简单就结束了,怎么样是不是感觉也很简单呀!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。