[STM32学习笔记(八)]STM32_GPIO使用总结

1 GPIO概述

在这里插入图片描述

1.1 GPIO的8种模式

通过编程可以选择实现GPIO的:

浮空输入带上拉输入带下拉输入模拟输入
开漏输出——(此模式可实现hotpower说的真双向IO)推挽输出复用功能的推挽输出复用功能的开漏输出

1.2 专门的寄存器(GPIOx_BSRR和GPIOx_BRR)

寄存器(GPIOx_BSRR和GPIOx_BRR)实现对GPIO口的原子操作,即回避了设置或清除I/O端口时的“读-修改-写”操作,使得设置或清除I/O端口的操作不会被中断处理打断而造成误动作。

1.3 GPIO的特点

每个GPIO口都可以作为外部中断的输入,便于系统灵活设计。

1.4 GPIO的输出速度

I/O口的输出模式下,有3种输出速度可选(2MHz、10MHz和50MHz),这有利于噪声控制
这个速度是指I/O口驱动电路的响应速度而不是输出信号的速度,输出信号的速度与程序有关(芯片内部在I/O口的输出部分安排了多个响应速度不同的输出驱动电路,用户可以根据自己的需要选择合适的驱动电路)。
通过选择速度来选择不同的输出驱动模块,达到最佳的噪声控制和降低功耗的目的。高频的驱动电路,噪声也高,当不需要高的输出频率时,请选用低频驱动电路,这样非常有利于提高系统的EMI性能。当然如果要输出较高频率的信号,但却选用了较低频率的驱动模块,很可能会得到失真的输出信号。

1.4.1 各种接口措施

1、串口

假如最大波特率只需115.2k,那么用2M的GPIO的引脚速度就够了,既省电也噪声小。

2、IIC

假如使用400k波特率,若想把余量留大些,那么用2M的GPIO的引脚速度或许不够,这时可以选用10M的GPIO引脚速度。

3、SPI

假如使用18M或9M波特率,用10M的GPIO的引脚速度显然不够了,需要选用50M的GPIO的引脚速度。

1.4.2 输出速度无意义

GPIO口设为输入时,输出驱动电路与端口是断开,所以输出速度配置无意义。

1.4.3 复位

在复位期间和刚复位后,复用功能未开启,I/O端口被配置成浮空输入模式。

1.4.4 外部中断

所有端口都有外部中断能力。为了使用外部中断线,端口必须配置成输入模式。

1.4.5 上锁功能

GPIO口的配置具有上锁功能,当配置好GPIO口后,可以通过程序锁住配置组合,直到下次芯片复位才能解锁。此功能非常有利于在程序跑飞的情况下保护系统中其他的设备,不会因为某些I/O口的配置被改变而损坏——如一个输入口变成输出口并输出电流。

1.5 所有I/O口兼容CMOS和TTL,多数I/O口兼容5V电平

1.6 大电流驱动能力

GPIO口在高低电平分别为0.4V和VDD-0.4V时,可以提供或吸收8mA电流;如果把输入输出电平分别放宽到1.3V和VDD-1.3V时,可以提供或吸收20mA电流。

1.7 独立唤醒功能

具有独立的唤醒I/O口。

1.8 很多I/O口的复用功能可以重新映射

2 STM32 GPIO的简单使用

2.1 I/O初始化配置

GPIO_Init()
     {
        GPIO_InitTypeDef GPIO_InitStructure; 				  //定义GPIO初始化结构体
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB |RCC_APB2Periph_GPIOC, ENABLE); //使能GPIOB ,GPIOC 时钟
		GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 |GPIO_Pin_6;		//设置对应引脚
		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;      //设置推挽输出
		GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;     //工作速度50MHz
		GPIO_Init(GPIOB, &GPIO_InitStructure);			      //PB5 PB6设置生效
	   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;		      //设置对应引脚
       GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;     //浮空输入
       GPIO_Init(GPIOC, &GPIO_InitStructure);			      //PC8设置生效
	 }	

2.2 I/O使用

2.2.1 设置

	GPIO_SetBits(GPIOB, GPIO_Pin_5);    //PB5置1
	GPIO_ResetBits(GPIOB, GPIO_Pin_6);   //PB6置0

2.2.2 输入引脚读取

GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_8)//读取PC8 返回0 1

2.3 I/O模式

GPIO_Mode_AIN = 0x0,  //模拟输入
GPIO_Mode_IN_FLOATING = 0x04,  //浮空输入
GPIO_Mode_IPD = 0x28,   //下拉输入
GPIO_Mode_IPU = 0x48,   //上拉输入
GPIO_Mode_Out_OD = 0x14,//开漏输出 
GPIO_Mode_Out_PP = 0x10, //推挽输出
GPIO_Mode_AF_OD = 0x1C, //复用开漏输出
GPIO_Mode_AF_PP = 0x18  //复用推挽输出

3 GPIO使用步骤

3.1 使能GPIO对应时钟

例如://使能GPIOA、GPIOB、GPIOC对应的外设时钟

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_GPIOB |
RCC_APB2Periph_GPIOC , ENABLE);

3.2 声明一个GPIO_InitStructure结构体

GPIO_InitTypeDef GPIO_InitStructure;

3.3 选择待设置的GPIO管脚

例如://选择待设置的GPIO第7、8、9管脚位 ,中间加“|”符号

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 |GPIO_Pin_8 | GPIO_Pin_9;

3.4 设置选中GPIO管脚的速率

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;//最高速率2MHz

3.5 设置选中GPIO管脚的模式

例如://设置选中GPIO管脚的模式为开漏输出模式

GPIO_InitStructure.GPIO_Mode= GPIO_Mode_Out_OD;

3.6 根据GPIO_InitStructure中指定的参数初始化外设GPIOX

GPIO_Init(GPIOC,&GPIO_InitStructure);

3.7 其他应用

例: 将端口GPIOA的第10、15脚置1(高电平)

GPIO_SetBits(GPIOA,GPIO_Pin_10| GPIO_Pin_15);

例:将端口GPIOA的第10、15脚置0(低电平)

GPIO_ResetBits(GPIOA,GPIO_Pin_10| GPIO_Pin_15);

4 GPIO操作说明

4.1 库函数: 函数GPIO_DeInit

功能描述:将外设GPIOx寄存器重设为缺省值

GPIO_DeInit(GPIOA);

4.2 函数GPIO_AFIODeInit

功能描述:将复用功能(重映射事件控制和EXTI设置)重设为缺省值
例:

GPIO_AFIODeInit();

4.3 函数GPIO_Init

功能描述:根据GPIO_InitStruct中指定的参数初始化外设GPIOx寄存器
例:

GPIO_InitTypeDefGPIO_InitStructure; 
GPIO_InitStructure.GPIO_Pin= GPIO_Pin_All;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_10MHz; 
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;  
GPIO_Init(GPIOA,&GPIO_InitStructure);

4.3.1 GPIO_InitTypeDefstructure

GPIO_InitTypeDef定义于文件“stm32f10x_gpio.h”:

typedef struct  {
	u16GPIO_Pin;
	GPIOSpeed_TypeDefGPIO_Speed;  
	GPIOMode_TypeDefGPIO_Mode;
}GPIO_InitTypeDef;

4.3.2 GPIO_Pin

该参数选择待设置的GPIO管脚,使用操作符“|”可以一次选中多个管脚。可以使用下表中的任意组合。

GPIO_Pin_None:     无管脚被选中  
GPIO_Pin_x:          选中管脚x(0--15)
GPIO_Pin_All:        选中全部管脚

4.3.3 GPIO_Speed

用以设置选中管脚的速率。

GPIO_Speed_10MHz: 最高输出速率10MHz 
GPIO_Speed_2MHz:  最高输出速率2MHz
GPIO_Speed_50MHz: 最高输出速率50MHz

4.3.4 GPIO_Mode

用以设置选中管脚的工作状态。

GPIO_Mode_AIN:        模拟输入
GPIO_Mode_IN_FLOATING:    浮空输入  
GPIO_Mode_IPD:         下拉输入
GPIO_Mode_IPU:           上 拉输入
GPIO_Mode_Out_OD:           开漏输出
GPIO_Mode_Out_PP:            推挽输出 
GPIO_Mode_AF_OD:            复用开漏输出  
GPIO_Mode_AF_PP:            复用推挽输出

4.4 函数GPIO_StructInit

功能描述:把GPIO_InitStruct中的每一个参数按缺省值填入 例:

GPIO_InitTypeDefGPIO_InitStructure;  
GPIO_StructInit(&GPIO_InitStructure); 
GPIO_InitStruct:
GPIO_Pin:GPIO_Pin_All  
GPIO_Speed:GPIO_Speed_2MHz 
GPIO_Mode:GPIO_Mode_IN_FLOATING

4.5 函数GPIO_ReadInputDataBit

功能描述:读取指定端口管脚的输入
例:

u8ReadValue;
ReadValue= GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_7);

4.6 函数GPIO_ReadInputData

功能描述:读取指定的GPIO端口输入
例:

u16ReadValue;
ReadValue= GPIO_ReadInputData(GPIOC);

4.7 函数GPIO_ReadOutputDataBit

功能描述:读取指定端口管脚的输出
例:

u8ReadValue;
ReadValue= GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_7);

4.8 函数GPIO_ReadOutputData

功能描述:读取指定的GPIO端口输出
例:

u16ReadValue;
ReadValue= GPIO_ReadOutputData(GPIOC);

4.9 函数GPIO_SetBits

功能描述:置位指定的数据端口位
例: 将端口GPIOA的第10、15脚置1(高电平)

GPIO_SetBits(GPIOA,GPIO_Pin_10 | GPIO_Pin_15);

4.10 函数GPIO_ResetBits

功能描述:清除指定的数据端口位
例:将端口GPIOA的第10、15脚置0(低电平)

GPIO_ResetBits(GPIOA,GPIO_Pin_10 | GPIO_Pin_15);

4.11 函数GPIO_WriteBit

功能描述:设置或者清除指定的数据端口位
例:

GPIO_WriteBit(GPIOA,GPIO_Pin_15, Bit_SET);

4.12 函数GPIO_Write

功能描述:向指定GPIO数据端口写入数据
例:

GPIO_Write(GPIOA,0x1101);

4.13 函数GPIO_PinLockConfig

功能描述:锁定GPIO管脚设置寄存器
例:

GPIO_PinLockConfig(GPIOA,GPIO_Pin_0|GPIO_Pin_1);

4.14 函数GPIO_EventOutputConfig

功能描述:选择GPIO管脚用作事件输出 例:

GPIO_EventOutputConfig(GPIO_PortSourceGPIOE,GPIO_PinSource5);
GPIO_PortSource
GPIO_PortSource用以选择用作事件输出的GPIO端口。

4.15 函数GPIO_EventOutputCmd

功能描述:使能或者失能事件输出 例:

GPIO_EventOutputConfig(GPIO_PortSourceGPIOC,GPIO_PinSource6);
GPIO_EventOutputCmd(ENABLE);

4.16 函数GPIO_PinRemapConfig

功能描述:改变指定管脚的映射例:

GPIO_PinRemapConfig(GPIO_Remap_I2C1,ENABLE);
  • 10
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值