STM32f1学习笔记二 GPIO库函数介绍与简单实验程序编写

2.1GPIO库函数介绍

1个初始化函数:

void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)
/*
作用:初始化一个或者多个IO口(同一组)的工作方式和速度。该函数主要操作CPIO_CRL(CRH)寄存器,在上拉或者下拉的时候有设置BSRR或者BRR寄存器。
GPIOx:CPIOA~CPIOG
typedef struct
{
  uint16_t GPIO_Pin;             /*指定要初始化的IO口 */

  GPIOSpeed_TypeDef GPIO_Speed;  /*设置IO口输出速度*/

  GPIOMode_TypeDef GPIO_Mode;    /*设置工作模式:8种中的一种*/
}GPIO_InitTypeDef;

*/

2个读取输入电平函数:

uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
/*
作用:读取某个GPIO的输入电平。实际操作的是GPIOx_IDR寄存器
例如:GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_5);//读取GPIOA.5的输入电平
*/
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx)
/*
作用:读取某组GPIO的输入电平。实际操作的是GPIOx_IDR寄存器
GPIO_ReadInputData(GPIOA)//读取CPIOA组中所有IO口的输入电平
*/

2个读取输出电平函数:

uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
/*
作用:读取某个GPIO的输出电平。实际操作的是GPIOx_ODR寄存器
例如:GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_5);//读取GPIOA.5的输出电平
*/
uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx)
/*
作用:读取某组GPIO的输出电平。实际操作的是GPIOx_ODR寄存器
例如:GPIO_ReadOutputData(GPIOA)//读取CPIOA组中所有IO口的输出电平
*/

4个设置输出电平函数

void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
/*
作用:设置某个IO口的输出为高电平(1)。实际操作BSRR寄存器
*/
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
/*
作用:设置某个IO口的输出为低电平(0)。实际操作BRR寄存器
*/
void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal)
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal)
/*
设置IO口输出电平,不常用。
*/

2.2跑马灯实验程序编写

2.2.1硬件连接
由原理图可知LED0一端与PE5端口连接,LED1一端与PB5端口连接,且LED0与LED1另一端共用3.3V的VCC。
在这里插入图片描述
2.2.2需调用的库函数

RCC_APB2PeriphColckCmd();//使能IO口时钟。不同的IO组,调用的时钟使能函数不一样
GPIO_Init();//初始化IO口模式
GPIO_SetBits();//操作IO口,输出高电平
GPIO_ResetBits();//操作IO口,输出低电平

2.2.3实验原码
led.h文件

#ifndef __LED_H
#define __LED_H	 
#include "sys.h"
#define LED0 PBout(5)// PB5
#define LED1 PEout(5)// PE5	

void LED_Init(void);//初始化
	 				    
#endif

led.c文件

#include "led.h"

//初始化PB5和PE5为输出口.并使能这两个口的时钟		    
//LED IO初始化
void LED_Init(void)
{
 
 GPIO_InitTypeDef  GPIO_InitStructure;
 	
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE, ENABLE);	 //使能PB,PE端口时钟
	
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;				 //LED0-->PB.5 端口配置
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 //推挽输出
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		 //IO口速度为50MHz
 GPIO_Init(GPIOB, &GPIO_InitStructure);					 //根据设定参数初始化GPIOB.5
 GPIO_SetBits(GPIOB,GPIO_Pin_5);						 //PB.5 输出高

 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;	    		 //LED1-->PE.5 端口配置, 推挽输出
 GPIO_Init(GPIOE, &GPIO_InitStructure);	  				 //推挽输出 ,IO口速度为50MHz
 GPIO_SetBits(GPIOE,GPIO_Pin_5); 						 //PE.5 输出高 
}

main.c文件

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"

 int main(void)
 {	
	delay_init();	    //延时函数初始化	  
	LED_Init();		  	//初始化与LED连接的硬件接口
	while(1)
	{
		LED0=0;
		LED1=1;
		delay_ms(300);	 //延时300ms
		LED0=1;
		LED1=0;
		delay_ms(300);	//延时300ms
	}
 }

2.3蜂鸣器实验程序编写

2.3.1硬件连接
由原理图可知三极管S8050通过放大基极电流控制蜂鸣器,而三极管的基极与PB8端口连接。

在这里插入图片描述
2.3.2需调用的库函数

RCC_APB2PeriphColckCmd();//使能IO口时钟。不同的IO组,调用的时钟使能函数不一样
BEEP_Init();//初始化IO口模式
GPIO_SetBits();//操作IO口,输出高电平
GPIO_ResetBits();//操作IO口,输出低电平

2.3.3实验原码
beep.h文件

#ifndef __BEEP_H
#define __BEEP_H	 
#include "sys.h"
//蜂鸣器端口定义
#define BEEP PBout(8)	// BEEP,蜂鸣器接口		   

void BEEP_Init(void);	//初始化
		 				    
#endif

beep.c文件

#include "beep.h"

//初始化PB8为输出口.并使能这个口的时钟		    
//蜂鸣器初始化
void BEEP_Init(void)
{
 
 GPIO_InitTypeDef  GPIO_InitStructure;
 	
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);	 //使能GPIOB端口时钟
 
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;				 //BEEP-->PB.8 端口配置
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 //推挽输出
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;	 //速度为50MHz
 GPIO_Init(GPIOB, &GPIO_InitStructure);	 //根据参数初始化GPIOB.8
 
 GPIO_ResetBits(GPIOB,GPIO_Pin_8);//输出0,关闭蜂鸣器输出

}

main.c文件

#include "sys.h"	
#include "delay.h"	
#include "beep.h" 

 int main(void)
 {
	delay_init();	    	 //延时函数初始化	  
	BEEP_Init();         	//初始化蜂鸣器端口
	while(1)
	{
		BEEP=0;		  
		delay_ms(300);//延时300ms  
		BEEP=1;  
		delay_ms(300);//延时300ms
	}
 }

2.3按键输入实验程序编写

2.3.1硬件连接
由原理图可知KEY0、KEY1和KEY2一端共地,其另一端与PE2、PE3、PE4端口相连,那么在设置IO口模式时应将端口的电压上拉,而KEY_UP与之相反,应将电压下拉。
在这里插入图片描述
2.3.2需调用的库函数

RCC_APB2PeriphColckCmd();//使能IO口时钟。不同的IO组,调用的时钟使能函数不一样
BEEP_Init();//初始化IO口模式
GPIO_ReadInputDataBit();//读取端口输入电平

2.3.3实验原码
key.h文件

#ifndef __KEY_H
#define __KEY_H	 
#include "sys.h"

#define KEY0  GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4)//读取按键0
#define KEY1  GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3)//读取按键1
#define KEY2  GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)//读取按键2 
#define WK_UP   GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)//读取按键3(WK_UP) 

#define KEY0_PRES 	1	//KEY0按下
#define KEY1_PRES	2	//KEY1按下
#define KEY2_PRES	3	//KEY2按下
#define WKUP_PRES   4	//KEY_UP按下(即WK_UP/KEY_UP)

void KEY_Init(void);//IO初始化
u8 KEY_Scan(u8);  	//按键扫描函数					    
#endif


key.c文件

#include "led.h"

//初始化PB5和PE5为输出口.并使能这两个口的时钟		    
//LED IO初始化
void LED_Init(void)
{
 
 GPIO_InitTypeDef  GPIO_InitStructure;
 	
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE, ENABLE);	 //使能PB,PE端口时钟
	
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;				 //LED0-->PB.5 端口配置
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 //推挽输出
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		 //IO口速度为50MHz
 GPIO_Init(GPIOB, &GPIO_InitStructure);					 //根据设定参数初始化GPIOB.5
 GPIO_SetBits(GPIOB,GPIO_Pin_5);						 //PB.5 输出高

 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;	    		 //LED1-->PE.5 端口配置, 推挽输出
 GPIO_Init(GPIOE, &GPIO_InitStructure);	  				 //推挽输出 ,IO口速度为50MHz
 GPIO_SetBits(GPIOE,GPIO_Pin_5); 						 //PE.5 输出高 
}
 

main.c文件

#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "beep.h"
 
 int main(void)
 {
 	vu8 key=0;	
	delay_init();	    	 //延时函数初始化	  
 	LED_Init();			     //LED端口初始化
	KEY_Init();          //初始化与按键连接的硬件接口
	BEEP_Init();         	//初始化蜂鸣器端口
	LED0=0;					//先点亮红灯
	while(1)
	{
 		key=KEY_Scan(0);	//得到键值
	   	if(key)
		{						   
			switch(key)
			{				 
				case WKUP_PRES:	//控制蜂鸣器
					BEEP=!BEEP;
					break;
				case KEY2_PRES:	//控制LED0翻转
					LED0=!LED0;
					break;
				case KEY1_PRES:	//控制LED1翻转	 
					LED1=!LED1;
					break;
				case KEY0_PRES:	//同时控制LED0,LED1翻转 
					LED0=!LED0;
					LED1=!LED1;
					break;
			}
		}else delay_ms(10); 
	}	 
}
  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值