GPIO输入与输出

一、GPIO输出

项目1:流水灯


1.使用RCC开启GPIO时钟

2.使用GPIO_Init初始化GPIO

3.使用输入或输出函数控制GPIO口

目录

一、GPIO输出

项目1:流水灯

项目内容:

项目2:蜂鸣器

项目内容:

二、GPIO输入

项目1:按键控制LED

项目内容:

项目2:光敏传感器控制蜂鸣器

项目内容:

总结:



项目内容:

将LED灯依次连接在A0-A7,使用keil5编写程序,其中延时函数为网上写好的函数。

main.c:

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
 int main(void) 
{
	//1、使用RCC开启GPIO时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	//2、使用GPIO_Init初始化GPIO
	GPIO_InitTypeDef LED;
	//3、使用输出或输入函数控制GPIO口
	LED.GPIO_Mode = GPIO_Mode_Out_PP;
	LED.GPIO_Pin = GPIO_Pin_All;
	LED.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&LED);
	//GPIO_ResetBits(GPIOA,GPIO_Pin_0);
	//GPIO_SetBits(GPIOA,GPIO_Pin_0);
	while(1)
	{
		GPIO_Write(GPIOA,~0x0001);
		Delay_ms(100);
		GPIO_Write(GPIOA,~0x0002);
		Delay_ms(100);	
		GPIO_Write(GPIOA,~0x0004);
		Delay_ms(100);
		GPIO_Write(GPIOA,~0x0008);
		Delay_ms(100);
		GPIO_Write(GPIOA,~0x0010);
		Delay_ms(100);
		GPIO_Write(GPIOA,~0x0020);
		Delay_ms(100);	
		GPIO_Write(GPIOA,~0x0040);
		Delay_ms(100);
		GPIO_Write(GPIOA,~0x0080);
		Delay_ms(100);
	}
}

Delay.c

#include "stm32f10x.h"
/**
  * @brief  微秒级延时
  * @param  xus 延时时长,范围:0~233015
  * @retval 无
  */
void Delay_us(uint32_t xus)
{
	SysTick->LOAD = 72 * xus;				//设置定时器重装值
	SysTick->VAL = 0x00;					//清空当前计数值
	SysTick->CTRL = 0x00000005;				//设置时钟源为HCLK,启动定时器
	while(!(SysTick->CTRL & 0x00010000));	//等待计数到0
	SysTick->CTRL = 0x00000004;				//关闭定时器
}

/**
  * @brief  毫秒级延时
  * @param  xms 延时时长,范围:0~4294967295
  * @retval 无
  */
void Delay_ms(uint32_t xms)
{
	while(xms--)
	{
		Delay_us(1000);
	}
}
 
/**
  * @brief  秒级延时
  * @param  xs 延时时长,范围:0~4294967295
  * @retval 无
  */
void Delay_s(uint32_t xs)
{
	while(xs--)
	{
		Delay_ms(1000);
	}
} 

Delay.h

#include "stm32f10x.h"                  // Device header

#ifndef __DELAY_H
#define __DELAY_H

void Delay_us(uint32_t us);
void Delay_ms(uint32_t ms);
void Delay_s(uint32_t s);

#endif

项目2:蜂鸣器

项目内容:

通过配置GPIOB_12输出低电平触发蜂鸣器,延时函数可用上方函数

main.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
 int main(void) 
{
	//1、使用RCC开启GPIO时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
	//2、使用GPIO_Init初始化GPIO
	GPIO_InitTypeDef FMQ;
	//3、使用输出或输入函数控制GPIO口
	FMQ.GPIO_Mode = GPIO_Mode_Out_PP;
	FMQ.GPIO_Pin = GPIO_Pin_12;
	FMQ.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB,&FMQ);
	while(1)
	{
		GPIO_ResetBits(GPIOB,GPIO_Pin_12);
		Delay_ms(500);
		GPIO_SetBits(GPIOB,GPIO_Pin_12);
		Delay_ms(500);
	}
}

二、GPIO输入

项目1:按键控制LED

项目内容:

通过使用函数GPIO_ReadInputDataBit和GPIO_ReadOutputDataBit读取GPIO口输入输出的状态,通过判断输入和输出的状态来开启/关闭对应LED灯.

main.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "LED.h"
#include "Key.h"
int keynum;
int main(void) 
{
	LED_Init();
	key_init();
	while(1)
	{
		keynum = key_getnum();
		if(keynum == 1)
		{
			LED1_Turn();
		}
		if(keynum == 2)
		{
			LED2_Turn();
		}
	}
}

LED.c

#include "stm32f10x.h" // Device header
#include "Delay.h"
void LED_Init(void)
{
	//RC开启GPIO时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	//初始化GPIO
	GPIO_InitTypeDef LED;
	LED.GPIO_Mode = GPIO_Mode_Out_OD;
	LED.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;
	LED.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&LED);
	
	GPIO_SetBits(GPIOA,GPIO_Pin_0 |GPIO_Pin_1);

}
void LED1_on(void)
{
	GPIO_ResetBits(GPIOA,GPIO_Pin_0);
	
}
void LED2_on(void)
{
	GPIO_ResetBits(GPIOA,GPIO_Pin_1);
	
}
void LED1_off(void)
{
	GPIO_SetBits(GPIOA,GPIO_Pin_0);
	
}
void LED2_off(void)
{
	GPIO_SetBits(GPIOA,GPIO_Pin_1);
}
void LED1_Turn(void)
{	
	if(GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_0)==0)
		{

			GPIO_SetBits(GPIOA,GPIO_Pin_0);
		}
	else
	{

		GPIO_ResetBits(GPIOA,GPIO_Pin_0);
	}
}
void LED2_Turn(void)
{
	if(GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_1)==0)
	{
		GPIO_SetBits(GPIOA,GPIO_Pin_1);
	}
	else
	{  
		GPIO_ResetBits(GPIOA,GPIO_Pin_1);
	}
}

key.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
void key_init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	GPIO_InitTypeDef KEY;
	KEY.GPIO_Mode = GPIO_Mode_IPU;
	KEY.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_6;
	KEY.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&KEY);
}

uint8_t key_getnum(void)
{
	uint8_t key_num = 0;
	if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_4) == 0)
	{
		//Delay_ms(20);
		while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_4) == 1);
		//Delay_ms(20);
		key_num = 1;
	}
	if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_6) == 0)
	{
		//Delay_ms(20);
		while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_6) == 1);
		//Delay_ms(20);
		key_num = 2;
	}
	
	return key_num;
}

项目2:光敏传感器控制蜂鸣器

上拉电阻或者下拉电阻如果电阻越小 上拉或者下拉力就会增强,反之电阻越大上拉或者下拉越小

项目内容:

通过判断光敏传感器的状态来实现蜂鸣器的开与关

main.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "Buzz.h"
#include "light.h"
int lightnum;
int main(void) 
{
	Buzz_Init();
	light_init();
	while(1)
	{
	lightnum = light_getnum();
	if(lightnum == 1)
	{
		Buzz_on();
	}
	else
		Buzz_off();
	}
}

buzz.c

#include "stm32f10x.h" // Device header
#include "Delay.h"
void Buzz_Init(void)
{
	//RC开启GPIO时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
	//初始化GPIO
	GPIO_InitTypeDef Buzz;
	Buzz.GPIO_Mode = GPIO_Mode_Out_OD;
	Buzz.GPIO_Pin = GPIO_Pin_12;
	Buzz.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB,&Buzz);
	
	GPIO_SetBits(GPIOB,GPIO_Pin_12);

}
void Buzz_on(void)
{
	GPIO_ResetBits(GPIOB,GPIO_Pin_12);
	
}
void Buzz_off(void)
{
	GPIO_SetBits(GPIOB,GPIO_Pin_12);
	
}

light.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
void light_init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
	GPIO_InitTypeDef light;
	light.GPIO_Mode = GPIO_Mode_IPU;
	light.GPIO_Pin = GPIO_Pin_15;
	light.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB,&light);
}

uint8_t light_getnum(void)
{
	uint8_t light_num = 0;
	if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_15) == 0)
	{
		//Delay_ms(20);
		while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_15) == 1);
		//Delay_ms(20);
		light_num = 1;
	}
	return light_num;
}

总结:

使用GPIO的时候,流程如下:1.RCC开启GPIO时钟  2.初始化GPIO   3.使用输入或输出函数来使GPIO输出高低电平、检测状态等....

  • 11
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Linux系统中,可以通过配置GPIO来进行输入输出控制。首先,在Linux内核中启用GPIO支持功能,通常可以在设备驱动中的GPIO Support选项中开启。开启后,系统启动后可以通过/sys/class/gpio/目录下的文件来操作GPIO。基本的操作包括: 1. 启用GPIO口:将对应的GPIO编号写入/sys/class/gpio/export文件,即可启用对应的GPIO口。启用成功后,会在/sys/class/gpio/目录下生成gpio编号的文件夹,之后可以通过该文件夹中的文件对特定的GPIO口进行操作。 2. 设置GPIO口方向:通过向/sys/class/gpio/gpioX/direction文件写入数据,可以设置GPIO口的方向。使用"in"表示输入,使用"out"表示输出。 3. 设置或读取GPIO口电平:通过/sys/class/gpio/gpioX/value文件可以设置或读取GPIO口的电平值。默认情况下,0表示低电平,1表示高电平。 4. 设置GPIO口外部中断触发方式:通过向/sys/class/gpio/gpioX/edge文件写入数据,可以设置GPIO口的外部中断触发方式。可以选择"none"表示无触发,"rising"表示上升沿触发,"falling"表示下降沿触发,"both"表示双边触发。请注意,是否支持特定的触发方式还取决于硬件和设置。 5. 取消使用GPIO口:将对应的GPIO编号写入/sys/class/gpio/unexport文件,即可取消使用对应的GPIO口。 此外,还可以使用/sys/class/gpio/gpioX/active_low文件来设置逻辑值翻转,默认为0,即低电平逻辑值为0,高电平逻辑值为1。将该文件的值设置为1时,将翻转逻辑值。 以上是在Linux系统中进行GPIO输入输出控制的基本操作方法。具体的实现代码可以在相关目录下创建main.c文件,并在其中进行相应的操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Zynq-7000、FMQL45T900的GPIO控制(六)-linux驱动层配置GPIO输入输出控制](https://download.csdn.net/download/li171049/87736646)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [嵌入式Linux应用开发笔记:GPIO基础输入输出](https://blog.csdn.net/Naisu_kun/article/details/130824735)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值