GPIO简介
1.介绍
GPIO它是通用输入输出端口的缩写,简单地说就是STM32可控引脚,STM32芯片的GPIO引脚与外部设备连接,实现与外部通信、控制和数据采集的功能。STM32芯片的GPIO每组有16个引脚,如型号为STM32F103VET6型芯片有GPIOA、GPIOB、GPIOC至GPIOE共5组GPIO,芯片一共1O0个引脚,其中GPIO占了很大一部分,一切GPIO引脚具有基本的输入输出功能。
最基本的输出功能是由STM32控制引脚输出高低电平,实现开关控制GPIO引脚接入到LED灯,可以控制LED灯亮灭,引脚接入继电器或三极管,可通过继电器或三极管控制外部大功率电路的通断。
最基本的输入功能是检测外部输入电平,如把手GPIO将引脚连接到按钮上,区分按钮是否按下电平。
1.1 保护二极管及上下拉电阻
**两根保护引脚的二次管可防止引脚外部电压输入过高或过低,**当引脚电压高于时VDD当引脚电压低于时,当引脚电压低于Vss下二极管导通,防止异常电压引入芯片导致芯片烧毁。虽然有这样的保护,但并不意味着STM32的引脚可以直接连接到大功率驱动器件,如直接驱动电机,强制驱动要么电机不转动,要么芯片烧坏,必须增加功率和隔离电路驱动。
1.2 P-MOS 管和N-MOS 管
GPIO引脚线通过两个保护二极管后,向上流向输入模式结构,向下流向输出模式结构。首先看输出模式部分,线路通过一个PMOS和N-MOS由管道组成的单元电路。
所谓的,根据这两个MOS命名管道的工作模式。**在结构中输入高电平时,反向后,上方P-MOS导通,下面的N-MOS关闭,对外输出高电平;在结构中输入低电平时,反向后,N-MOS管导通,P-MOS关闭,对外输出低电平。*****当引脚高低电平切换时,两根管道轮流导通,P负责灌电流,N管道负责拉电流,大大提高了其负载能力和开关速度。*推拉输出的低电平为0伏,高电平为3.3伏,具体参考图推拉等效电路,是推拉输出模式下的等效电路。
而在时,。,。
typedef enum {
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 // 复用推挽输出 } GPIOMode_TypeDef;
流程
1)使能IO调用口时钟:
RCC_ABP2PeriphColckCmd( )
- 初始化IO口模式,调用:
GPIO_Init( )
- 操作IO口,输出高低电平
GPIO_SetBits( )
GPIO_ResetBits( )
#为了增加代码的可移植性,硬件的相关宏定义是 bsp_LED.h 中 #ifndef _BSP_LED_H #define _BSP_LED_H #define LED1_GPIO_CLK RCC_APB2Periph_GPIOA #define LED1_GPIO_PORT GPIOA #define LED1_GPIO_PIN GPIO_Pin_8
#define LED2_GPIO_CLK RCC_APB2Periph_GPIOD
#define LED2_GPIO_PORT GPIOD
#define LED2_GPIO_PIN GPIO_Pin_2
#include "stm32f10x.h"
void LED_GPIO_Config(void);
#endif/*_BSP_LED_H*/
LED初始化配置
#include "./LED/bsp_led.h"
void LED_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitType_struct_A;
GPIO_InitTypeDef GPIO_InitType_struct_D;
/*第一步打开外设时钟*/
RCC_APB2PeriphClockCmd(LED1_GPIO_CLK,ENABLE);
RCC_APB2PeriphClockCmd(LED2_GPIO_CLK,ENABLE);
/*第二步配置外设初始化结构体*/
GPIO_InitType_struct_A.GPIO_Pin = LED1_GPIO_PIN;
GPIO_InitType_struct_A.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitType_struct_A.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitType_struct_D.GPIO_Pin = LED2_GPIO_PIN;
GPIO_InitType_struct_D.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitType_struct_D.GPIO_Speed = GPIO_Speed_10MHz;
/*第三步调用初始化函数,把配置好的结构体成员写到寄存器中*/
GPIO_Init(LED1_GPIO_PORT,&GPIO_InitType_struct_A);
GPIO_Init(LED2_GPIO_PORT,&GPIO_InitType_struct_D);
主程序
#include "stm32f10x.h"
#include "./LED/bsp_led.h"
void delay(uint32_t count)
{
for(;count!=0;count--);
}
int main(void)
{
LED_GPIO_Config( );
while(1)
{
GPIO_SetBits(LED2_GPIO_PORT,LED2_GPIO_PIN);
GPIO_ResetBits(LED1_GPIO_PORT,LED1_GPIO_PIN);
delay(0xfffff);
GPIO_SetBits(LED1_GPIO_PORT,LED1_GPIO_PIN);
GPIO_ResetBits(GPIOD,LED2_GPIO_PIN);
delay(0xfffff);
}
}