STM32F103单片机GPIO

STM32单片机GPIO输入输出

前言

在学习单片机过程中,对单片机的IO引脚操作是最基本的入门第一步,对普通GPIO的操作主要分为输出以及输入两部分:
1.GPIO输出:输出就是控制单片机的IO引脚输出高电平或者低电平,达到对外控制的目的。例如:现在需要点亮一个LED小灯,LED负端已经接地,而正端连接着单片机其中一个IO,此时只需要让单片机该IO输出高电平即可点亮LED,输出低电平即可熄灭LED;
2.GPIO输入:输入即单片机可读取外部高低电平信号,进而获得外部控制状态去执行其他逻辑操作。例如:单片机读取外部按键。
本文主要就通过对按键的读取来控制LED指示灯的亮灭举例说明:

一、新建自己的库

前面在创建工程模板时,加入了一些官方的库文件,以后在写程序过程中,只需要调用官方的库文件里面的函数即可,但这些库函数也只是一些独立的配置函数,根据不同的使用环境需要我们调用这些函数组合配置,因此,为了自己的程序可读性以及使用起来更加方便,我们可以把官方的库函数再次封装成为一个新函数,也就是建立自己的库函数,这样我们在使用的过程中也会更加得心应手。下面开始建立我们的库文件:
1.在工程文件夹中建立一个MLib文件夹,代表“我的库”;
在这里插入图片描述
2.在Mlib文件夹里面右键新建文本文档,改名为gpio.c和gpio.h文件;
在这里插入图片描述
也可在keil里面点击新建文件,然后保存到MLib文件夹,保存名字为gpio.c以及gpio.h
在这里插入图片描述
3.打开工程,根据之前STM32新建工程模板一样的方法将文件添加进来。
在这里插入图片描述
添加进来后,点击OK,在左边目录栏将会增加刚刚添加的文件,如下
在这里插入图片描述
4.加载头文件,头文件即后缀为.h的文件,现在gpio.c文件通过手动添加进来后,gpio.h文件需要让其能够加载进来,因此,在gpio.c中声明包含gpio.h文件,如下:
在这里插入图片描述
目前,只声明包含,若编译将会报错,因为工程编译过程中,系统也不知道去哪找到这个gpio.h文件,在项目配置中有一个头文件路径声明,这里由于新建了一个MLib目录,还没有在路径中添加该目录,因此工程不知道这个路径的存在,需要添加目录,这个配置同样可参考STM32新建工程模板,如下添加:
在这里插入图片描述
在这里插入图片描述
添加完成后点击OK保存,之后再点击编译即可把gpio.h文件加载进来(编译时,.c文件最后回车空一行,不然编译会报一个警告,之后.h文件一样需要空一行,这是keil软件问题决定的,不空也没影响,只是会有警告)
在这里插入图片描述
5.头文件添加内容,为了以后更加复杂的工程在添加这些文件后不会出现重复添加情况,需养成一个好习惯,在头文件中添加如下内容,声明如果工程中没有定义过gpio.h文件,就在这里定义,GPIO要大写。同时加载官方的库头文件,因为我们建立自己的库也是在调用官方库的基础上建立的,需要使用到官方库函数,因此需要包含进来。
在这里插入图片描述
到这里,一个自己新建的库文件即建立完成,但里面内容还未添加,此次新建的为gpio的文件,因此可以在里面添加关于GPIO的操作(添加其他任何内容都可,只是为了项目管理,最好根据内容命名添加,其他内容可新建添加其他命名的.c以及.h文件)。

二、GPIO输出

在gpio.c文件中添加如下代码:

void GPIO_OUT_Config(void)   //GPIO输出配置
{
    GPIO_InitTypeDef    GPIO_InitStructure;   //声明结构体
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);   //使能GPIOA时钟
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;   //配置输出引脚
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   //配置输出模式为推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;   //输出速度
	GPIO_Init(GPIOA,&GPIO_InitStructure);   //初始化配置到GPIOA
}

gpio.h中申明函数名,这样在其他文件调用时才能通过.h文件找到这个函数,其中假设GPIOA的引脚0连接了一个LED灯,现在LED灯高电平点亮,低电平熄灭,因此如下定义LED_ON与LED_OFF,在其他函数直接调用即可

#ifndef _GPIO_H  //如果没有定义gpio.h
#define _GPIO_H  //定义gpio.h

#include "stm32f10x.h"  //包含STM32F1x头文件

#define LED_ON   GPIO_SetBits(GPIOA,GPIO_Pin_0)  //宏定义GPIOA的引脚0输出高电平
#define LED_OFF  GPIO_ResetBits(GPIOA,GPIO_Pin_0)  //宏定义GPIOA的引脚0输出高电平

void GPIO_OUT_Config(void);   //GPIO输出配置
void GPIO_IN_Config(void);   //GPIO输入配置

#endif

在主函数调用即可控制LED灯点亮

#include "stm32f10x.h"
#include "gpio.h"

int main()
{
    GPIO_OUT_Config();   //GPIO输出配置
	
    while(1)
	{
	  LED_ON;  //点亮LED
	}
}

三、GPIO输入

在gpio.c文件中添加如下代码:

void GPIO_IN_Config(void)   //GPIO输入配置
{
    GPIO_InitTypeDef    GPIO_InitStructure;   //声明结构体
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);   //使能GPIOA时钟
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 ;   //配置输入引脚
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;  //配置输入模式为上拉输入
	GPIO_Init(GPIOA,&GPIO_InitStructure);  //初始化配置到GPIOA
}

gpio.h文件内容如下

#ifndef _GPIO_H  //如果没有定义gpio.h
#define _GPIO_H  //定义gpio.h

#include "stm32f10x.h"  //包含STM32F1x头文件

#define LED_ON   GPIO_SetBits(GPIOA,GPIO_Pin_0)  //宏定义GPIOA的引脚0输出高电平
#define LED_OFF  GPIO_ResetBits(GPIOA,GPIO_Pin_0)  //宏定义GPIOA的引脚0输出低电平

#define Key_Read  GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_2)  //读取GPIOA的引脚2电平

void GPIO_OUT_Config(void);   //GPIO输出配置
void GPIO_IN_Config(void);   //GPIO输入配置

#endif

这里增加了一个读取电平的宏定义
同理,在主函数中,我们结合前面的点亮LED,这里输入假设GPIOA的引脚2连接了一个按键,按键按下将输入高电平,松开为低电平
在这里插入图片描述

因此,这里写一个按键按下点亮LED,松开熄灭LED的操作

#include "stm32f10x.h"
#include "gpio.h"

int main()
{
	GPIO_OUT_Config();   //GPIO输出配置
	GPIO_IN_Config();   //GPIO输入配置
	
  while(1)
	{
	  if(Key_Read==1)  //如果读取到按键输入为高电平,即按键按下
		{
		  LED_ON;   //LED点亮
		}
		else  //否则,即输入为低电平,按键松开
       { 
		  LED_OFF;   //LED熄灭
	   }
	}
}

本文介绍了GPIO的输入以及输出的最简单操作,以按键点亮LED灯为例说明了对按键输入的读取,然后通过读取到的按键信息去点亮与熄灭LED。

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值