STM32嵌入式开发学习笔记三:使用按键折腾小灯

    技术2025-09-03  29

    本文转载自:https://www.cnblogs.com/isakovsky/p/11424459.html

    按键和小灯一样,也是通过GPIO外设与主板连接,也是通过GPIO_InitStruct类型结构体控制其工作。

    查阅技术手册,按键连接GPIOA控制下的管脚0。

    但与之不同的是,按键是一种输入设备,输入设备的工作状态也有四类,模拟输入,浮空输入,下拉输入和上拉输入。

    模拟输入就是输入一个波形,浮空输入指的是未按下按钮时,不确定此管脚的信号状态。

    上拉输入指按下按钮时,输出低电平,即0,松开按钮时,输出高电平,即1。

    下拉输入则相反。

    但是因为STM32的构造问题,按钮只能采用上拉输入,如果将此管脚工作状态定义为下拉输入,则输出会保持0。

    可能是因为管脚A1的设计上就是接地的,因此,下拉输入,按下按钮后依然保持了低电平。

    用GPIO_ReadInputDataBit函数读取某个管脚的输入输出,注意此函数返回值是u8,无符号8位整数。

    在key.h/.c文件中定义和实现按钮初始化和读取按钮功能。

    #include <stm32f10x.h> #ifndef _KEY_H #define _KEY_H void KEY_configer(void); u8 KEY_scan(void); #endif //key.h #include <stm32f10x.h> #include <key.h> void KEY_configer(){ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); GPIO_InitTypeDef GPIO_KEY_INIT; GPIO_KEY_INIT.GPIO_Pin=GPIO_Pin_0; GPIO_KEY_INIT.GPIO_Speed=GPIO_Speed_2MHz; GPIO_KEY_INIT.GPIO_Mode=GPIO_Mode_IPU; GPIO_Init(GPIOA,&GPIO_KEY_INIT); } u8 KEY_scan(){ return GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0); } //key.c

    在led.h/.c中定义小灯初始化和开关

    #include <stm32f10x.h> #ifndef _LED_H #define _LED_H void LED_configer(void); void LED_on(void); void LED_off(void); #endif //led.h #include <led.h> #include <stm32f10x.h> void LED_configer(){ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); GPIO_InitTypeDef GPIO_LED_INIT; GPIO_LED_INIT.GPIO_Pin=GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4; GPIO_LED_INIT.GPIO_Speed=GPIO_Speed_2MHz; GPIO_LED_INIT.GPIO_Mode=GPIO_Mode_Out_PP; GPIO_Init(GPIOA,&GPIO_LED_INIT); } void LED_on(){ GPIO_SetBits(GPIOA,GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4); } void LED_off(){ GPIO_ResetBits(GPIOA,GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4); } //led.c

    主函数的实现逻辑是,不断询问按钮状态,若按下则打开小灯,若未按下则关闭小灯

    #include <stdio.h> #include <stm32f10x.h> #include <led.h> #include <key.h> int main(){ KEY_configer(); LED_configer(); while(1){ if(KEY_scan()==0){ LED_on(); }else{ LED_off(); } } return 0; } //main.c

    附:《STM32固件库使用手册》和《STM32参考手册》下载地址: https://blog.csdn.net/weixin_41561640/article/details/107124800

    Processed: 0.012, SQL: 9