stm32f输入输出(GPIO)

1.gpio概述

gpio用于感知外部信号(输入)和控制外部设备(输出)。

gpio可以控制led灯,蜂鸣器。可直接由io口输出高低电平控制灯的亮灭。

也可用于usart,以及spi等外设,可以设置成复用功能。

2.gpio的八种工作模式

        gpio有推挽输出,开漏输出,复用推挽,复用开漏这是输出模式

        上拉输入,下拉输入,模拟输入,浮空输入。

2.1 gpio输出的四种模式

2.1.1 推挽输出

 图中红框中当我们设置的寄存器输出1时,经过输出控制变为0,P-MOS导通,io引脚输出1

当我们设置的寄存器输出0时,经过输出控制变为1,N-MOS导通,io引脚输出0

2.1.2 开漏输出

当使用开漏输出时,P-MOS不起作用,N-MOS起作用,当我们设置寄存器输出1时,引脚若想输出高电平必须外接上拉电阻,如果不接上拉电阻,此时引脚就是悬空态。

当控制寄存器输出0时,那么引脚的电平就是低电平

2.1.3  复用推挽

当我们usart或者iic等外设用到了gpio引脚,那么引脚要设置成复用功能模式就有复用推挽 

2.1.4  复用开漏

复用开漏也是和复用推挽一样的道理,就是输出模式不同,但都是复用功能模式 

2.2  输入模式的四种模式

2.2.1 上拉输入

 上拉输入,如图所示,设置上拉开关闭合,当没有外部信号的时候,默认引脚为高电平

2.2.2  下拉输入

当下拉开关控制闭合,输入引脚默认为低电平

2.2.3  浮空输入

 当设置为浮空输入,引脚没有信号是,是悬空态,输入什么电平就是什么电平

2.2.4 模拟输入

模拟输入,就是采集模拟信号时要设置成的模式 

3. 输出模式设置速度

有高速,中速,低速,一般设置成低速,只有用到复用功能,比如usart就需要设置成高速了。

4. gpio调用标准库写代码

4.1灯的闪烁

 

可知pa1输出低电平 灯就点亮 

led.c 

#include "led.h"
#include "stm32f10x.h"
//初始化led灯的函数
void LED_Init()
{
	GPIO_InitTypeDef init;
	//初始化时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	//初始化led引脚GPIOA
	init.GPIO_Mode = GPIO_Mode_Out_PP;
	init.GPIO_Speed = GPIO_Speed_2MHz;
	init.GPIO_Pin = GPIO_Pin_1;
	
  GPIO_Init(GPIOA, &init);
	
}

main.c

int  main()
{


	 
	
		 
	 LED_Init();
   while(1)
	 {

			GPIO_SetBits(GPIOA, GPIO_Pin_1);
			delay(500);
			GPIO_ResetBits(GPIOA, GPIO_Pin_1);
		  delay(500);
		 
	 }
		 
   
}

4.2 蜂鸣器

 蜂鸣器是低电平触发,我用杜邦线连接到开发板上,配置的是pa3引脚,和点亮led是一样的原理

beap.c

#include "beap.h"
#include "stm32f10x.h"
void beap_Init()
{
	
		GPIO_InitTypeDef init;
		//时钟使能
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
		
		//GPIO初始化
		
		init.GPIO_Mode = GPIO_Mode_Out_PP;
		init.GPIO_Speed = GPIO_Speed_2MHz;
		init.GPIO_Pin = GPIO_Pin_3;
		GPIO_Init( GPIOA, &init);
}

 这里要注意这个时钟使能要写对,我就是写的复位使能所以写错了,改回来蜂鸣器才响。

main.c 

int  main()
{


	 
	
		 
	   //LED_Init();
	   beap_Init();
       while(1)
	    {

			
			    GPIO_ResetBits(GPIOA, GPIO_Pin_3);
		  
		 
	    }
		 
   
}

 4.3 按键控制灯的亮灭

 

 让sw2控制灯亮,sw3控制灯灭

 

 按键会抖动,所以用的时候要延时消抖。

为了保证采集数据的准确性,还要用松手检测。

key.c

#include "key.h"
#include "stm32f10x.h"
void Key_Init()
{
	GPIO_InitTypeDef k1init;
	GPIO_InitTypeDef k2init;
	//时钟初始化
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
    //gpio初始化
	k1init.GPIO_Mode = GPIO_Mode_IPU;
	k1init.GPIO_Pin = GPIO_Pin_0;
	k2init.GPIO_Mode = GPIO_Mode_IPU;
	k2init.GPIO_Pin = GPIO_Pin_13;
	GPIO_Init( GPIOA, &k1init);
	GPIO_Init( GPIOC, &k2init);
}
	

 main.c

int  main()
{


	 
	
		 
	 LED_Init();//灯的初始化
	 Key_Init();//按键初始化
     while(1)
	 {

			
			if(!GPIO_ReadInputDataBit( GPIOA, GPIO_Pin_0))
		  { 
					
					delay(5);//延时消抖
					if(!GPIO_ReadInputDataBit( GPIOA, GPIO_Pin_0))
					{ 
							
							while(!GPIO_ReadInputDataBit( GPIOA, GPIO_Pin_0));//松手检测
							GPIO_ResetBits(GPIOA, GPIO_Pin_1);
					
					}		
					
			}
			if(!GPIO_ReadInputDataBit( GPIOC, GPIO_Pin_13))
		  { 
					
					delay(5);//延时消抖
					if(!GPIO_ReadInputDataBit( GPIOC, GPIO_Pin_13))
					{ 
							
							while(!GPIO_ReadInputDataBit( GPIOC, GPIO_Pin_13));//松手检测
							GPIO_SetBits(GPIOA, GPIO_Pin_1);
					
					}		
					
			}					
		  
		 
	 }
		 
   
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值