1. 模拟输入
输入信号不经施密特触发器直接接入,而非数字量,其他输入方式输入数字量。
2. 浮空输入
输入信号通过施密特触发器连接到输入数据存储器。。因为既有浮空输入,可以认为输入端口阻抗无限大,可以检测到微弱信号。(相当于电压表测量电压,如果电压表内阻不够大,外阻较大,则电压表分压较小)。输入高电平为高电平,输入低电平为低电平。但输入电平在外界不输入时容易受到外界电磁和各种玄学干扰的影响。如果按钮采用浮动输入,按键时输入电平较低,但当按键松开时,输入端口悬挂,端口会检测到外部微弱干扰。此时端口可能高,也可能低。
3. 下拉输入
当外部没有输入时,浮空输入状态不确定,可能会干扰电路。为了使电路更稳定,端口的输入数据没有干扰 (例如,触摸电压会发生变化)。此时,需要下拉电阻(或上拉电阻),与端口输入阻抗相比仍然较小。当有输入信号时,端口读取输入信号,。
4. 上拉输入
上拉输入类似于下拉输入,但。比如按键信号,按下时输入低电平,松开时将电平拉到高电平。这样,当按钮松开时,端口电平就不会不确定。也就是说,当你不知道的时候,按下者松开它。
1. 开漏输出
开漏输出即。这种输出方式是指场效应管漏极开路输出。。泄漏电极通过上拉电阻接收电源。当栅极输出为0时,场效应管截止(阻抗无线大),电压分为场效应管,输出为1。当栅极输出为1时,场效应管导通,输出端口相当于接地,此时输出为0。泄漏输出通常由外部电源输出,因此可以实现高于输出端口电压的输出。可以实现电平的转换。,该方法是多个输出连接一个上拉电阻。但漏极开路输出,因为上升边缘是外部电源对上拉电阻和外部负载充电。
2. 推挽输出
。但输出电压无法调整,因为输出高低电平均为三极管输入端电压,由芯片内部供电,无法改变。推拉输出只能在任何时候一路工作。上图显示了输出高电路的正常工作状态。只有三极管导电阻,没有外部电阻。因此,推拉输出。
3. 复用开漏输出
STM32单片机内部还有其他外设,如定时器DAC等等。复用开漏输出与普通开漏输出的区别在于,开漏输出是输出数据寄存器中的数据,。
4. 复用推挽输出
1、首先定义GPIO初始结构类型:GPIO_InitTypeDef GPIO_InitStructure;这种结构的定义是在stm32f10x_gpio.h文件包括三个成员。
/** * @brief GPIO Init structure definition */ typedef struct { uint16_t GPIO_Pin; /*!< Specifies the GPIO pins to be configured. This parameter can be any value of @ref GPIO_pins_define */ GPIOSpeed_TypeDef GPIO_Speed; /*!< Specifies the speed for the selected pins. This parameter can be a value of @ref GPIOSpeed_TypeDef */ GPIOMode_TypeDef GPIO_Mode; /*!< Specifies the operating mode for the selected pins. This parameter can be a value of @ref GPIOMode_TypeDef */ }GPIO_InitTypeDef;
(1)uint16_t GPIO_Pin;来指定GPIO取值见本文件的宏定义,可同时指定一个或多个要配置的引脚;
(2)GPIOSpeed_TypeDef GPIO_Speed;GPIO本项的速度配置参见本文件GPIOSpeed_TypeDef枚举的定义对应三个速度:10MHz、2MHz、50MHz;
/** * @brief Output Maximum frequency selection */ typedef enum { GPIO_Speed_10MHz = 1, GPIO_Speed_2MHz, GPIO_Speed_50MHz }GPIOSpeed_TypeDef;
(3)GPIOMode_TypeDef GPIO_Mode;为GPIO工作模式配置,其值见本文件GPIOMode_TypeDef枚举的定义,STM32 的GPIO共有8种工作模式,分别是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(推挽复用功能)。
/** * @brief Configuration Mode enumeration */ 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;
2、开启APB外设时钟使能,(ARM与C51单片机的区别在于,不需要外设的时候,比如IO口、ADC、为了达到节能的目的,定时器等达到节能的目的,只有使用外设,才能打开时钟。)即调用void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);函数,这个函数在stm32f10x_rcc.c文件中定义的。
3、设置GPIO_InitTypeDef结构体三个成员的值见第一条;
4、调用void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);函数配置GPIO,此函数是在stm32f10x_gpio.c文件中定义的第一个参数代表应该配置哪个组GPIO,取值参见stm32f10x.h文件中的定义,第二个参数是第一步定义的GPIO初始结构类型。
以上四个步骤对STM32 GPIO以下是这四部电影的示例代码:
GPIO_InitTypeDef GPIO_InitStructure; /* GPIOD Periph clock enable */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE); /* Configure PD0 and PD2 in output pushpull mode */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_2; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOD, &GPIO_InitStructure);
完成GPIO可在配置后使用。初学者操作GPIO最常见的是让GPIO控制高输出和低电平LED的亮、灭。