前面我们分析过GPIO的各个寄存器,探讨了如何使用GPIO点亮LED,这里再验证一下GPIO的输入功能
1.硬件连接
我们在开发板上将按键连接到了PA0引脚,按键外接了上拉电阻,默认状态下PA0引脚处于高电平,当按键按下,PA0引脚就与GND短接,变为低电平,所以我们可以通过读取PA0引脚的电平状态来判断按键是否被按下
2.软件编程
这里使用STM32CubeMX来配置PA0引脚的初始化:
生成代码后,可以看见程序中已经添加了PA0引脚初始化部分
在while循环中添加如下代码:
注意按键要进行软件消抖(按键按下与断开时都会有干扰产生,可以进行软件延时消抖,一般可以延时10-20ms,具体可以参考代码中的注释)。
while (1)
{
/* 读取PA0引脚电平 */
if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_RESET) {
/* 如果是低电平, 表示有按键按下, 进行软件延时消抖 */
HAL_Delay(10);
/* 再次读取PA0引脚电平, 如果还是低电平, 就认为有按键按下 */
if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_RESET) {
/* 等待按键释放 */
while(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_RESET);
/* 翻转一次按键标志 */
ek_key_flag = !ek_key_flag;
printf("key pressed.\r\n");
}
}
/* 按键每次按下后, ek_key_flag会在0与1之间变换 */
if(ek_key_flag)
/* 当ek_key_flag == 1时点亮LED */
HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_RESET);
else
/* 当ek_key_flag不为1时熄灭LED */
HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_SET);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
将程序下载后可以打开串口调试助手,每当按键按下会打印“key pressed.”信息,并且LED会在亮灭之间翻转
本例程代码可以在HAL库工程模板这一章节的最后,百度网盘链接分享处获取
以上是通过开发板进行实际验证的,下面使用软件仿真,
我们首先进入调试界面( 前面章节有提到,所以本篇以及后续章节都不再重复提及 ),
将控制LED的引脚添加进逻辑分析仪( 前面章节有提到如何添加 )
打开GPIOA窗口
确定要操作的连接按键的引脚PA0
运行仿真,点击PA0引脚后可以看到LED引脚变为了低电平
打开串口调试界面( 前面章节有提到如何添加 ),也可以看到打印的“key pressed.”信息