快速教你使用GPIO口


声明:本文仅用于学习之用,主要面向初学者,若有不适用或有不对的地方欢迎留下评论,本文使用STM32F407ZET为例,以Keil5编辑程序。

1、以使用单片机本身的LED为例讲解(概念)

在这里插入图片描述
这是单片机里面的一个LED模块,其中的核心方法便是通过他们对应的GPIO口去控制。

通俗来说就好像一个水池对应一条水龙头,水池便是LED灯,水龙头便是对应的引脚,芯片便是房子。只是输出的不是水,而是高低电平罢了。那么怎么知道哪个水池对应哪条水龙头呢?

关键就在这,仔细看上图,LED灯很明显各自只有一条出口即端口,VDD3V3是电源,所以这个是发电的,不往回流(废话)。那么,根据端口上面的号码即网络标号,去查找芯片引脚对应的网络标号,只要有,那么这两个端口是相连的,如下图。

在这里插入图片描述
上图可以看到LED0网络标号连在了PF9这个GPIO口,仔细看上图我画的红线,每条引脚基本最靠中间部位都会有P+字母+数字的标号,这是GPIO口的标号。

比如PF9这个意思是GPIOF的Pin_9端口,通俗来讲可以拿树来作为例子,GPIOF是树的一个结点,而Pin_9是它的其中一个子节点(不是二叉树),明白上述的概念那么很容易理解下方代码了。

2、模块与单片机相连的代码(实际)

本单片机的LED灯以低电平亮灯(Bit_RESET),高电平熄灯(Bit_SET),按键同样如此,低电平按下,高电平放开。

// 头文件我就不加了,因为你们使用的单片机的不同头文件不定相同
static GPIO_InitTypeDef GPIO_InitStructure;

int main(void)
{
	//打开端口硬件时钟,就是对当前硬件供电
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE,ENABLE);
	
	//打开端口硬件时钟,就是对当前硬件供电
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF,ENABLE);
	
	
	//配置端口指定引脚的功能
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2|GPIO_Pin_3//端口的第2 3根引脚
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;//输入模式
	GPIO_InitStructure.GPIO_Speed=GPIO_High_Speed;//最高速度
	GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;//不使能内部上下拉电阻,当用到矩阵键盘的时候,需要使能内部上拉电阻
	GPIO_Init(GPIOE,&GPIO_InitStructure);		

	
	//配置端口指定引脚的功能
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9|GPIO_Pin_10;//端口的第9 10根引脚
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//输出模式
	GPIO_InitStructure.GPIO_OType= GPIO_OType_PP;//推挽输出模式,使能内部的P-mos&N-mos管
	GPIO_InitStructure.GPIO_Speed=GPIO_High_Speed;//最高速度
	GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;//不使能内部上下拉电阻
	GPIO_Init(GPIOF,&GPIO_InitStructure);
	
	//控制引脚,输出高电平
	GPIO_WriteBit(GPIOF,GPIO_Pin_9|GPIO_Pin_10,Bit_SET);
	

	while(1)
	{
		if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_2) == Bit_RESET)//按键1按下
		{
			GPIO_WriteBit(GPIOF,GPIO_Pin_9,Bit_RESET);
		
		}
		else
		{
			GPIO_WriteBit(GPIOF,GPIO_Pin_9,Bit_SET);		
		}
		
		if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3) == Bit_RESET)//按键2按下
		{
			GPIO_WriteBit(GPIOF,GPIO_Pin_10,Bit_RESET);
		
		}
		else
		{
			GPIO_WriteBit(GPIOF,GPIO_Pin_10,Bit_SET);		
		}					
		
	}
}

关于上述代码,我大概讲解一下吧,每个GPIO口刚开始时都是默认关闭断电的,只有为其供电才能使用该GPIO口,但是切莫认为这个只能打开GPIO口,比如还有TIM,SPI等。

	//打开端口硬件时钟,就是对当前硬件供电
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF,ENABLE);

PE2,PE3是我这块单片机的s2,s3按键对应的GPIO口,具体的GPIO口你们要仔细浏览你们自己单片机型号的原理图。

至于下面这些设置就是另外的相比本章这种肤浅知识来说较为深层知识了,有兴趣可以上网浏览学习一下。

	GPIO_InitStructure.GPIO_OType= GPIO_OType_PP;//推挽输出模式,使能内部的P-mos&N-mos管
	GPIO_InitStructure.GPIO_Speed=GPIO_High_Speed;//最高速度
	GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;//不使能内部上下拉电阻

3、外接模块的接入方法

前面的都是该章节所必要的铺垫和必要知识,理解了前面的才好懂这一章节。

很多人可能看到下面这样或类似的代码,而这其实很简单,便是GPIOC的Pin_11输出高电平,GPIOB的Pin_6输入低电平等,这涉及到“位带操作”,暂且不谈,得益于此,我们理解和使用变得很方便。

		PCout(11)= 1; 
		PBin(6) = 0; 
		PEin(5) = 1; 
		PEout(6) = 1;
		delay_ms(2);

当需要接入外接模块时,你所需要做的便是从原理图中找到单片机对应的插针或插入的口。
在这里插入图片描述
上图这是我单片机上的其中一份可使用的插针,而原理图如下。要注意的是基本都会有如“Camera”可以看到核对在哪,找到后更要注意周围的标记比如“1”,“2”调转了,所以原理图上的信息也应该调转来看。
在这里插入图片描述
找到了,然后是不是眼花缭乱?看着这些网络标号再对准芯片引脚对入的那些除了PF9还有如TIM14_CH1这样标号不知道干嘛的,那我可以告诉你十分清晰无比明确的答案:那就是本章节不讲。因为涉及太多东西了,有兴趣的朋友可以去慢慢了解

但是你不需要里面的功能情况下,你完全可以无视那些定时器、ADC、SPI等的标号,如果你只需要这个端口输出输入高低电平这样简单的功能的话,你可以随便找一些(电源和GND不能乱插,会烧坏的)闲置的端口使用(插针或插入等),利用杜邦线把模块和单片机相连即可。

顺便一提,如果要用到IIC,SPI这些功能的建议在原理图中找到对出的端口的网络标号,然后再查找到那个端口。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

溪渣渣_梁世华

打赏?我甚至没有任何收费的章节

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值