STM32嵌入式开发学习笔记(三):使用按键控制小灯
按键和小灯一样,也是通过GPIO外设与主板连接,也是通过GPIO_InitStruct类型结构体控制其工作。
查阅技术手册,按钮连接GPIOA控制下的管脚0.
但与之不同的是,按键是一种输入设备,输入设备的工作状态也有四类,模拟输入,浮空输入,下拉输入和上拉输入。
模拟输入就是输入一个波形,浮空输入指的是未按下按钮时,不确定此管脚的信号状态。
上拉输入指按下按钮时,输出低电平,即0,松开按钮时,输出高电平,即1.
下拉输入则相反。
但是因为STM32的构造问题,按钮只能采用上拉输入,如果将此管脚工作状态定义为下拉输入,则输出会保持0.
可能是因为管脚A1STM32的设计上就是接地的,因此,下拉输入,按下按钮后依然保持了低电平。
用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