简介:
STM32是一系列基于ARM Cortex-M内核的32位微控制器。该系列微控制器广泛应用于计算机、通讯、工业自动化、消费电子、汽车电子、医疗仪器及家庭电器等领域。该系列控制器具有高性能、低功耗、智能化等特点。其中,GPIO就是STM32控制器中的一种重要的通用输入输出口。
GPIO全称为“General Purpose Input and Output”,即通用输入输出口。它是STM32控制器中的一种数字输入输出接口,具有广泛的应用。GPIO通常是微控制器与外围电路之间的主要通信接口。它可以通过控制逻辑电平来实现输入、输出、控制等功能。在STM32控制器中,GPIO口通常是通过引脚配置和寄存器编程进行控制的。
STM32控制器中的GPIO口具有以下特征:
- 可编程性强:GPIO口的功能由配置它们的寄存器所决定。可以通过编程改变其工作模式(输入、输出、模拟等),其共有八种输入输出模式,分别为以下八种:
输出模式下可控制端口输出高低电平,用以驱动外部模块,如LED、蜂鸣器、模拟通信协议输出时序等。只要是可以使用高低电平对其进行控制的,都可以使用GPIO引脚完成,如果控制功率较大的设别,如电机等,则需要加入驱动电路。
输入模式下可读取端口的高低电平或电压,用于读取按键输入、ADC电压采集、模拟通信协议接收数据等。
- 电压适应性强:STM32控制器的GPIO输入和输出口具有较宽的电压适应范围(0~3.3V),可以适应3.3V或5V的外围电路。
- 可配置性高:GPIO口可以进行复用,多个GPIO口可以通过引脚复用功能共享同一个管脚,从而实现更多的接口和功能。
- 高速性能:GPIO口的传输速度可以达到几百MHz,可以满足最高性能要求。
结构:
首先,我们对这张图进行分析,APB2为总线(总线以后在讲,这里只需要知道GPIO由总线控制),控制GPIOA和GPIOB以及其他部分,如何区分GPIOA和GPIOB及其他部分,这里可以看我们的数据手册,如下面的一张图,:
可以看到上面有PA0,PB1,PC1等等,这里的PA0引脚就归属于 GPIOA,PB1引脚就归属于 GPIOB。每个GPIO外设,总共有16个引脚,编号为0到15,当GPIO的第0号引脚,一般将其成为PA0,接着就是PA1。。。。。等等
在STM32控制器中,GPIO模块内包含寄存器和驱动器,分别是:
-
寄存器:GPIO模块内部有多个寄存器,用于控制GPIO口的工作模式、电平状态、中断控制等。常见的GPIO寄存器包括GPIOx_MODER、GPIOx_ODR、GPIOx_IDR、GPIOx_BSRR等。这些寄存器可以通过编程来进行配置和控制。
-
驱动器:GPIO模块内部的驱动器用于控制GPIO口的电平状态。在STM32控制器中,GPIO口可以输出高电平、低电平或者高阻态,驱动器可以根据寄存器的配置来控制GPIO口的电平状态。常见的GPIO驱动器包括CMOS、TTL等。
STM32是32位的单片机,故STM32内部的寄存器都是32位的,由于端口只有16位,所以寄存器只有低16位对应的有端口,高16位无用。
寄存器和驱动器是GPIO模块内部的两个重要组成部分,它们共同实现了GPIO口的各种功能。通过对GPIO寄存器的配置,可以实现GPIO口的输入、输出、中断控制等操作;通过GPIO驱动器的控制,可以实现GPIO口的电平状态控制。
代码介绍:
1、对ST单片机的整个IO进行复位操作
void GPIO_DeInit(GPIO_TypeDef* GPIOx);
2、根据 GPIO_InitStruct 中指定的参数初始化外设 GPIOx 寄存器
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);
3、把 GPIO_InitStruct 中的每一个参数按缺省值填
void GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct);
4、读取指定端口管脚的输入
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
5、读取指定端口管脚的输出
uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
6、拉高引脚输出电平
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
7、拉低引脚输出电平
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
8、对 IO进行写操作,仅可以自定义设置写0或写1,都0或都1
void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);
9、对整个IO端口进行写操作,0xFFFF 对应 0-15 PIN全部置为1;0x0000全部置为0
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);
10、当引脚具有复用功能时,可进行设置
void GPIO_PinLockConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
演示代码效果:
1、LED.C
#include "stm32f10x.h" // Device header
#include "Delay.h"
void LED_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE); //开启APB2外设时钟
GPIO_DeInit(GPIOC); //对整个GPIOC引脚进行复位操作
GPIO_InitTypeDef GPIO_InitStructure; //声明结构体GPIO_InitStructure
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC,&GPIO_InitStructure);
}
void LED(void)
{
GPIO_WriteBit(GPIOB,GPIO_Pin_7,(BitAction)0); //BitAction为强制类型转换符
Delay_ms(500);
GPIO_WriteBit(GPIOB,GPIO_Pin_7,Bit_SET);
Delay_ms(500);
}
void PC13_ON(void)
{
GPIO_ResetBits(GPIOC,GPIO_Pin_13); //低电平点亮PC13LED灯
Delay_ms(500);
}
void PC13_OFF(void)
{
GPIO_SetBits(GPIOC,GPIO_Pin_13); //高电平点亮PC13LED灯
Delay_ms(500);
}
uint8_t LED_GetNum(void)
{
return GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_13 ); //读取PC13号端口的输入值
}
2、LED.h
#ifndef __LED_H
#define __LED_H
void LED_Init(void);
void PC13_ON(void);
void PC13_OFF(void);
uint8_t LED_GetNum(void);
void LED(void);
#endif
3、main.c
#include "stm32f10x.h" // Device header
#include "LED.h"
#include "Delay.h"
uint8_t LEDNum;
int main(void)
{
LED_Init();
while(1)
{
/*低电平点亮PC13的LED灯。
初始时,引脚为任意电平,当引脚为低电平时
熄灭LED灯,熄灭LED时的电平为高电平,所以引脚也被设置为高电平了
当引脚为高电平时,点亮LED灯,点亮LED时的电平为低电平,所以这样就可以循环往复。
*/
if(LED_GetNum() == 1) //如果引脚为高电平,则点亮LED灯,输入值和输出值在这里对于程序没有影响,只需要得到引脚的电平值。
{
PC13_ON();
Delay_ms(500);
GPIO_WriteBit(GPIOC,GPIO_Pin_13,(BitAction)0);
}
else
{
PC13_OFF();
Delay_ms(2000);
GPIO_WriteBit(GPIOC,GPIO_Pin_13,(BitAction)1);
}
}
}
//测试结果,LED灯交替闪烁
在STM32控制器中,GPIO口的应用非常广泛。比如,可以使用GPIO口来控制LED灯灯光的亮灭、控制继电器的闭合、读取传感器的数据等。同时,GPIO口也可以广泛应用于通信领域,如SPI、I2C、USART等串行通信控制等。其中,GPIO口的引脚复用功能可以实现多重功能,如CAN总线、PWM输出等特殊功能。
综上所述,GPIO是STM32控制器中的一个重要设备,这种通用输入输出口具有可编程性强、电压适应性好、可配置性高、高速性能等特点,在系统设计中具有广泛的应用。