STM32F103的GPIO 模式区分

本文详细介绍了STM32微控制器中的GPIO输入和输出模式,包括上拉、下拉、浮空输入等,并解释了不同模式的应用场景。同时,还探讨了GPIO口的不同速度等级及其对系统性能的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

四种输入模式:

  • 上拉输入模式(GPIO_Mode_IPU):默认模式下(GPIO没有输入)读取的GPIO引脚数据为1,高电平。
  • 下拉输入模式(GPIO_Mode_IPD):默认模式下(GPIO没有输入)读取的GPIO引脚数据为0,低电平。
  • 浮空输入模式(GPIO_Mode_IN_FLOATING):既没有上拉也没有下拉,引脚电压为不确定值。(主要用于来做 I2C,USART的接收端)
  • 模拟输入模式(GPIO_Mode_AIN):关闭了斯密特触发器,不接上拉下拉电阻,经由另一个线路把电压信号传送到片上外设模块。(主要用于ADC外设的时候)

四种输出模式:

  • 推挽输出模式(GPIO_Mode_Out_PP):输出 0 时,N-MOS 导通,P-MOS 不被激活,输出0。输出 1 时,N-MOS 高阻, P-MOS 不被激活,输出1(需要外部上拉电路);此模式可以把端口作为双向IO使用。适用于输出电平为0或3.3V的场合。(可以输出高,低电平,连接数字器件)
  • 开漏输出模式(GPIO_Mode_Out_OD):输出 0 时,N-MOS 导通,P-MOS 高阻 ,输出0。输出 1 时,N-MOS 高阻,P-MOS 导通,输出1(不需要外部上拉电路)。适用于电平不匹配的场合,输出端相当于三极管的集电极. 要得到高电平状态需要上拉电阻才行. 适合于做电流型的驱动,其吸收电流的能力相对强(一般20ma以内)。(具有线与功能)
  • 复用推挽输出模式(GPIO_Mode_AF_PP):复用模式,
  • 复用开漏输出模式(GPIO_Mode_AF_OD):复用模式,

GPIO口时钟:

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

注释:

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

关键是GPIO的引脚速度跟应用匹配(推荐10倍以上?)。比如:
1. 对于串口,假如最大波特率只需115.2k,那么用2M的GPIO的引脚速度就够了,既省电也噪声小。
2. 对于I2C接口,假如使用400k波特率,若想把余量留大些,那么用2M的GPIO的引脚速度或许不够,这时可以选用10M的GPIO引脚速度。
3. 对于SPI接口,假如使用18M或9M波特率,用10M的GPIO的引脚速度显然不够了,需要选用50M的GPIO的引脚速度。
4.GPIO口设为输入时,输出驱动电路与端口是断开,所以输出速度配置无意义。
1.3

注释:

1. 在复位期间和刚复位后,复用功能未开启,I/O端口被配置成浮空输入模式。
2. 所有端口都有外部中断能力。为了使用外部中断线,端口必须配置成输入模式。
3. GPIO口的配置具有上锁功能,当配置好GPIO口后,可以通过程序锁住配置组合,直到下次芯片复位才能解锁。

 

总结:在STM32中选用IO模式
(1) 浮空输入_IN_FLOATING ——浮空输入,可以做KEY识别,RX1
(2)带上拉输入_IPU——IO内部上拉电阻输入
(3)带下拉输入_IPD—— IO内部下拉电阻输入 
(4) 模拟输入_AIN ——应用ADC模拟输入,或者低功耗下省电
(5)开漏输出_OUT_OD ——IO输出0接GND,IO输出1,悬空,需要外接上拉电阻,才能实现输出高电平。当输出为1时,IO口的状态由上拉电阻拉高电平,但由于是开漏输出模式,这样IO口也就可以由外部电路改变为低电平或不变 。可以读IO输入电平变化,实现C51的IO双向功能
(6)推挽输出_OUT_PP ——IO输出0-接GND, IO输出1 -接VCC,读输入值是未知的
(7)复用功能的推挽输出_AF_PP ——片内外设功能(I2C的SCL,SDA)
(8)复用功能的开漏输出_AF_OD——片内外设功能(TX1,MOSI,MISO.SCK.SS)

实例总结:

(1)模拟I2C使用开漏输出_OUT_OD,接上拉电阻,能够正确输出0和1;读值时先
GPIO_SetBits(GPIOB, GPIO_Pin_0);拉高,然后可以读IO的值;使用
GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0);

(2)如果是无上拉电阻,IO默认是高电平;需要读取IO的值,可以使用
带上拉输入_IPU和浮空输入_IN_FLOATING和 开漏输出_OUT_OD;

4、IO低功耗:

关于模拟输入&低功耗,根据STM32的低功耗AN(AN2629)及其源文件,在STOP模式下,为了得到尽量低的功耗,确实把所有的IO(包括非A/D输入的GPIO)都设置为模拟输入

5、程序

(1)时钟:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB |
RCC_APB2Periph_GPIOC, ENABLE);

(2)IO配置:
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; // IR 输入
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;

GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_15; 
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);

(3)输出输入:

输出0:GPIO_ResetBits(GPIOB, GPIO_Pin_0)
输出1:GPIO_SetBits(GPIOB, GPIO_Pin_0)
输入: GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_7)

<think>好的,我现在需要回答用户关于STM32F103待机模式的使用注意事项最佳实践的问题。首先,我要回顾一下用户提供的引用内容,看看有没有相关的信息可以利用。 引用[1]提到STM32F103的RTC模块可以作为闹钟唤醒待机模式的示例,说明RTC闹钟是唤醒待机模式的一种常用方法。同时,项目地址里的代码可能涉及配置RTC的部分,需要注意RTC的初始化闹钟设置是否正确。 引用[2]中讲到进入停止模式后,唤醒时需要手动调用SystemInit函数来重新配置时钟,因为高速时钟会被关闭。但待机模式唤醒后不需要手动处理,因为系统会重新启动,类似于复位。这可能意味着待机模式唤醒后需要重新初始化外设,而之前的上下文不会保留。这一点需要作为注意事项提到。 引用[3]提到PDDS位的设置,用于区分停机模式待机模式。设置PDDS为1时进入待机模式,所以需要确保在代码中正确配置了这个位。此外,可能还涉及到电源控制寄存器(PWR)的设置,需要检查相关寄存器的配置是否正确。 接下来,我需要结合自己的知识补充其他注意事项。例如,待机模式下大部分电源都会被关闭,包括SRAM寄存器的内容,因此唤醒后程序会从头开始执行,类似于复位。这意味着在进入待机模式前需要保存必要的数据到备份寄存器或Flash中,因为SRAM中的数据会丢失。备份寄存器由VBAT供电,所以在使用备份寄存器时要确保VBAT有电源供应。 另外,待机模式的唤醒源除了RTC闹钟,还有WKUP引脚上升沿、NRST引脚复位IWDG复位等。需要根据应用需求配置正确的唤醒源,并确保这些信号能够正确触发唤醒。 在最佳实践方面,应尽量减少进入待机模式前的功耗,比如关闭所有外设的时钟IO口配置为模拟输入模式以减少漏电流。此外,唤醒后的系统时钟需要重新配置,可能需要重新初始化系统时钟树,确保主频正确。 还需要注意,待机模式下的最低功耗状态会导致调试接口失效,因此在调试时需要避免频繁进入待机模式,或者使用特定的唤醒策略来保持调试能力。 最后,需要验证代码的正确性,例如通过测量电流确认是否成功进入待机模式,检查唤醒后的程序执行是否正常,以及数据恢复是否正确。这些步骤都是确保待机模式可靠使用的关键。</think>### STM32F103待机模式使用注意事项与最佳实践 #### 一、核心注意事项 1. **状态丢失与系统重启** 进入待机模式后,所有SRAM、寄存器状态均会丢失,唤醒后**系统执行完整复位流程**[^3]。需通过备份寄存器(Backup Register)或Flash存储关键数据,且**VBAT引脚必须供电**以维持备份域数据[^2]。 2. **唤醒源配置** 仅支持以下唤醒源: - **WKUP引脚上升沿**(需使能PWR_WakeUpPinCmd) - **RTC闹钟事件**(需配置RTC_Alarm并启用RTC时钟) - **NRST引脚外部复位** - **独立看门狗(IWDG)复位** **错误示例**:未启用RTC时钟直接配置闹钟会导致唤醒失败。 3. **电源控制寄存器配置** 必须正确设置PDDS位为1(待机模式标志),同时设置CWUF位清除唤醒标志: ```c PWR_WakeUpPinCmd(ENABLE); // 启用WKUP引脚 PWR_ClearFlag(PWR_FLAG_WU); // 清除唤醒标志 PWR_EnterSTANDBYMode(); // PDDS=1 + SLEEPDEEP=1 ``` #### 二、最佳实践指南 1. **低功耗预处理** - **关闭所有外设时钟**(包括GPIO设置为模拟输入模式) ```c RCC_APB2PeriphClockCmd(0xFFFF, DISABLE); // 关闭APB2总线外设 RCC_APB1PeriphClockCmd(0xFFFF, DISABLE); // 关闭APB1总线外设 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; // GPIO设为模拟输入 ``` - **切断未使用电源域**(通过PWR_VDDAnalogCmd控制模拟电路电源) 2. **RTC闹钟配置流程** ```c RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); PWR_BackupAccessCmd(ENABLE); // 允许访问备份域 RTC_SetAlarm(RTC_GetCounter() + 3600); // 设置1小时后唤醒 RTC_ITConfig(RTC_IT_ALR, ENABLE); // 启用RTC闹钟中断 ``` 3. **唤醒后系统初始化** 待机模式唤醒后**系统时钟恢复为默认HSI 8MHz**,需重新配置时钟树: ```c SystemInit(); // 重置时钟系统 RCC_HSEConfig(RCC_HSE_ON); while(!RCC_WaitForHSEStartUp()); // 等待HSE稳定 ``` #### 三、调试技巧 1. **电流监测法** 使用万用表测量**VBAT引脚电流**,正常待机模式下电流应低于2μA(未启用RTC时为1.3μA)[^1]。 2. **唤醒源诊断** 在复位处理函数中添加标志检测: ```c if(PWR_GetFlagStatus(PWR_FLAG_SB) != RESET) { // 待机模式唤醒 PWR_ClearFlag(PWR_FLAG_SB); } ``` 相关问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值