STM32F103学习记录-GPIO初始化结构体各参数讲解

一、结构体定义 

STM32的初始化结构体定义

GPIO_InitTypeDef GPIO_InitStruct;

二、结构体内容

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;

在后面有英文注释,画线的部分双击高亮选中可以通过Ctrl+F进行搜索,可以跳到它的枚举定义

图1.GPIO初始化结构体注释

如 GPIO_Pin的可填入内容如下图

图2.GPIO_Pin可选择变量的定义

GPIO_Pin填入的变量代表着对应的IO引脚。例如,我想要初始化GPIOA的Pin11那么在初始化结构体时就应该填入GPIO_Pin_11。当然引脚也可以同时选择多个,通常直接使用 “ | ”来间隔所选择的多个引脚,例如我希望初始化 Pin3 和 Pin11 那么我应该填入 GPIO_Pin_3 | GPIO_Pin_11。

图3.GPIO_Speed可选择变量的定义

GPIO_Speed填入的变量代表已选择的引脚输入输出时的运行速度,也可以看做低速,中速,高速,正常使用引脚时选择50MHz即可。这个变量的选择主要看实际应用场景,例如我想要输出频率为25MHz的波形,这时若是选择2MHz或是10Mhz都不能满足输出频率的要求,那么我只能选择50MHz。

图4GPIO_Mode可选择变量的定义

GPIO_Mode可填入的变量代表着现在初始化的引脚的输出或是输入模式。

第一个模式GPIO_Mode_AIN是模拟输入模式,我们可以使用它去获取外部输入的模拟电压,通常在ADC、DAC等外设使用。

第二个模式GPIO_Mode_IN_FLOATING是浮空输入模式,这种模式下的引脚在没有外部输入的时候电压的不能确定的,但是一旦遇到高电平或是低电平就会被直接拉至高电平或是低电平。通常会用到这种模式的情况是在ADC、USART的RX功能、外部中断及信号输入等。

第三个模式GPIO_Mode_IPD是下拉输入模式,它十分适合在没有任何输入时需要保持低电平的情况下。通常可以在CAN_RX、按键输入等情况。

第四个模式GPIO_Mode_IPU是上拉模式,同GPIO_Mode_IPU相似,但它是十分适合没有任何输入时需要保持高电平的情况下。通常可以在外部按键输入、防止浮动、提高信号可靠性提高信号可靠性等情况下使用。

第五个模式GPIO_Mode_Out_OD是开漏输出模式,它的特征是仅能输出低电平,若是想要输出高电平需要外接上拉电阻,它十分适合实现多点控制、减少功耗、灵活的硬件设计等情况下使用。

第六个模式GPIO_Mode_Out_PP是推挽输出模式,它是多数情况都适合使用的,例如适用于控制数字电路、驱动能力强于开漏输出、速度可调等情况下使用。

第七个模式GPIO_Mode_AF_OD是复用开漏输出模式,同GPIO_Mode_Out_OD一样,它是仅能输出低电平的类型,但是区别在于在这个模式下它被赋予了外设的功能,就像是ADC、DAC、外部中断等情况。

第八个模式GPIO_Mode_AF_PP是复用推挽输出模式,同GPIO_Mode_Out_PP一样,但是它被赋予了外设的功能,如I2C的SCL、SDA等情况

<think>嗯,用户想了解STM32F103C8T6的GPIO初始化步骤。首先,我需要回忆一下STM32GPIO配置流程。记得STM32GPIO需要通过寄存器来配置模式、速度等参数,或者使用库函数,比如标准外设库或者HAL库。用户可能更倾向于使用库函数,因为寄存器操作比较繁琐,尤其是对于初学者。 接下来,用户可能想知道具体的步骤。首先肯定是时钟使能,因为STM32的外设都需要先开启时钟才能使用。GPIOA到GPIOC的时钟在APB2总线上,所以需要用到RCC_APB2PeriphClockCmd函数。这一步很容易被忽略,导致后续配置无效,所以需要强调。 然后是GPIO初始化结构体配置,包括引脚号、模式、速度。不同的模式对应输入、输出、复用功能等。比如输出推挽、开漏,输入模拟、浮空、上拉下拉等。需要解释每种模式的应用场景,比如输出推挽适合普通输出,开漏可能需要外部上拉,输入上拉可以避免悬空时的噪声。 接下来是调用GPIO_Init函数,将配置写入寄存器。这里需要注意,初始化结构体可能需要先定义并填充参数,再传递给函数。用户可能犯的错误包括选错引脚、模式设置不当,比如输入模式下设置输出速度,虽然可能不影响功能,但最好按规范来。 最后,可能需要配置复用功能,如果GPIO用于外设如USART、SPI等,这时候需要调用GPIO_PinAFConfig函数,但STM32F1和F4的复用功能配置方式不同。F1是通过GPIO_Init结构体中的GPIO_Mode来选择复用推挽或开漏,而F4之后的系列才有明确的复用函数。所以需要确认用户使用的芯片型号是F1,所以这里可能需要说明F1的复用配置方法。 另外,用户可能想看到示例代码,比如如何配置PA1为推挽输出,或者PC13为输入上拉。给出具体的代码片段会更有帮助。同时,提醒用户注意引脚的最大速度配置,虽然大多数情况下默认即可,但高速情况下可能需要调整。 可能还需要提到,使用HAL库的话步骤类似,但函数名和结构体不同,比如HAL_GPIO_Init需要配合__HAL_RCC_GPIOx_CLK_ENABLE来开启时钟。用户可能对库的版本有疑问,所以需要区分标准库和HAL库的不同配置方法。 总结一下,用户的需求是了解初始化流程,包括步骤和关键点,可能需要具体的代码示例和常见问题解答。需要确保回答结构清晰,逐步引导,避免遗漏关键步骤,比如时钟使能,模式选择,以及复用功能的处理。同时,注意使用中文,避免专业术语过多,必要时解释术语,帮助用户更好地理解。</think>好的,我将分步骤为您介绍STM32F103C8T6的GPIO初始化流程: 🔧 **GPIO初始化核心步骤**: 1. **时钟使能**: - STM32所有外设使用前必须开启对应时钟 - GPIOx所在总线:APB2 ```c RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOx, ENABLE); // x对应A/B/C等 ``` 2. **配置GPIO参数**: - 通过`GPIO_InitTypeDef`结构体设置: ```c GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.GPIO_Pin = GPIO_Pin_x; // 选择引脚(如GPIO_Pin_0) GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; // 选择模式 GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; // 输出速度 ``` 3. **模式选择指南**: | 模式类型 | 应用场景 | |---------------------|--------------------------| | GPIO_Mode_AIN | 模拟输入(ADC/DAC) | | 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 | 复用推挽输出 | 4. **速度等级说明**: - GPIO_Speed_10MHz // 低速(低功耗) - GPIO_Speed_2MHz // 中速 - GPIO_Speed_50MHz // 高速(常用) 5. **执行初始化**: ```c GPIO_Init(GPIOx, &GPIO_InitStruct); // x对应GPIO端口 ``` 💡 **典型配置示例**: 1. **LED输出配置(推挽输出)**: ```c // 配置PA1为推挽输出,50MHz RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStruct.GPIO_Pin = GPIO_Pin_1; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStruct); ``` 2. **按键输入配置(上拉输入)**: ```c // 配置PC13为上拉输入 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); GPIO_InitStruct.GPIO_Pin = GPIO_Pin_13; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(GPIOC, &GPIO_InitStruct); ``` ⚠️ **注意事项**: 1. 复用功能配置时需同时使能对应外设时钟 2. 浮空输入模式下引脚不能悬空,否则可能引发干扰 3. 开漏输出需外接上拉电阻才能输出高电平 4. 同一端口不同引脚可配置不同模式 📝 **初始化后操作**: - 输出控制: ```c GPIO_SetBits(GPIOA, GPIO_Pin_1); // 置高 GPIO_ResetBits(GPIOA, GPIO_Pin_1); // 置低 ``` - 输入读取: ```c uint8_t status = GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_13); ``` 建议结合STM32标准外设库使用,不同开发环境(Keil、STM32CubeIDE等)配置方法类似,重点在于正确理解GPIO工作模式的物理特性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值