STM32(一)简介、GPIO

1.1 简介

1.1.1 芯片型号

1.1.2 引脚

从芯片上的小圆点开始逆时针从1开始编号。

1.1.3 IO速度

有3种速度可以选择,使用时选择满足要求的最低速度即可。

1.2 GPIO

STM32芯片的架构大致如下:

GPIO属于片上外设,它有4组(参见引脚图):

  • GPIOA:PA1 ~ PA15
  • GPIOB:PB1 ~ PB15
  • GPIOC:PC13 ~ PC15
  • GPIOD:PD0 ~ PD1

其中每一个GPIO的结构如下:

每一个GPIO都有8种工作模式,下面分别介绍。

1.2.1 输出模式

对应上面结构图的下半部分。

MOS管相关内容可以参考数电MOS管章节

  • 推挽:两个MOS管交替导通,输出高电平低电平

  • 开漏:上面的PMOS保持断开(漏极开路),输出低电平高阻

  • 通用:CPU控制。

  • 复用:其他外设控制。

1.2.2 输入模式

对应上面结构图的上半部分,简化成如下电路。

  • 输入上拉:使用上拉电阻(上拉电阻处的开关闭合),提供默认高电压。
  • 输入下拉:使用下拉电阻,提供默认低电压。
  • 输入浮空:都不使用,默认悬空。
  • 模拟模式:先不管。

1.2.3 编程接口

编程接口 功能
GPIO_Init 初始化IO引脚
GPIO_WriteBit 向输出数据寄存器写1个比特位
GPIO_ReadInputDataBit 从输入数据寄存器读1个比特位
GPIO_ReadOutputDataBit 从输出数据寄存器读1个比特位
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);
void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

GPIO的8种模式:

1.3 实验

1.3.1 LED闪灯实验

开发板的PC13引脚连了一个LED,其电路如下,需要使用开漏模式,置1为高阻,LED灭,置0低电平点亮。

代码如下:

#include "stm32f10x.h"
#include "delay.h"

int main(void)
{
    // 1. 开启GPIOC的时钟(这一步必须要有,后面章节会讲,先有个印象)
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
    
    // 2. 初始化IO引脚,PC13 通用输出开漏模式 2MHz
    GPIO_InitTypeDef GPIO_InitStruct = {0};	// 不赋0也没问题,老师说为了避免奇怪的问题
    
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_13;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_OD;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz;
    
    GPIO_Init(GPIOC, &GPIO_InitStruct);
    
    // 3. 为输出寄存器赋值
    while(1)
    {
        // 置1,高阻,灭
        GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_SET);
        Delay(1000);
        // 置0,低电平,亮
        GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_RESET);   
        Delay(1000);
    }
}

1.3.2 按钮实验

  • PA0输出用于控制LED,推挽模式,写1亮。
  • PA1输入用于读取按键状态,上拉模式,按键接地,按键按下为0(Bit_RESET),默认为1(Bit_SET)。

接线如下图:

#include "stm32f10x.h"

int main(void)
{
    // 1. 开启GPIOA的时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    
    // 2. 初始化IO引脚
    // PA0 通用输出推挽模式 2MHz
    GPIO_InitTypeDef GPIO_InitStruct;
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz;
    GPIO_Init(GPIOA, &GPIO_InitStruct);
    
    // PA1 通用输入上拉模式 2MHz
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_1;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;
    GPIO_Init(GPIOA, &GPIO_InitStruct);
    
    // 3. 循环读取PA1的状态,控制PA0的输出
    while(1) {
        // PA1 = 0,按下按钮,PA0写1,LED亮
        if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1) == Bit_RESET) {
            GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_SET);
        }
        // PA1 = 1,松开按钮,PA0写0,LED灭
        else {
            GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_RESET);
        }
    }
}

STM32(一)简介、GPIO
https://shuusui.site/blog/2026/04/21/hardware/stm32-1/
作者
Shuusui
发布于
2026年4月21日
许可协议