这里练习输入采用的是的是外接按键模块,按键模块原理图如下:
按下之后电流会有点大 为了保护GPIO所以接了R15 为限流电阻,因为按下之后触发,所以K1的触发方式是高电平触发。上端的电容是消抖功能,所以在写程序时候可以不用软件消抖。
一、这里首先我们需要定义引脚:这里新建一个bsy_key.h函数用来定义按键的i/o口,因为主函数main只引入了bsy_key.h而没有引入bsy_key.c,所以需要把bsy_key.c中的文件
void KEY_GPIO_Config(void);
uint8_t Key_Scan(GPIO_TypeDef *GPIOx,uint16_t GPIO_Pin);这两个函数引入进来。
#ifndef __BSP_KEY_H
#define __BSP_KEY_H
#include "stm32f10x.h" //引用库函数
#define KEY1_GPIO_PIN GPIO_Pin_0
#define KEY1_GPIO_PORT GPIOA
#define KEY1_GPIO_CLK RCC_APB2Periph_GPIOA
#define KEY_ON 1
#define KEY_OFF 0
void KEY_GPIO_Config(void);
uint8_t Key_Scan(GPIO_TypeDef *GPIOx,uint16_t GPIO_Pin);
#endif /*__BSP_KEY_H*/
二、 bsy_key.c定义一些需要用的函数,stm32GPIO的引脚有8种输出方式,因为由上面的原理图可知我所使用的单片机开发板已经具有外部的下拉电阻对按键进行保护,所以这里我直接使用了浮空输入,如果外部电路没有下拉电阻,应该采用输入下拉的方式。
#include "bsp_key.h"
void KEY_GPIO_Config(void){ //引脚初始化的函数.
GPIO_InitTypeDef GPIO_InitStruct; //GPIO_InitTypeDef 是一个结构体类型,用于配置 STM32F103 系列芯片的 GPIO 端口。在上述代码中,GPIO_InitStruct 是一个变量,用于保存 GPIO 端口的配置信息。
RCC_APB2PeriphClockCmd(KEY1_GPIO_CLK,ENABLE); //GPIOB口的时钟称为使能状态
GPIO_InitStruct.GPIO_Pin = KEY1_GPIO_PIN; //选择待设置引脚
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING; //模式设置为浮空输入
GPIO_Init(KEY1_GPIO_PORT, &GPIO_InitStruct); //通过调用 GPIO_Init() 函数来将配置应用到相应的 GPIO 端口。
}
//定义按键检测输入函数
uint8_t Key_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;
}
三、主函数main.c,主函数里面我加入了一个按键来控制led灯的亮灭的作用,如果不需要控制可以删掉有关led的语句代码。如果使用了led需要在"bsp_led.h"文件中加入
#define LED_G_TOGGLE {LED_G_GPIO_PORT->ODR ^= LED_G_GPIO_PIN;}
代码来实现按键按下之后可以控制led灯的亮灭。
#include "stm32f10x.h"
#include "bsp_led.h"
#include "bsp_key.h"
void delay(uint32_t count)
{
for(;count!=0;count--);
} //定义一个延时函数。
int main(void) {
//来到这里的时候,系统时钟已经被配置成72M
LED_GPIO_Config(); //运行端口定义函数
KEY_GPIO_Config();
while(1){
if(Key_Scan(KEY1_GPIO_PORT,KEY1_GPIO_PIN) == KEY_ON)
LED_G_TOGGLE;
}
}