> 技术文档 > 关于STM32八种输入输出模式详细解析_stm32io口8种模式

关于STM32八种输入输出模式详细解析_stm32io口8种模式


⏩ 大家好哇!我是戈林,一名嵌入式爱好者。
⏩ 非常感谢大家的阅读,如果有不对的地方欢迎指正。
⏩ 加入戈林嵌入式交流群(QQ群号:1054325713),免费获取博主所有资料哦!

八种输入输出模式,共分为四大类:

输入模式浮空输入(Floating Input)上拉输入(Pull-up Input)下拉输入(Pull-down Input)
输出模式推挽输出(Push-pull Output)开漏输出(Open-drain Output)
复用功能模式:复用推挽输出(Alternate Function Push-pull)复用开漏输出(Alternate Function Open-drain)
模拟模式(Analog),模拟输入/输出(Analog)

了解完四大类以后,开始详细解析STM32的八种输入输出模式。


一、输入模式(Input)

  1. 浮空输入(Floating Input)

    • 特点:IO口不接上拉也不接下拉,输入状态完全由外部电路决定,容易受干扰。

    • 应用:外部有明确电平驱动时使用。

  2. 上拉输入(Pull-up Input)

    • 特点:内部接上拉电阻,默认输入高电平,外部拉低时为低。

    • 应用:按键输入、开漏输出读取等。

  3. 下拉输入(Pull-down Input)

    • 特点:内部接下拉电阻,默认输入低电平,外部拉高时为高。

    • 应用:按键输入、开漏输出读取等。


二、输出模式(Output)

  1. 推挽输出(Push-pull Output)

    • 特点:IO口可输出高低电平,驱动能力强,能直接驱动LED等负载。

    • 应用:普通数字输出、LED、继电器等。

  2. 开漏输出(Open-drain Output)

    • 特点:只能输出低电平或高阻态,需外部上拉电阻才能输出高电平。

    • 应用:I2C总线、多个IO口并联输出等。


三、复用功能模式(Alternate Function)

  1. 复用推挽输出(Alternate Function Push-pull)

    • 特点:IO口作为外设(如USART、SPI等)功能输出,推挽结构。

    • 应用:串口、SPI、定时器PWM等外设输出。

  2. 复用开漏输出(Alternate Function Open-drain)

    • 特点:IO口作为外设功能输出,开漏结构,需外部上拉。

    • 应用:I2C总线、部分特殊外设。


四、模拟模式(Analog)

  1. 模拟输入/输出(Analog)

    • 特点:IO口与模拟电路(如ADC、DAC)连接,数字输入输出功能关闭,功耗最低。

    • 应用:ADC采样、DAC输出、未用IO口降功耗。


总结表格

模式编号 中文名称 MODER OTYPER PUPDR(寄存器) 说明/应用 1 浮空输入 00 X 00 外部信号输入 2 上拉输入 00 X 01 按键、信号输入 3 下拉输入 00 X 10 按键、信号输入 4 推挽输出 01 0 XX 普通输出、LED 5 开漏输出 01 1 XX I2C、并联输出 6 复用推挽输出 10 0 XX 外设输出(SPI、USART等) 7 复用开漏输出 10 1 XX I2C、部分外设 8 模拟输入/输出 11 X XX ADC、DAC、未用IO降功耗

说明:X表示该位无关,XX表示该寄存器对该模式无影响。


典型代码示例

// 浮空输入 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //开启GPIOA的时钟 GPIO_InitTypeDef GPIO_InitStructure; //GPIO初始化 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //配置为浮空输入// 上拉输入 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //开启GPIOA的时钟 GPIO_InitTypeDef GPIO_InitStructure; //GPIO初始化 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;  //配置为上拉输入// 下拉输入 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //开启GPIOA的时钟 GPIO_InitTypeDef GPIO_InitStructure; //GPIO初始化 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;  //配置为下拉输入// 推挽输出 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //开启GPIOA的时钟 GPIO_InitTypeDef GPIO_InitStructure; //GPIO初始化 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //配置为推挽输出// 开漏输出 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //开启GPIOA的时钟 GPIO_InitTypeDef GPIO_InitStructure; //GPIO初始化 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; //配置为开漏输出// 复用推挽输出 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //开启GPIOA的时钟 GPIO_InitTypeDef GPIO_InitStructure; //GPIO初始化 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //配置为复用推挽输出// 复用开漏输出 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //开启GPIOA的时钟 GPIO_InitTypeDef GPIO_InitStructure; //GPIO初始化 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD; //配置为复用开漏输出// 模拟输入/输出 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //开启GPIOA的时钟 GPIO_InitTypeDef GPIO_InitStructure; //GPIO初始化 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;  //配置为模拟输入/输出