小白stm32学习笔记——I/O口输入练习

这里练习输入采用的是的是外接按键模块,按键模块原理图如下:

按下之后电流会有点大 为了保护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;
	}
}

  • 8
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值