STM32从标准库学起 01GPIO

嵌入式开发 专栏收录该内容
4 篇文章 0 订阅

GPIO

IO接口电路定义:

两个电路的连接部分,特指CPU与外部设备之间的通道和控制电路。

IO接口电路的作用
  • 为数据提供锁存和缓冲功能
  • 实现信号变换功能
  • 提供外设控制、监测和管理功能
数据传送方式
  • 无条件传送
  • 查询式传送
  • 中断传送
  • DMA传送
GPIO的端口电路
可用作输入输出。
GPIO八种模式
  • 输入浮空:用于不确定高低电平的输入
  • 输入上拉:用于默认为上拉至高电平的输入
  • 输入下拉:用于默认为下拉至低电平的输入
  • 模拟输入:用于模拟量的输入
  • 开漏输出:用于实现电平转换和线与功能
  • 推挽输出:用于较大功率驱动的输出
  • 推挽复用输出:复用情况下的推挽输出
  • 开漏复用输出:复用功能下的开漏输出
    这篇文章讲模式配置讲得很不错
    https://blog.csdn.net/baidu_37366055/article/details/80060962

stm32通过库函数间接操作寄存器控制GPIO过程:
使能IO口时钟
配置gpio
基本配置,例:

 GPIO_InitTypeDef  GPIO_InitStructure;
 	
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOD, ENABLE);	 //使能IO口时钟
	
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;				 //配置引脚
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 //推挽输出
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		 //IO口速度50MHz
 GPIO_Init(GPIOA, &GPIO_InitStructure);					 //初始化已设置GPIOA8
 GPIO_SetBits(GPIOA,GPIO_Pin_8);						 //PA.8 拉高

 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;	    		 //PD.2 ³ö
 GPIO_Init(GPIOD, &GPIO_InitStructure);	  				 //初始化GPIOD2模式与速度与GPIOA2一致
 GPIO_SetBits(GPIOD,GPIO_Pin_2); 						 //PD.2 拉高

做一个关于GPIO的小例程,用到了1*4的键盘,借鉴原子哥例程使用到了按键扫描的思想。
将对应按键的四个IO口分别连接至GPIOB5、6、7、8 第五根线接地
头文件如下:

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



#define KEY1  GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_5)//读取按键1
#define KEY2  GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_6)//读取按键2
#define KEY3   GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_7)//读取按键3 
#define KEY4   GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_8)//读取按键3 


#define KEY1_PRES	1		//KEY1 
#define KEY2_PRES	2		//KEY2
#define KEY3_PRES	3		//KEY2
#define KEY4_PRES	4		//KEY0  


void KEYs14_Init(void);//IO初始化
u8 KEYs14_Scan(u8 mode);  	//按键扫描函数					    
#endif

.c文件如下

#include "keys14.h"
#include "delay.h"
/*******************************
作者:xinyulee
1*4键盘
2019年8月2日20:40:48
********************************/
void KEYs14_Init(void)
{

	GPIO_InitTypeDef GPIO_InitStructure;

 	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//使能PORTA,PORTC时钟

	
	GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8;//PB1\2\3\4
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置成上拉输入
 	GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOA15
}

/**********************
函数功能:按键扫描
mode:1 可连续按
0:不可连续按
***********************/
u8 KEYs14_Scan(u8 mode)
{	 
	static u8 key_up=1;//按键按松开标志
	if(mode)key_up=1;  //支持连按		  
	if(key_up&&(KEY1==0||KEY2==0||KEY3==0||KEY4==0))
	{
		delay_ms(10);//去抖动 
		key_up=0;
		if(KEY1==0)return KEY1_PRES;
		else if(KEY2==0)return KEY2_PRES;
		else if(KEY3==0)return KEY3_PRES; 
		else if(KEY4==0)return KEY4_PRES; 
		
	}else if(KEY1==1&&KEY2==1&&KEY3==1&&KEY4==1 )key_up=1; 	     
	return 0;// 无按键按下
}
 int main(void)
 {	
	u8 t=0;	  
	delay_init();	    	 //延时函数初始化	  
	KEYs14_Init();          	//初始化与按键连接的硬件接口

	while(1)
	{
		t=KEYs14_Scan(0);		//得到键值
		switch(t)
		{				 
			case KEY1_PRES:
				//case语句中自行定义相关操作即可
				break;
			case KEY2_PRES:
				
				break;
			case  KEY3_PRES:				
				
				break;
			default:
				delay_ms(10);	
		} 
	}		 
}

GPIO的端口复用与重映射
关于这部份的初始化代码在后面章节再贴出来仔细讲解

端口复用:

一个GPIO如果可以复用为内置外设的功能引脚,那么这个GPIO作为内置外设使用时,称为复用。
例:PA9 PA10作为串口使用
端口复用配置过程:
GPIO端口时钟使能
复用外设时钟使能
端口模式配置:查表

重映射:

内置外设通过重映射寄存器的方式,将外设的默认引脚映射到其它端口。
部分重映射与完全重映射

当配置复用功能重映射和配置外部中断重映射时需要开启AFIO辅助功能时钟。

  • 0
    点赞
  • 0
    评论
  • 1
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值